summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cgal.h5
-rw-r--r--src/traverser.cc47
-rw-r--r--src/traverser.h2
-rw-r--r--src/value.cc13
4 files changed, 44 insertions, 23 deletions
diff --git a/src/cgal.h b/src/cgal.h
index 26d64ae..669e5b1 100644
--- a/src/cgal.h
+++ b/src/cgal.h
@@ -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");
contact: Jan Huwald // Impressum