TPIE

11a2c2d
reverse.h
1 // -*- mode: c++; tab-width: 4; indent-tabs-mode: t; eval: (progn (c-set-style "stroustrup") (c-set-offset 'innamespace 0)); -*-
2 // vi:set ts=4 sts=4 sw=4 noet :
3 // Copyright 2011, 2012, The TPIE development team
4 //
5 // This file is part of TPIE.
6 //
7 // TPIE is free software: you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License as published by the
9 // Free Software Foundation, either version 3 of the License, or (at your
10 // option) any later version.
11 //
12 // TPIE is distributed in the hope that it will be useful, but WITHOUT ANY
13 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 // License for more details.
16 //
17 // You should have received a copy of the GNU Lesser General Public License
18 // along with TPIE. If not, see <http://www.gnu.org/licenses/>
19 
20 #ifndef __TPIE_PIPELINING_REVERSE_H__
21 #define __TPIE_PIPELINING_REVERSE_H__
22 
23 #include <tpie/pipelining/node.h>
24 #include <tpie/pipelining/pipe_base.h>
25 #include <tpie/pipelining/factory_helpers.h>
26 #include <tpie/stack.h>
27 #include <stack>
28 
29 namespace tpie::pipelining {
30 namespace bits {
31 
35 template <typename T>
36 class reverser_input_t: public node {
37 public:
38  typedef T item_type;
39 
40  reverser_input_t(const node_token & token, std::shared_ptr<node> output=std::shared_ptr<node>())
41  : node(token), m_output(output)
42  {
43  set_name("Store items", PRIORITY_SIGNIFICANT);
46  set_plot_options(PLOT_BUFFERED | PLOT_SIMPLIFIED_HIDE);
47  }
48 
49  void begin() override {
50  m_stack.construct();
51  }
52 
56  void push(const item_type & t) {
57  m_stack->push(t);
58  }
59 
60  void end() override {
61  forward("stack", &m_stack, 1);
62  }
63 private:
65  std::shared_ptr<node> m_output;
66 };
67 
71 
72 template <typename T>
74 public:
75  typedef T item_type;
76 
77  internal_reverser_input_t(const node_token & token, std::shared_ptr<node> output=std::shared_ptr<node>())
78  : node(token), m_output(output)
79  {
80  set_name("Store items", PRIORITY_SIGNIFICANT);
81  set_minimum_memory(sizeof(std::stack<item_type>));
82  set_plot_options(PLOT_BUFFERED | PLOT_SIMPLIFIED_HIDE);
83  }
84 
85  void propagate() override {
86  m_stack = tpie_new<std::stack<item_type> >();
87  forward("stack", m_stack, 1);
88  }
89 
93  void push(const item_type & t) {
94  m_stack->push(t);
95  }
96 private:
97  std::stack<item_type> * m_stack;
98  std::shared_ptr<node> m_output;
99 };
100 
104 template <typename dest_t>
105 class reverser_output_t: public node {
106 public:
107  typedef typename push_type<dest_t>::type item_type;
108 
109  reverser_output_t(dest_t dest, const node_token & input_token)
110  : dest(std::move(dest))
111  {
112  add_dependency(input_token);
113  add_push_destination(this->dest);
114  set_name("Output reversed", PRIORITY_INSIGNIFICANT);
115  set_minimum_memory(this->m_stack->memory_usage());
116  set_minimum_resource_usage(FILES, 1);
117  set_plot_options(PLOT_BUFFERED);
118  }
119 
120  void propagate() override {
121  m_stack_ptr = fetch<tpie::maybe<stack<item_type> > *>("stack");
122  m_stack = &**m_stack_ptr;
123  forward("items", m_stack->size());
124  set_steps(m_stack->size());
125  }
126 
127  void go() override {
128  while (!m_stack->empty()) {
129  dest.push(m_stack->pop());
130  step();
131  }
132  }
133 
134  void end() override {
135  m_stack_ptr->destruct();
136  }
137 private:
138  dest_t dest;
139  tpie::maybe<stack<item_type> > * m_stack_ptr;
140  stack<item_type> * m_stack;
141 };
142 
146 template <typename dest_t>
148 public:
149  typedef typename push_type<dest_t>::type item_type;
150 
151  internal_reverser_output_t(dest_t dest, const node_token & input_token)
152  : dest(std::move(dest))
153  {
154  add_dependency(input_token);
155  add_push_destination(this->dest);
156  set_name("Output reversed", PRIORITY_INSIGNIFICANT);
157  set_minimum_memory(sizeof(std::stack<item_type>));
158  set_plot_options(PLOT_BUFFERED);
159  }
160 
161  void propagate() override {
162  m_stack = fetch<std::stack<item_type> *>("stack");
163  forward("items", m_stack->size());
164  set_steps(m_stack->size());
165  }
166 
167  void go() override {
168  while (!m_stack->empty()) {
169  dest.push(m_stack->pop());
170  step();
171  }
172  }
173 
174  void end() override {
175  tpie_delete(m_stack);
176  }
177 private:
178  dest_t dest;
179  std::stack<item_type> * m_stack;
180 };
181 
185 template <typename T>
186 class reverser_pull_output_t : public node {
187 public:
188  typedef T item_type;
189 
190  reverser_pull_output_t(const node_token & input_token) {
191  add_dependency(input_token);
192  set_name("Input items to reverse", PRIORITY_INSIGNIFICANT);
194  set_plot_options(PLOT_BUFFERED);
195  }
196 
197  void propagate() override {
198  m_stack_ptr = fetch<tpie::maybe<stack<item_type> > *>("stack");
199  m_stack = &**m_stack_ptr;
200  forward("items", m_stack->size());
201  }
202 
206  bool can_pull() const {
207  return !m_stack->empty();
208  }
209 
213  T pull() {
214  return m_stack->pop();
215  }
216 
217  void end() override {
218  m_stack_ptr->destruct();
219  }
220 private:
221  tpie::maybe<stack<item_type> > * m_stack_ptr;
222  stack<item_type> * m_stack;
223 };
224 
228 template <typename T>
230 public:
231  typedef T item_type;
232 
233  internal_reverser_pull_output_t(const node_token & input_token) {
234  add_dependency(input_token);
235  set_name("Input items to reverse", PRIORITY_INSIGNIFICANT);
236  set_minimum_memory(sizeof(std::stack<item_type>));
237  set_plot_options(PLOT_BUFFERED);
238  }
239 
240  void propagate() override {
241  m_stack = fetch<std::stack<item_type> *>("stack");
242  forward("items", m_stack->size());
243  }
244 
248  bool can_pull() const {
249  return !m_stack->empty();
250  }
251 
255  T pull() {
256  T r = m_stack->top();
257  m_stack->pop();
258  return r;
259  }
260 
261  void end() override {
262  tpie_delete(m_stack);
263  }
264 private:
265  std::stack<item_type> * m_stack;
266 };
267 
268 } // namespace bits
269 
274 template <typename T>
276 public:
277  typedef T item_type;
280 private:
285 public:
286  passive_reverser() {}
287 
288  input_t raw_input() {
289  return input_t(input_token);
290  }
291 
292  output_t raw_output() {
293  return output_t(input_token);
294  }
295 
300  return inputfact_t(input_token);
301  }
302 
307  return outputfact_t(input_token);
308  }
309 private:
310  node_token input_token;
311 
313  passive_reverser & operator=(const passive_reverser &);
314 };
315 
316 
321 template <typename T>
323 public:
324  typedef T item_type;
327 private:
332 public:
334 
335  input_t raw_input() {
336  return input_t(input_token);
337  }
338 
339  output_t raw_output() {
340  return output_t(input_token);
341  }
342 
347  return inputfact_t(input_token);
348  }
349 
354  return outputfact_t(input_token);
355  }
356 private:
357  node_token input_token;
358 
361 };
362 
368 
374 
375 } // namespace tpie::pipelining
376 
377 #endif // __TPIE_PIPELINING_REVERSE_H__
tpie::stack::empty
bool empty() const
Returns whether the stack is empty or not.
Definition: stack.h:139
tpie::pipelining
pipelining/factory_base.h Base class of pipelining factories
Definition: ami_glue.h:23
tpie::stack::pop
const T & pop()
Pops one item from the stack.
Definition: stack.h:113
tpie::pipelining::bits::internal_reverser_pull_output_t::can_pull
bool can_pull() const
Whether an item can be pulled from the node.
Definition: reverse.h:248
tpie::pipelining::bits::reverser_pull_output_t::pull
T pull()
Pulls an item from the node.
Definition: reverse.h:213
tpie::pipelining::internal_passive_reverser::input
inputpipe_t input()
Returns a termfactory for the input nodes.
Definition: reverse.h:346
tpie::pipelining::bits::reverser_pull_output_t::can_pull
bool can_pull() const
Whether an item can be pulled from the node.
Definition: reverse.h:206
tpie::pipelining::reverser
pipe_middle< split_factory< bits::reverser_input_t, node, bits::reverser_output_t > > reverser
Constructs a reverser node stored in external memory.
Definition: reverse.h:367
tpie::pipelining::passive_reverser
A passive reverser stored in external memory.
Definition: reverse.h:275
tpie::pipelining::bits::internal_reverser_output_t::go
void go() override
For initiator nodes, execute this phase by pushing all items to be pushed.
Definition: reverse.h:167
tpie::stack::memory_usage
static memory_size_type memory_usage(float blockFactor=1.0)
Compute the memory used by a stack.
Definition: stack.h:146
tpie::pipelining::bits::internal_reverser_input_t::propagate
void propagate() override
Propagate stream metadata.
Definition: reverse.h:85
tpie::pipelining::pullpipe_begin
Definition: pipe_base.h:442
tpie::pipelining::internal_passive_reverser::output
outputpipe_t output()
Returns a termfactory for the output nodes.
Definition: reverse.h:353
tpie::pipelining::bits::reverser_input_t
input node for reverser stored in external memory
Definition: reverse.h:36
tpie::pipelining::bits::reverser_input_t::begin
void begin() override
Begin pipeline processing phase.
Definition: reverse.h:49
tpie::pipelining::pipe_end
Definition: pipe_base.h:212
tpie::pipelining::bits::reverser_output_t::propagate
void propagate() override
Propagate stream metadata.
Definition: reverse.h:120
tpie::pipelining::bits::internal_reverser_pull_output_t
Output node for passive reverser stored in internal memory.
Definition: reverse.h:229
tpie::pipelining::node::set_minimum_memory
void set_minimum_memory(memory_size_type minimumMemory)
Called by implementers to declare minimum memory requirements.
Definition: node.h:206
tpie::stack
An implementation of an external-memory stack.
Definition: stack.h:40
tpie::pipelining::push_type
Class to deduce the item_type of a node of type T.
Definition: node_traits.h:158
tpie::pipelining::bits::internal_reverser_input_t::push
void push(const item_type &t)
Pushes an item to the node.
Definition: reverse.h:93
tpie::pipelining::node::set_plot_options
void set_plot_options(flags< PLOT > options)
Set options specified for plot(), as a combination of node::PLOT values.
Definition: node.h:458
tpie::pipelining::bits::reverser_output_t::go
void go() override
For initiator nodes, execute this phase by pushing all items to be pushed.
Definition: reverse.h:127
tpie::pipelining::node::forward
void forward(std::string key, T value, memory_size_type k=std::numeric_limits< memory_size_type >::max())
Called by implementers to forward auxiliary data to successors.
Definition: node.h:563
tpie::pipelining::node::add_push_destination
void add_push_destination(const node_token &dest)
Called by implementers to declare a push destination.
tpie::pipelining::bits::internal_reverser_pull_output_t::propagate
void propagate() override
Propagate stream metadata.
Definition: reverse.h:240
tpie::pipelining::bits::reverser_pull_output_t
Output node for passive reverser stored in external memory.
Definition: reverse.h:186
tpie::pipelining::bits::internal_reverser_pull_output_t::end
void end() override
End pipeline processing phase.
Definition: reverse.h:261
tpie::pipelining::bits::internal_reverser_output_t
Output node for reverser stored in internal memory.
Definition: reverse.h:147
tpie::pipelining::node::set_name
void set_name(const std::string &name, priority_type priority=PRIORITY_USER)
Set this node's name.
tpie::pipelining::pipe_middle
Definition: pipe_base.h:243
tpie::pipelining::internal_passive_reverser
A passive reverser stored in internal memory.
Definition: reverse.h:322
tpie::pipelining::passive_reverser::input
inputpipe_t input()
Returns a termfactory for the input nodes.
Definition: reverse.h:299
tpie::pipelining::termfactory
Definition: factory_helpers.h:78
tpie::pipelining::bits::reverser_output_t::end
void end() override
End pipeline processing phase.
Definition: reverse.h:134
tpie::pipelining::node::set_minimum_resource_usage
void set_minimum_resource_usage(resource_type type, memory_size_type usage)
Called by implementers to declare minimum resource requirements.
tpie::pipelining::bits::reverser_output_t
Output node for reverser stored in external memory.
Definition: reverse.h:105
tpie::pipelining::bits::internal_reverser_input_t
input node for reverser stored in internal memory
Definition: reverse.h:73
tpie::pipelining::bits::reverser_input_t::end
void end() override
End pipeline processing phase.
Definition: reverse.h:60
tpie::pipelining::node::step
void step(stream_size_type steps=1)
Step the progress indicator.
Definition: node.h:653
tpie::pipelining::node::set_steps
void set_steps(stream_size_type steps)
Called by implementers that intend to call step().
tpie::tpie_delete
void tpie_delete(T *p)
Delete an object allocated with tpie_new.
Definition: memory.h:271
tpie::pipelining::node::add_dependency
void add_dependency(const node_token &dest)
Called by implementers to declare a node dependency, that is, a requirement that another node has end...
tpie::pipelining::passive_reverser::output
outputpipe_t output()
Returns a termfactory for the output nodes.
Definition: reverse.h:306
tpie::pipelining::node
Base class of all nodes.
Definition: node.h:77
tpie::pipelining::bits::internal_reverser_output_t::propagate
void propagate() override
Propagate stream metadata.
Definition: reverse.h:161
tpie::pipelining::bits::internal_reverser_pull_output_t::pull
T pull()
Pull an item from the node.
Definition: reverse.h:255
tpie::pipelining::bits::reverser_input_t::push
void push(const item_type &t)
Pushes an item to the node.
Definition: reverse.h:56
tpie::pipelining::internal_reverser
pipe_middle< split_factory< bits::internal_reverser_input_t, node, bits::internal_reverser_output_t > > internal_reverser
Constructs a reverser node stored in internal memory.
Definition: reverse.h:373
tpie::pipelining::node_token
Definition: tokens.h:292
tpie::pipelining::output
pipe_end< termfactory< bits::output_t< T >, file_stream< T > & > > output(file_stream< T > &fs)
A pipelining node that writes the pushed items to a file stream.
Definition: file_stream.h:430
tpie::pipelining::node::node
node()
Default constructor, using a new node_token.
tpie::pipelining::bits::reverser_pull_output_t::propagate
void propagate() override
Propagate stream metadata.
Definition: reverse.h:197
tpie::pipelining::bits::reverser_pull_output_t::end
void end() override
End pipeline processing phase.
Definition: reverse.h:217
tpie::maybe
Definition: maybe.h:34
stack.h
tpie::pipelining::bits::internal_reverser_output_t::end
void end() override
End pipeline processing phase.
Definition: reverse.h:174