diff options
| author | don bright <hugh.m.bright@gmail.com> | 2011-11-26 17:11:55 (GMT) | 
|---|---|---|
| committer | don bright <hugh.m.bright@gmail.com> | 2011-11-26 17:11:55 (GMT) | 
| commit | 14b4ed4b5baa0efa7eea90322faca4fecfbfa294 (patch) | |
| tree | 89a983e6d631c2b43a6dd1f0fa25c8bd3969ff41 /src | |
| parent | c2fb5d3650ffaa42c68e02891168c711d3b5f079 (diff) | |
| parent | 7678f0f08305ecbc9d6f137f9deb19c60c904346 (diff) | |
Merge remote-tracking branch 'upstream/master' into cakebaby
and tweak tests for win32 run
Conflicts:
	tests/test_cmdline_tool.py
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");  | 
