diff options
author | Don Bright <hugh.m.bright@gmail.com> | 2011-11-26 18:17:54 (GMT) |
---|---|---|
committer | Don Bright <hugh.m.bright@gmail.com> | 2011-11-26 18:17:54 (GMT) |
commit | 8197294d4c30d533c88ef2901e298d2b2863aa87 (patch) | |
tree | 7f26004c4b4d1ae12970913ea4d0201be5c50088 /src | |
parent | 2bd48629ef8482a957f7db0921a3b3c7fdc458e1 (diff) | |
parent | 14b4ed4b5baa0efa7eea90322faca4fecfbfa294 (diff) |
Merge branch 'cakebaby' of github.com:donbright/openscad into cakebaby
Conflicts:
tests/CMakeLists.txt
Diffstat (limited to 'src')
-rw-r--r-- | src/cgal.h | 5 | ||||
-rw-r--r-- | src/traverser.cc | 47 | ||||
-rw-r--r-- | src/traverser.h | 2 | ||||
-rw-r--r-- | src/value.cc | 13 |
4 files changed, 44 insertions, 23 deletions
@@ -11,6 +11,11 @@ using boost::intmax_t; using boost::uintmax_t; #endif +#include <CGAL/version.h> +#if CGAL_VERSION_NR < 1030601000 + #error CGAL >= 3.6 is required! +#endif + #include <CGAL/Gmpq.h> #include <CGAL/Extended_cartesian.h> #include <CGAL/Nef_polyhedron_2.h> diff --git a/src/traverser.cc b/src/traverser.cc index a87449b..d9b3dc1 100644 --- a/src/traverser.cc +++ b/src/traverser.cc @@ -3,6 +3,7 @@ #include "node.h" #include "state.h" #include <algorithm> +#include <boost/foreach.hpp> void Traverser::execute() { @@ -10,35 +11,37 @@ void Traverser::execute() traverse(this->root, state); } -struct TraverseNode +Response Traverser::traverse(const AbstractNode &node, const State &state) { - Traverser *traverser; - const State &state; - TraverseNode(Traverser *traverser, const State &state) : - traverser(traverser), state(state) {} - void operator()(const AbstractNode *node) { traverser->traverse(*node, state); } -}; - -void Traverser::traverse(const AbstractNode &node, const State &state) -{ - // FIXME: Handle abort - State newstate = state; newstate.setNumChildren(node.getChildren().size()); + Response response; if (traversaltype == PREFIX || traversaltype == PRE_AND_POSTFIX) { newstate.setPrefix(true); newstate.setParent(state.parent()); - node.accept(newstate, this->visitor); + response = node.accept(newstate, this->visitor); } - - newstate.setParent(&node); - std::for_each(node.getChildren().begin(), node.getChildren().end(), TraverseNode(this, newstate)); - - if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) { - newstate.setParent(state.parent()); - newstate.setPrefix(false); - newstate.setPostfix(true); - node.accept(newstate, this->visitor); + + // Pruned traversals mean don't traverse children + if (response == ContinueTraversal) { + newstate.setParent(&node); + BOOST_FOREACH(const AbstractNode *chnode, node.getChildren()) { + response = this->traverse(*chnode, newstate); + if (response == AbortTraversal) return response; // Abort immediately + } } + + // Postfix is executed for all non-aborted traversals + if (response != AbortTraversal) { + if (traversaltype == POSTFIX || traversaltype == PRE_AND_POSTFIX) { + newstate.setParent(state.parent()); + newstate.setPrefix(false); + newstate.setPostfix(true); + response = node.accept(newstate, this->visitor); + } + } + + if (response != AbortTraversal) response = ContinueTraversal; + return response; } diff --git a/src/traverser.h b/src/traverser.h index 85373cc..73078e7 100644 --- a/src/traverser.h +++ b/src/traverser.h @@ -15,7 +15,7 @@ public: void execute(); // FIXME: reverse parameters - void traverse(const AbstractNode &node, const class State &state); + Response traverse(const AbstractNode &node, const class State &state); private: Visitor &visitor; diff --git a/src/value.cc b/src/value.cc index ab78c2a..5ea766c 100644 --- a/src/value.cc +++ b/src/value.cc @@ -363,7 +363,20 @@ std::string Value::toString() const << ']'; break; case NUMBER: +#ifdef OPENSCAD_TESTING + // Quick and dirty hack to work around floating point rounding differences + // across platforms for testing purposes. + { + std::stringstream tmp; + tmp.precision(16); + tmp << this->num; + std::string tmpstr = tmp.str(); + if (tmpstr.size() > 16) tmpstr.erase(16); + stream << tmpstr; + } +#else stream << this->num; +#endif break; case BOOL: stream << (this->b ? "true" : "false"); |