20 #ifndef __TPIE_PIPELINING_FACTORY_HELPERS_H__
21 #define __TPIE_PIPELINING_FACTORY_HELPERS_H__
23 #include <tpie/pipelining/container.h>
24 #include <tpie/pipelining/factory_base.h>
25 #include <tpie/pipelining/node.h>
28 namespace pipelining {
34 template <
template <
typename dest_t>
class R,
typename... T>
42 template <
typename...
Args>
43 factory(
Args && ... v) : cont(std::forward<Args>(v)...) {}
45 template<
typename dest_t>
47 typedef R<typename bits::remove<dest_t>::type> type;
50 template <
typename dest_t>
51 typename constructed<dest_t>::type construct(dest_t && dest) {
53 typename constructed<dest_t>::type r = container_construct<typename constructed<dest_t>::type>(cont, std::forward<dest_t>(dest));
56 this->add_node_set_edges(r);
60 template <
typename dest_t>
61 typename constructed<dest_t>::type construct_copy(dest_t && dest) {
63 typename constructed<dest_t>::type r = container_construct_copy<typename constructed<dest_t>::type>(cont, std::forward<dest_t>(dest));
66 this->add_node_set_edges(r);
78 template <
typename Holder,
typename... T>
86 template <
typename...
Args>
89 template<
typename dest_t>
91 typedef typename Holder::template type<typename bits::remove<dest_t>::type> type;
94 template <
typename dest_t>
95 typename constructed<dest_t>::type construct(dest_t && dest) {
97 typename constructed<dest_t>::type r = container_construct<typename constructed<dest_t>::type>(cont, std::forward<dest_t>(dest));
100 this->add_node_set_edges(r);
104 template <
typename dest_t>
105 typename constructed<dest_t>::type construct_copy(dest_t && dest) {
107 typename constructed<dest_t>::type r = container_construct_copy<typename constructed<dest_t>::type>(cont, std::forward<dest_t>(dest));
110 this->add_node_set_edges(r);
114 container<T...> cont;
121 template <
typename R,
typename... T>
124 typedef R constructed_type;
131 template<
typename...
Args>
135 R r = container_construct<R>(cont);
137 this->add_node_set_edges(r);
142 R r = container_construct_copy<R>(cont);
144 this->add_node_set_edges(r);
152 template <
typename ...>
159 template <
template <
typename dest_t,
typename ... X>
class R, typename
Args, typename... T>
162 template <
template <
typename dest_t,
typename ... X>
class R,
163 typename ...TT, typename... T>
171 template<
typename...
Args>
172 tfactory(
Args && ... v) : cont(std::forward<Args>(v)...) {}
174 template<
typename dest_t>
176 typedef R<typename bits::remove<dest_t>::type, TT...> type;
179 template <
typename dest_t>
180 typename constructed<dest_t>::type construct(dest_t && dest) {
182 typename constructed<dest_t>::type r = container_construct<typename constructed<dest_t>::type>(cont, std::forward<dest_t>(dest));
184 this->add_default_edge(r, tok);
185 this->add_node_set_edges(r);
189 template <
typename dest_t>
190 typename constructed<dest_t>::type construct_copy(dest_t && dest) {
192 typename constructed<dest_t>::type r = container_construct_copy<typename constructed<dest_t>::type>(cont, std::forward<dest_t>(dest));
194 this->add_default_edge(r, tok);
195 this->add_node_set_edges(r);
199 container<T...> cont;
211 template <
template <
typename item_type>
class I,
typename OB,
template<
typename dest_t>
class O>
214 template <
typename dest_t>
217 typedef I<item_type> type;
220 template <
typename dest_t>
221 typename constructed<dest_t>::type construct(dest_t && dest)
const {
224 std::shared_ptr<OB> o = std::make_shared<O<dest_t> >(std::forward<dest_t>(dest), input_token);
225 return I<item_type>(input_token, std::move(o));
228 template <
typename dest_t>
229 typename constructed<dest_t>::type construct_copy(dest_t && dest)
const {
230 return construct(std::forward<dest_t>(dest));
237 #endif // __TPIE_PIPELINING_FACTORY_HELPERS_H__
void add_default_edge(node &r, const node &dest) const
Used by pipe_base classes to set a default actor edge for ordinary push/pull nodes.
Base class of all pipelining factories.
void init_node(node &r)
Initialize node constructed in a subclass.
Class to deduce the item_type of a node of type T.
Node factory for variadic argument templated generators.
Node factory for variadic argument terminators.
pipe_middle< tempfactory< bits::item_type_t< T > > > item_type()
Create item type defining identity pipe node.
Node factory for variadic argument generators.
Node factory for variadic argument terminators.
Node factory for split nodes, typically used for phase boundary nodes.