rtmlib
reader.h
Go to the documentation of this file.
1 #ifndef _RMTLD3_READER_H_
2 #define _RMTLD3_READER_H_
3 
4 #include <functional>
5 #include <numeric>
6 
7 #include "pattern.h"
8 #include "rmtld3.h"
9 
10 template <typename R, typename P> class RMTLD3_reader : public R {
11 
15  size_t cursor;
16 
17 public:
21  P& lmem;
22 
26  RMTLD3_reader(const typename R::buffer_t &_buffer, P &_lmem) : R(_buffer), lmem(_lmem), cursor(0){};
27 
31  typename R::buffer_t::error_t reset();
32 
36  typename R::buffer_t::error_t set(timespan &);
37 
38  typename R::error_t pull(typename R::buffer_t::event_t &);
39 
40  typename R::error_t read(typename R::buffer_t::event_t &);
41 
42  typename R::error_t read_next(typename R::buffer_t::event_t &);
43 
44  typename R::error_t read_previous(typename R::buffer_t::event_t &);
45 
46  size_t length() const;
47 
48  size_t consumed() const;
49 
50  void debug() const;
51 };
52 
53 template <typename R, typename P> typename R::buffer_t::error_t RMTLD3_reader<R,P>::reset() {
54 
55  cursor = R::bottom;
56 
57  return R::buffer_t::OK;
58 }
59 
60 template <typename R, typename P>
61 typename R::buffer_t::error_t RMTLD3_reader<R,P>::set(timespan &t) {
62 
63  typename R::buffer_t::event_t e;
64 
65  while (read_previous(e) == R::AVAILABLE) {
66 
67  if (t > e.getTime())
68  break;
69 
70  // set cursor back
71  cursor = (size_t)(cursor - 1) % (R::buffer.size + 0);
72  DEBUGV_RMTLD3("backtrack cursor=%d\n", cursor);
73  }
74 
75  return R::buffer_t::OK;
76 }
77 
78 template <typename R, typename P>
79 typename R::error_t RMTLD3_reader<R,P>::pull(typename R::buffer_t::event_t &e) {
80 
81  typename R::buffer_t::event_t event_next;
82 
83  if (length() > 0) {
84  // read in an atomic way
85  if (R::buffer.read(e, cursor) != R::buffer.OK)
86  return R::BUFFER_READ;
87 
88  // update local cursor
89  cursor = (size_t)(cursor + 1) % (R::buffer.size + 0);
90  }
91 
92  DEBUGV_RMTLD3("pull-> %d (%d,%d)\n", length(), cursor, R::top);
93 
94  return (length() > 0) ? R::AVAILABLE : R::UNAVAILABLE;
95 }
96 
97 template <typename R, typename P>
98 typename R::error_t RMTLD3_reader<R,P>::read(typename R::buffer_t::event_t &e) {
99 
100  return (R::buffer.read(e, cursor) == R::buffer.OK) ? R::AVAILABLE
101  : R::UNAVAILABLE;
102 }
103 
104 template <typename R, typename P>
105 typename R::error_t
106 RMTLD3_reader<R,P>::read_next(typename R::buffer_t::event_t &e) {
107 
108  return ((length() > 1 &&
109  (R::buffer.read(e, (size_t)(cursor + 1) % (R::buffer.size + 0))) ==
110  R::buffer.OK))
111  ? R::AVAILABLE
112  : R::UNAVAILABLE;
113 }
114 
115 template <typename R, typename P>
116 typename R::error_t
117 RMTLD3_reader<R,P>::read_previous(typename R::buffer_t::event_t &e) {
118 
119  DEBUGV_RMTLD3("consumed=%d available=%d total=%d\n", consumed(), length(),
120  R::length());
121  return ((consumed() > 0 &&
122  (R::buffer.read(e, (size_t)(cursor - 1) % (R::buffer.size + 0))) ==
123  R::buffer.OK))
124  ? R::AVAILABLE
125  : R::UNAVAILABLE;
126 }
127 
128 template <typename R, typename P> size_t RMTLD3_reader<R,P>::length() const {
129  return (R::top >= cursor) ? R::top - cursor
130  : (R::buffer.size + 1) - (cursor - R::top);
131 }
132 
133 template <typename R, typename P> size_t RMTLD3_reader<R,P>::consumed() const {
134  return R::length() - length();
135 }
136 
137 template <typename R, typename P> void RMTLD3_reader<R,P>::debug() const {
138 
139  typename R::buffer_t::event_t e;
140  for (int i = 0; i < R::buffer.size; i++) {
141  R::buffer.read(e, i);
142  DEBUGV_RMTLD3("(%d,%d),", e.getData(), e.getTime());
143  }
144  DEBUGV_RMTLD3("\n");
145  DEBUGV_RMTLD3("bottom=%d top=%d timestamp=%d | cursor=%d \n", R::bottom,
146  R::top, R::timestamp, cursor);
147 }
148 
149 #endif //_RMTLD3_READER_H_
size_t consumed() const
Definition: reader.h:133
P & lmem
Definition: reader.h:21
R::error_t pull(typename R::buffer_t::event_t &)
Definition: reader.h:79
R::error_t read_previous(typename R::buffer_t::event_t &)
Definition: reader.h:117
R::buffer_t::error_t set(timespan &)
Definition: reader.h:61
size_t cursor
Definition: reader.h:15
R::error_t read_next(typename R::buffer_t::event_t &)
Definition: reader.h:106
R::error_t read(typename R::buffer_t::event_t &)
Definition: reader.h:98
Definition: reader.h:10
#define DEBUGV_RMTLD3(...)
Definition: rmtld3.h:50
R::buffer_t::error_t reset()
Definition: reader.h:53
size_t length() const
Definition: reader.h:128
RMTLD3_reader(const typename R::buffer_t &_buffer, P &_lmem)
Definition: reader.h:26
void debug() const
Definition: reader.h:137