RaftLib  0.3a
C++ Stream Processing Template Library
fifo.hpp
1 
20 #ifndef _FIFO_HPP_
21 #define _FIFO_HPP_ 1
22 #include <cstddef>
23 #include <typeinfo>
24 #include <iterator>
25 #include <list>
26 #include <vector>
27 #include <sstream>
28 #include <map>
29 #include <functional>
30 #include <cassert>
31 #include <stdexcept>
32 #include "bufferdata.tcc"
33 #include "blocked.hpp"
34 #include "signalvars.hpp"
35 
36 
38 class Schedule;
39 
40 
41 class FIFO
42 {
43 #include "autorelease.tcc"
44 public:
45 
46 
51  FIFO();
52 
56  virtual ~FIFO() = default;
57 
62  virtual std::size_t size() = 0;
63 
70  virtual std::size_t space_avail() = 0;
71 
77  virtual std::size_t capacity() = 0;
78 
86  template < class T > T& allocate()
87  {
88  void *ptr( nullptr );
90  local_allocate( &ptr );
91  return( *( reinterpret_cast< T* >( ptr ) ) );
92  }
93 
99  virtual void deallocate() = 0;
100 
108  template < class T > auto allocate_s() ->
109  autorelease< T, allocatetype >
110  {
111  void *ptr( nullptr );
112  local_allocate( &ptr );
113  return( autorelease< T, allocatetype >(
114  reinterpret_cast< T* >( ptr ), (*this) ) );
115  }
116 
132  template < class T > auto allocate_range( const std::size_t n ) -> std::vector<
133  std::reference_wrapper< T > >
134  {
135  std::vector< std::reference_wrapper< T > > output;
136  void *ptr( (void*) &output );
137  local_allocate_n( ptr, n );
139  return( output );
140  }
147  virtual void send( const raft::signal = raft::none ) = 0;
148 
155  virtual void send_range( const raft::signal = raft::none ) = 0;
156 
167  template < class T >
168  void push( const T &item, const raft::signal signal = raft::none )
169  {
170  void *ptr( (void*) &item );
172  local_push( ptr, signal );
173  return;
174  }
175 
186  template < class T >
187  void push( T &&item, const raft::signal signal = raft::none )
188  {
190  void *ptr( (void*) &item );
192  local_push( ptr, signal );
193  return;
194  }
195 
207  template< class iterator_type >
208  void insert( iterator_type begin,
209  iterator_type end,
210  const raft::signal signal = raft::none )
211  {
212  void *begin_ptr( (void*)&begin );
213  void *end_ptr ( (void*)&end );
214  local_insert( begin_ptr, end_ptr, signal, typeid( iterator_type ).hash_code() );
215  return;
216  }
217 
225  template< class T >
226  void pop( T &item, raft::signal *signal = nullptr )
227  {
228  void *ptr( (void*)&item );
229  local_pop( ptr, signal );
230  return;
231  }
232 
233 #if 0
234  template< class T >
235  auto pop_s() -> autorelease< T, poptype >
236  {
237  return( autorelease< T, poptype >( (*this) ) );
238  }
239 #endif
240 
252  template< class T >
253  void pop_range( pop_range_t< T > &items,
254  const std::size_t n_items )
255  {
256  void *ptr_items( (void*)&items );
257  local_pop_range( ptr_items, n_items );
258  return;
259  }
260 
269  template< class T >
270  T& peek( raft::signal *signal = nullptr )
271  {
272  void *ptr( nullptr );
273  local_peek( &ptr, signal );
274  return( *( reinterpret_cast< T* >( ptr ) ) );
275  }
276 
285  template< class T >
286  auto peek_range( const std::size_t n ) ->
287  autorelease< T, peekrange >
288  {
289  void *ptr;
290  void *sig;
291  std::size_t curr_pointer_loc( 0 );
292  local_peek_range( &ptr, &sig, n, curr_pointer_loc );
293  return( autorelease< T, peekrange >(
294  (*this),
295  reinterpret_cast< T * const >( ptr ),
296  *reinterpret_cast< Buffer::Signal* >( sig ),
297  curr_pointer_loc,
298  n ) );
299  }
305  virtual void unpeek() = 0;
306 
314  virtual void recycle( const std::size_t range = 1 ) = 0;
315 
324  virtual void get_zero_read_stats( Blocked &copy );
325 
334  virtual void get_zero_write_stats( Blocked &copy );
335 
352  virtual void resize( const std::size_t n_items,
353  const std::size_t align,
354  volatile bool &exit_alloc ) = 0;
355 
364  virtual float get_frac_write_blocked() = 0;
365 
374  void invalidate();
375 
383  bool is_invalid();
384 protected:
390  virtual raft::signal signal_peek() = 0;
395  virtual void signal_pop() = 0;
396 
405  virtual void inline_signal_send( const raft::signal sig ) = 0;
406 
418  virtual void local_allocate( void **ptr ) = 0;
419 
426  virtual void local_allocate_n( void *ptr, const std::size_t n ) = 0;
436  virtual void local_push( void *ptr, const raft::signal &signal ) = 0;
437 
446  virtual void local_insert( void *ptr_begin,
447  void *ptr_end,
448  const raft::signal &signal,
449  const std::size_t iterator_type ) = 0;
450 
457  virtual void local_pop( void *ptr, raft::signal *signal ) = 0;
458 
465  virtual void local_pop_range( void *ptr_data,
466  std::size_t n_items ) = 0;
473  virtual void local_peek( void **ptr,
474  raft::signal *signal ) = 0;
486  virtual void local_peek_range( void **ptr,
487  void **sig,
488  const std::size_t n_items,
489  std::size_t &curr_pointer_loc ) = 0;
490 
492  volatile bool valid = true;
493 
497  friend class Schedule;
498 };
499 
500 
501 #endif /* END _FIFO_HPP_ */
virtual void inline_signal_send(const raft::signal sig)=0
virtual std::size_t capacity()=0
virtual ~FIFO()=default
virtual void get_zero_read_stats(Blocked &copy)
Definition: fifo.cpp:28
T & allocate()
Definition: fifo.hpp:86
virtual void send(const raft::signal=raft::none)=0
virtual void resize(const std::size_t n_items, const std::size_t align, volatile bool &exit_alloc)=0
void push(const T &item, const raft::signal signal=raft::none)
Definition: fifo.hpp:168
virtual float get_frac_write_blocked()=0
virtual void recycle(const std::size_t range=1)=0
auto allocate_range(const std::size_t n) -> std::vector< std::reference_wrapper< T > >
Definition: fifo.hpp:132
virtual std::size_t size()=0
Definition: blocked.hpp:24
virtual void send_range(const raft::signal=raft::none)=0
virtual void local_allocate(void **ptr)=0
void pop(T &item, raft::signal *signal=nullptr)
Definition: fifo.hpp:226
auto allocate_s() -> autorelease< T, allocatetype >
Definition: fifo.hpp:108
void push(T &&item, const raft::signal signal=raft::none)
Definition: fifo.hpp:187
FIFO()
Definition: fifo.cpp:22
virtual void local_pop(void *ptr, raft::signal *signal)=0
virtual void local_allocate_n(void *ptr, const std::size_t n)=0
T & peek(raft::signal *signal=nullptr)
Definition: fifo.hpp:270
virtual void unpeek()=0
virtual void signal_pop()=0
virtual void local_push(void *ptr, const raft::signal &signal)=0
virtual std::size_t space_avail()=0
void invalidate()
Definition: fifo.cpp:42
bool is_invalid()
Definition: fifo.cpp:48
void insert(iterator_type begin, iterator_type end, const raft::signal signal=raft::none)
Definition: fifo.hpp:208
Definition: schedule.hpp:31
virtual void deallocate()=0
virtual raft::signal signal_peek()=0
virtual void get_zero_write_stats(Blocked &copy)
Definition: fifo.cpp:35
Definition: fifo.hpp:41
void pop_range(pop_range_t< T > &items, const std::size_t n_items)
Definition: fifo.hpp:253
virtual void local_insert(void *ptr_begin, void *ptr_end, const raft::signal &signal, const std::size_t iterator_type)=0
virtual void local_pop_range(void *ptr_data, std::size_t n_items)=0
virtual void local_peek_range(void **ptr, void **sig, const std::size_t n_items, std::size_t &curr_pointer_loc)=0
virtual void local_peek(void **ptr, raft::signal *signal)=0
volatile bool valid
Definition: fifo.hpp:492
auto peek_range(const std::size_t n) -> autorelease< T, peekrange >
Definition: fifo.hpp:286