20 #ifndef __TPIE_PIPELINING_MAP_H__
21 #define __TPIE_PIPELINING_MAP_H__
23 #include <tpie/pipelining/node.h>
24 #include <tpie/pipelining/pipe_base.h>
25 #include <tpie/pipelining/factory_helpers.h>
26 #include <tpie/pipelining/node_name.h>
27 #include <type_traits>
35 template <
typename C,
typename R,
typename A>
37 typedef A argument_type;
38 typedef R return_type;
41 template <
typename C,
typename R,
typename A>
43 typedef A argument_type;
44 typedef R return_type;
47 template <
typename R,
typename A>
49 typedef A argument_type;
50 typedef R return_type;
56 template <
typename dest_t,
typename F>
62 typedef typename std::decay<typename unary_traits<F>::argument_type>::type item_type;
64 map_t(dest_t dest,
const F & functor):
65 functor(functor), dest(std::move(dest)) {
66 set_name(bits::extract_pipe_name(
typeid(F).name()), PRIORITY_NO_NAME);
69 void push(
const item_type & item) {
70 dest.push(functor(item));
74 template <
typename dest_t,
typename F>
81 functor(functor), dest(std::move(dest)) {
82 set_name(bits::extract_pipe_name(
typeid(F).name()), PRIORITY_NO_NAME);
86 void push(
const T & item) {
87 dest.push(functor(item));
96 typedef typename std::decay<typename unary_traits<F>::argument_type>::type item_type;
100 set_name(bits::extract_pipe_name(
typeid(F).name()), PRIORITY_NO_NAME);
103 void push(
const item_type & item) {
108 template <
typename src_t,
typename F>
115 functor(functor), src(std::move(src)) {
116 set_name(bits::extract_pipe_name(
typeid(F).name()), PRIORITY_NO_NAME);
120 return functor(src.pull());
124 return src.can_pull();
129 template <
typename T>
138 template <
typename C>
139 static yes& test(decltype(&C::operator()) *);
142 static no& test(...);
143 static const bool value =
sizeof(test<T>(
nullptr)) ==
sizeof(yes);
153 template <typename F, typename = typename std::enable_if<bits::has_argument_type<F>::value>::type>
158 template <typename F, typename = typename std::enable_if<!bits::has_argument_type<F>::value>::type>
159 pipe_middle<tfactory<bits::map_temp_t, Args<F>, F> >
map(
const F & functor) {
163 template <
typename F>
164 pipe_end<termfactory<bits::map_sink_t<F>, F> > map_sink(
const F & functor) {
168 template <
typename F>
169 pullpipe_middle<tfactory<bits::pull_map_t, Args<F>, F>> pull_map(
const F & functor) {
175 #endif //__TPIE_PIPELINING_MAP_H__