29 #if !defined(EXPRESSION_TREE_H)
30 #define EXPRESSION_TREE_H
36 namespace expression_tree
39 template<
typename T,
template<
typename,
typename>
class CachingPolicy,
class ThreadingPolicy>
51 typedef typename std::function<T (const T&, const T&)>
t;
60 template<
typename T,
template<
typename,
typename>
class C,
class E>
78 template<
typename T,
template<
typename,
typename>
class C,
class E>
98 virtual std::unique_ptr<node_impl<T>>
clone()
const = 0;
125 leaf(
const T& value) : value(value) {}
133 virtual std::unique_ptr<node_impl<T>>
clone()
const
135 return std::unique_ptr<leaf<T>>(
new leaf<T>(*this));
171 virtual std::unique_ptr<node_impl<T>> clone()
const
173 return std::unique_ptr<leaf<T*>>(
new leaf<T*>(*this));
177 virtual bool constant()
const
183 virtual T evaluate()
const
193 template<
typename T,
template<
typename,
typename>
class CachingPolicy,
class ThreadingPolicy>
214 virtual std::unique_ptr<node_impl<T>>
clone()
const
222 return l.constant() &&
r.constant();
228 return ThreadingPolicy::evaluate(
f,
l,
r);
253 template<
typename T,
class ThreadingPolicy>
260 template<
typename T,
template<
typename,
typename>
class CachingPolicy =
no_caching,
class ThreadingPolicy = sequential>
263 std::unique_ptr<detail::node_impl<T>> impl;
280 impl = other.impl->clone();
281 parent = other.parent;
349 return dynamic_cast<typename CachingPolicy<T, ThreadingPolicy>::branch*
>(impl.get())->
left();
357 return dynamic_cast<typename CachingPolicy<T, ThreadingPolicy>::branch*
>(impl.get())->
right();
363 return impl ? impl->constant() :
false;
369 return impl->evaluate();
377 dynamic_cast<typename CachingPolicy<T, ThreadingPolicy>::branch*
>(impl.get())->
grow();
387 template<
typename T,
class ThreadingPolicy>
409 template<
typename T,
class ThreadingPolicy>
441 if(cached)
return value;
443 value = ThreadingPolicy::evaluate(
f,
l,
r);
462 template<
typename T,
class ThreadingPolicy>
492 if(cached)
return value;
494 return value = ThreadingPolicy::evaluate(
f,
l,
r);
505 value = ThreadingPolicy::evaluate(
f,
l,
r);
526 template<
typename T,
template<
typename,
typename>
class CachingPolicy =
no_caching,
class ThreadingPolicy = sequential>
527 class tree :
public node<T, CachingPolicy, ThreadingPolicy>