TPIE

11a2c2d
sort.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_SORT_H__
21 #define __TPIE_PIPELINING_SORT_H__
22 
23 #include <tpie/pipelining/node.h>
24 #include <tpie/pipelining/pipe_base.h>
25 #include <tpie/pipelining/factory_base.h>
26 #include <tpie/pipelining/merge_sorter.h>
27 #include <tpie/parallel_sort.h>
28 #include <tpie/file_stream.h>
29 #include <tpie/tempname.h>
30 #include <tpie/memory.h>
31 #include <queue>
32 #include <memory>
33 
34 namespace tpie::pipelining {
35 namespace bits {
36 
37 template <typename T, typename pred_t, typename store_t>
39 
40 template <typename T, typename pred_t, typename store_t>
42 
43 template <typename T, typename pred_t, typename store_t>
44 class sort_output_base : public node {
45  // node has virtual dtor
46 public:
48  typedef T item_type;
49 
53  typedef typename sorter_t::ptr sorterptr;
54 
55  sorterptr get_sorter() const {
56  return m_sorter;
57  }
58 
59  void propagate() override {
60  set_steps(m_sorter->item_count());
61  forward("items", static_cast<stream_size_type>(m_sorter->item_count()));
62  memory_size_type memory_usage = m_sorter->actual_memory_phase_3();
63  set_minimum_memory(memory_usage);
64  set_maximum_memory(memory_usage);
66  m_propagate_called = true;
67  }
68 
69  void add_calc_dependency(node_token tkn) {
71  }
72 
73 protected:
74  void resource_available_changed(resource_type type, memory_size_type available) override {
75  // TODO: Handle changing parameters of sorter after data structures has been frozen, i.e. after propagate
76  if (m_propagate_called)
77  return;
78 
79  if (type == MEMORY)
80  m_sorter->set_phase_3_memory(available);
81  else if (type == FILES) {
82  m_sorter->set_phase_3_files(available);
83  }
84  }
85 
87  : m_sorter(sorter)
88  , m_propagate_called(false)
89  {
90  }
91 
92  sorterptr m_sorter;
93  bool m_propagate_called;
94 };
95 
101 template <typename T, typename pred_t, typename store_t>
102 class sort_pull_output_t : public sort_output_base<T, pred_t, store_t> {
103 public:
105  typedef T item_type;
106 
110  typedef typename sorter_t::ptr sorterptr;
111 
113  : sort_output_base<T, pred_t, store_t>(sorter)
114  {
115  this->set_minimum_resource_usage(FILES, this->m_sorter->minimumFilesPhase3);
116  this->set_resource_fraction(FILES, 1.0);
117  this->set_minimum_memory(this->m_sorter->minimum_memory_phase_3());
118  this->set_maximum_memory(this->m_sorter->maximum_memory_phase_3());
119  this->set_name("Write sorted output", PRIORITY_INSIGNIFICANT);
120  this->set_memory_fraction(1.0);
121  this->set_plot_options(node::PLOT_BUFFERED);
122  }
123 
124  void begin() override {
125  this->m_sorter->set_owner(this);
126  }
127 
128  bool can_pull() const {
129  return this->m_sorter->can_pull();
130  }
131 
132  item_type pull() {
133  this->step();
134  return this->m_sorter->pull();
135  }
136 
137  void end() override {
138  this->m_sorter.reset();
139  }
140 
141  // Despite this go() implementation, a sort_pull_output_t CANNOT be used as
142  // an initiator node. Normally, it is a type error to have a phase without
143  // an initiator, but with a passive_sorter you can circumvent this
144  // mechanism. Thus we customize the error message printed (but throw the
145  // same type of exception.)
146  void go() override {
147  log_warning() << "Passive sorter used without an initiator in the final merge and output phase.\n"
148  << "Define an initiator and pair it up with the pipe from passive_sorter::output()." << std::endl;
149  throw not_initiator_node();
150  }
151 };
152 
158 template <typename pred_t, typename dest_t, typename store_t>
159 class sort_output_t : public sort_output_base<typename push_type<dest_t>::type, pred_t, store_t> {
160 public:
163 
169  typedef typename sorter_t::ptr sorterptr;
170 
171  sort_output_t(dest_t dest, sorterptr sorter)
172  : p_t(sorter)
173  , dest(std::move(dest))
174  {
175  this->add_push_destination(dest);
176  this->set_minimum_resource_usage(FILES, this->m_sorter->minimumFilesPhase3);
177  this->set_resource_fraction(FILES, 1.0);
178  this->set_minimum_memory(this->m_sorter->minimum_memory_phase_3());
179  this->set_maximum_memory(this->m_sorter->maximum_memory_phase_3());
180  this->set_name("Write sorted output", PRIORITY_INSIGNIFICANT);
181  this->set_memory_fraction(1.0);
182  this->set_plot_options(node::PLOT_BUFFERED);
183  }
184 
185  void begin() override {
186  this->m_sorter->set_owner(this);
187  }
188 
189  void go() override {
190  while (this->m_sorter->can_pull()) {
191  item_type && y=this->m_sorter->pull();
192  dest.push(std::move(y));
193  this->step();
194  }
195  }
196 
197  void end() override {
198  this->m_sorter.reset();
199  }
200 
201 private:
202  dest_t dest;
203 };
204 
210 template <typename T, typename pred_t, typename store_t>
211 class sort_calc_t : public node {
212 public:
214  typedef T item_type;
215 
219  typedef typename sorter_t::ptr sorterptr;
220 
222 
223  sort_calc_t(sort_calc_t && other) = default;
224 
225  template <typename dest_t>
226  sort_calc_t(dest_t dest)
227  : dest(new dest_t(std::move(dest)))
228  {
229  m_sorter = this->dest->get_sorter();
230  this->dest->add_calc_dependency(this->get_token());
231  init();
232  }
233 
234  sort_calc_t(sorterptr sorter, node_token tkn)
235  : node(tkn), m_sorter(sorter)
236  {
237  init();
238  }
239 
240  void init() {
241  set_minimum_resource_usage(FILES, this->m_sorter->minimumFilesPhase2);
242  set_resource_fraction(FILES, 1.0);
243  set_minimum_memory(this->m_sorter->minimum_memory_phase_2());
244  set_name("Perform merge heap", PRIORITY_SIGNIFICANT);
245  set_memory_fraction(1.0);
246  set_plot_options(PLOT_BUFFERED | PLOT_SIMPLIFIED_HIDE);
247  m_propagate_called = false;
248  }
249 
250  void propagate() override {
251  set_steps(1000);
252  m_propagate_called = true;
253  }
254 
255  void begin() override {
256  this->m_sorter->set_owner(this);
257  }
258 
259  void end() override {
260  m_weakSorter = m_sorter;
261  m_sorter.reset();
262  }
263 
264  bool is_go_free() const override {return m_sorter->is_calc_free();}
265 
266  void go() override {
267  progress_indicator_base * pi = proxy_progress_indicator();
268  m_sorter->calc(*pi);
269  }
270 
271  bool can_evacuate() override {
272  return true;
273  }
274 
275  void evacuate() override {
276  sorterptr sorter = m_weakSorter.lock();
277  if (sorter) sorter->evacuate_before_reporting();
278  }
279 
280  sorterptr get_sorter() const {
281  return m_sorter;
282  }
283 
284  void set_input_node(node & input) {
285  add_memory_share_dependency(input);
286  }
287 
288 protected:
289  void resource_available_changed(resource_type type, memory_size_type available) override {
290  // TODO: Handle changing parameters of sorter after data structures has been frozen, i.e. after propagate
291  if (m_propagate_called)
292  return;
293 
294  if (type == MEMORY)
295  m_sorter->set_phase_2_memory(available);
296  else if (type == FILES) {
297  m_sorter->set_phase_2_files(available);
298  }
299  }
300 
301 private:
302  sorterptr m_sorter;
303  std::weak_ptr<typename sorterptr::element_type> m_weakSorter;
304  bool m_propagate_called;
305  std::shared_ptr<Output> dest;
306 };
307 
313 template <typename T, typename pred_t, typename store_t>
314 class sort_input_t : public node {
315 public:
317  typedef T item_type;
318 
322  typedef typename sorter_t::ptr sorterptr;
323 
325  : m_sorter(dest.get_sorter())
326  , m_propagate_called(false)
327  , dest(std::move(dest))
328  {
329  this->dest.set_input_node(*this);
330  set_name("Form input runs", PRIORITY_SIGNIFICANT);
331  set_minimum_resource_usage(FILES, sorter_t::minimumFilesPhase1);
332  set_resource_fraction(FILES, 0.0);
333  set_minimum_memory(m_sorter->minimum_memory_phase_1());
334  set_memory_fraction(1.0);
335  set_plot_options(PLOT_BUFFERED | PLOT_SIMPLIFIED_HIDE);
336  }
337 
338  void propagate() override {
339  if (this->can_fetch("items"))
340  m_sorter->set_items(this->fetch<stream_size_type>("items"));
341  m_propagate_called = true;
342  }
343 
344  void push(item_type && item) {
345  m_sorter->push(std::move(item));
346  }
347 
348  void push(const item_type & item) {
349  m_sorter->push(item);
350  }
351 
352  void begin() override {
353  m_sorter->begin();
354  m_sorter->set_owner(this);
355  }
356 
357 
358  void end() override {
359  node::end();
360  m_sorter->end();
361  m_weakSorter = m_sorter;
362  m_sorter.reset();
363  }
364 
365  bool can_evacuate() override {
366  return true;
367  }
368 
369  void evacuate() override {
370  sorterptr sorter = m_weakSorter.lock();
371  if (sorter) sorter->evacuate_before_merging();
372  }
373 
374 protected:
375  void resource_available_changed(resource_type type, memory_size_type available) override {
376  // TODO: Handle changing parameters of sorter after data structures has been frozen, i.e. after propagate
377  if (m_propagate_called)
378  return;
379 
380  if (type == MEMORY)
381  m_sorter->set_phase_1_memory(available);
382  else if (type == FILES) {
383  m_sorter->set_phase_1_files(available);
384  }
385  }
386 private:
387  sorterptr m_sorter;
388  std::weak_ptr<typename sorterptr::element_type> m_weakSorter;
389  bool m_propagate_called;
390  sort_calc_t<T, pred_t, store_t> dest;
391 };
392 
393 template <typename pred_t, typename store_t>
394 class sort_factory : public factory_base {
395 public:
396  template <typename dest_t>
398 
399  template <typename dest_t>
400  constructed_type<dest_t> construct(dest_t dest) {
401  using item_type = typename push_type<dest_t>::type;
403  std::move(dest),
405  m_pred,
406  m_store));
407  this->init_sub_node(output);
409  this->init_sub_node(calc);
411  this->init_sub_node(input);
412  return input;
413  }
414 
415  sort_factory(const pred_t & pred, store_t store): m_pred(pred), m_store(store) {}
416 private:
417  pred_t m_pred;
418  store_t m_store;
419 
420 };
421 
422 } // namespace bits
423 
428 template <typename store_t>
430 store_sort(store_t store=store_t()) {
431  typedef bits::sort_factory<std::less<void>, store_t> fact;
432  return pipe_middle<fact>(fact(std::less<void>(), store)).name("Sort");
433 }
434 
439 template <typename store_t, typename pred_t>
440 inline pipe_middle<bits::sort_factory<pred_t, store_t> >
441 store_sort(const pred_t & p, store_t store=store_t()) {
443  return pipe_middle<fact>(fact(p, store)).name("Sort");
444 }
445 
450 template <typename pred_t=std::less<void>, typename store_t=default_store>
451 inline pipe_middle<bits::sort_factory<pred_t, store_t> >
452 sort(const pred_t & p=std::less<void>(), store_t store=default_store()) {
454  return pipe_middle<fact>(fact(p, store)).name("Sort");
455 }
456 
457 template <typename T, typename pred_t=std::less<T>, typename store_t=default_store>
459 
460 namespace bits {
461 
465 template <typename T, typename pred_t, typename store_t>
467 public:
470  typedef input_t constructed_type;
472  typedef typename sorter_t::ptr sorterptr;
473 
474  passive_sorter_factory_input(sorterptr sorter, node_token calc_token)
475  : m_sorter(sorter)
476  , m_calc_token(calc_token) {}
477 
478  constructed_type construct() {
479  calc_t calc(std::move(m_sorter), m_calc_token);
480  this->init_node(calc);
481  input_t input(std::move(calc));
482  this->init_node(input);
483  return input;
484  }
485 
486 private:
487  sorterptr m_sorter;
488  node_token m_calc_token;
489 };
490 
494 template <typename T, typename pred_t, typename store_t>
496 public:
498  typedef typename sorter_t::ptr sorterptr;
500 
501  passive_sorter_factory_output(sorterptr sorter, node_token calc_token)
502  : m_sorter(sorter)
503  , m_calc_token(calc_token)
504  {}
505 
506  constructed_type construct() {
507  constructed_type res(std::move(m_sorter));
508  res.add_calc_dependency(m_calc_token);
509  init_node(res);
510  return res;
511  }
512 private:
513  sorterptr m_sorter;
514  node_token m_calc_token;
515 };
516 
517 } // namespace bits
518 
526 template <typename T, typename pred_t, typename store_t>
527 class passive_sorter {
528 public:
530  typedef T item_type;
534  typedef typename sorter_t::ptr sorterptr;
537 
538  passive_sorter(pred_t pred = pred_t(),
539  store_t store = store_t())
540  : m_sorterInput(std::make_shared<sorter_t>(pred, store))
541  , m_sorterOutput(m_sorterInput)
542  {}
543 
544  passive_sorter(const passive_sorter &) = delete;
545  passive_sorter & operator=(const passive_sorter &) = delete;
546  passive_sorter(passive_sorter && ) = default;
547  passive_sorter & operator=(passive_sorter &&) = default;
548 
551 
556  tp_assert(m_sorterInput, "input() called more than once");
558  std::move(m_sorterInput), m_calc_token);
559  return {std::move(ret)};
560  }
561 
566  tp_assert(m_sorterOutput, "output() called more than once");
568  std::move(m_sorterOutput), m_calc_token);
569  return {std::move(ret)};
570  }
571 
572 private:
573  sorterptr m_sorterInput, m_sorterOutput;
574  node_token m_calc_token;
575 };
576 
577 } // namespace tpie::pipelining
578 
579 #endif //__TPIE_PIPELINING_SORT_H__
tpie::pipelining
pipelining/factory_base.h Base class of pipelining factories
Definition: ami_glue.h:23
tpie::pipelining::factory_base::init_sub_node
void init_sub_node(node &r)
Initialize node constructed in a subclass.
tpie::pipelining::node::add_memory_share_dependency
void add_memory_share_dependency(const node_token &dest)
Called by implementers to declare a node memory share dependency, that is, a requirement that another...
tpie::pipelining::bits::sort_calc_t::sorter_t
merge_sorter< item_type, true, pred_t, store_t > sorter_t
Type of the merge sort implementation used.
Definition: sort.h:217
tpie::pipelining::bits::sort_pull_output_t::sorter_t
merge_sorter< item_type, true, pred_t, store_t > sorter_t
Type of the merge sort implementation used.
Definition: sort.h:108
tpie::pipelining::factory_base::init_node
void init_node(node &r)
\Brief Initialize node constructed in a subclass.
tpie::pipelining::passive_sorter::input
input_pipe_t input()
Get the input push node.
Definition: sort.h:555
tpie::dynamic_store
Fantastic store strategy.
Definition: store.h:218
tpie::pipelining::pullpipe_begin
Definition: pipe_base.h:442
tpie::pipelining::passive_sorter
Pipelined sorter with push input and pull output.
Definition: sort.h:458
tpie::pipelining::not_initiator_node
Definition: exception.h:34
tpie::pipelining::pipe_end
Definition: pipe_base.h:212
tpie::pipelining::bits::sort_pull_output_t
Pipe sorter pull output node.
Definition: sort.h:102
tpie::pipelining::bits::sort_output_base::sorter_t
merge_sorter< T, true, pred_t, store_t > sorter_t
Type of the merge sort implementation used.
Definition: sort.h:51
tpie::merge_sorter
Merge sorting consists of three phases.
Definition: merge_sorter.h:396
tpie::pipelining::bits::sort_output_t::go
void go() override
For initiator nodes, execute this phase by pushing all items to be pushed.
Definition: sort.h:189
tempname.h
tpie::pipelining::bits::sort_calc_t::sorterptr
sorter_t::ptr sorterptr
Smart pointer to sorter_t.
Definition: sort.h:219
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::pipelining::passive_sorter::output
output_pipe_t output()
Get the output pull node.
Definition: sort.h:565
tpie::pipelining::push_type
Class to deduce the item_type of a node of type T.
Definition: node_traits.h:158
tpie::pipelining::bits::sort_pull_output_t::item_type
T item_type
Type of items sorted.
Definition: sort.h:105
tpie::pipelining::bits::sort_output_t::sorter_t
merge_sorter< item_type, true, pred_t, store_t > sorter_t
Type of the merge sort implementation used.
Definition: sort.h:167
tpie::pipelining::bits::sort_output_t::end
void end() override
End pipeline processing phase.
Definition: sort.h:197
parallel_sort.h
tpie::pipelining::bits::sort_calc_t
Pipe sorter middle node.
Definition: sort.h:38
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::factory_base
Base class of all pipelining factories.
Definition: factory_base.h:73
tpie::pipelining::bits::sort_output_base::resource_available_changed
void resource_available_changed(resource_type type, memory_size_type available) override
Called by the resource manager to notify the node's available amount of resource has changed.
Definition: sort.h:74
tpie::pipelining::passive_sorter::output_t
bits::sort_pull_output_t< item_type, pred_t, store_t > output_t
Type of pipe sorter output.
Definition: sort.h:536
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::sort_output_t::begin
void begin() override
Begin pipeline processing phase.
Definition: sort.h:185
tpie::pipelining::bits::pipe_base::name
child_t name(const std::string &n, priority_type p=PRIORITY_USER)
Set name for this node.
Definition: pipe_base.h:90
tp_assert
#define tp_assert(condition, message)
Definition: tpie_assert.h:65
tpie::pipelining::bits::sort_input_t
Pipe sorter input node.
Definition: sort.h:41
tpie::pipelining::node::set_name
void set_name(const std::string &name, priority_type priority=PRIORITY_USER)
Set this node's name.
tpie::pipelining::bits::sort_pull_output_t::go
void go() override
For initiator nodes, execute this phase by pushing all items to be pushed.
Definition: sort.h:146
tpie::log_warning
logstream & log_warning()
Return logstream for writing warning log messages.
Definition: tpie_log.h:158
tpie::pipelining::node::set_maximum_memory
void set_maximum_memory(memory_size_type maximumMemory)
Called by implementers to declare maximum memory requirements.
Definition: node.h:216
tpie::pipelining::passive_sorter::sorterptr
sorter_t::ptr sorterptr
Smart pointer to sorter_t.
Definition: sort.h:534
tpie::pipelining::bits::sort_factory
Definition: sort.h:394
tpie::pipelining::pipe_middle
Definition: pipe_base.h:243
tpie::pipelining::bits::sort_pull_output_t::sorterptr
sorter_t::ptr sorterptr
Smart pointer to sorter_t.
Definition: sort.h:110
tpie::pipelining::bits::sort_output_t
Pipe sorter push output node.
Definition: sort.h:159
tpie::pipelining::bits::sort_output_base::sorterptr
sorter_t::ptr sorterptr
Smart pointer to sorter_t.
Definition: sort.h:53
tpie::pipelining::bits::sort_output_base::propagate
void propagate() override
Propagate stream metadata.
Definition: sort.h:59
tpie::pipelining::bits::sort_output_base::item_type
T item_type
Type of items sorted.
Definition: sort.h:48
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::node::set_resource_fraction
void set_resource_fraction(resource_type type, double f)
Set the resource priority of this node.
tpie::pipelining::bits::sort_pull_output_t::begin
void begin() override
Begin pipeline processing phase.
Definition: sort.h:124
tpie::pipelining::bits::sort_output_t::item_type
push_type< dest_t >::type item_type
Type of items sorted.
Definition: sort.h:162
tpie::pipelining::bits::sort_calc_t::item_type
T item_type
Type of items sorted.
Definition: sort.h:214
tpie::pipelining::bits::sort_input_t::sorter_t
merge_sorter< item_type, true, pred_t, store_t > sorter_t
Type of the merge sort implementation used.
Definition: sort.h:320
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::pipelining::node::end
virtual void end()
End pipeline processing phase.
Definition: node.h:328
tpie::pipelining::bits::passive_sorter_factory_input
Factory for the passive sorter input node.
Definition: sort.h:466
tpie::pipelining::node::set_memory_fraction
void set_memory_fraction(double f)
Set the memory priority of this node.
Definition: node.h:224
tpie::pipelining::passive_sorter::item_type
T item_type
Type of items sorted.
Definition: sort.h:530
tpie::pipelining::bits::passive_sorter_factory_output
Factory for the passive sorter output node.
Definition: sort.h:495
tpie::pipelining::input
pipe_begin< factory< bits::input_t, file_stream< T > &, stream_options > > input(file_stream< T > &fs, stream_options options=stream_options())
Pipelining nodes that pushes the contents of the given file stream to the next node in the pipeline.
Definition: file_stream.h:378
tpie::pipelining::node
Base class of all nodes.
Definition: node.h:77
tpie::pipelining::bits::sort_output_t::p_t
sort_output_base< item_type, pred_t, store_t > p_t
Base class.
Definition: sort.h:165
tpie::pipelining::sort
pipe_middle< bits::sort_factory< pred_t, store_t > > sort(const pred_t &p=std::less< void >(), store_t store=default_store())
A pipelining node that sorts large elements indirectly by using a store and a given predicate.
Definition: sort.h:452
tpie::pipelining::passive_sorter::sorter_t
merge_sorter< item_type, true, pred_t, store_t > sorter_t
Type of the merge sort implementation used.
Definition: sort.h:532
tpie::pipelining::node_token
Definition: tokens.h:292
tpie::pipelining::item_type
pipe_middle< tfactory< bits::item_type_t, Args< T > > > item_type()
Create item type defining identity pipe node.
Definition: helpers.h:654
tpie::pipelining::store_sort
pipe_middle< bits::sort_factory< std::less< void >, store_t > > store_sort(store_t store=store_t())
A pipelining node that sorts large elements indirectly by using a store and std::less.
Definition: sort.h:430
tpie::pipelining::bits::sort_output_t::sorterptr
sorter_t::ptr sorterptr
Smart pointer to sorter_t.
Definition: sort.h:169
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
memory.h
tpie::pipelining::bits::sort_input_t::item_type
T item_type
Type of items sorted.
Definition: sort.h:317
tpie::pipelining::bits::sort_pull_output_t::end
void end() override
End pipeline processing phase.
Definition: sort.h:137
tpie::pipelining::bits::sort_output_base
Definition: sort.h:44
tpie::pipelining::bits::sort_input_t::sorterptr
sorter_t::ptr sorterptr
Smart pointer to sorter_t.
Definition: sort.h:322