DP3
buffered_lane.h
Go to the documentation of this file.
1 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef BUFFER_LANE_H
5 #define BUFFER_LANE_H
6 
7 #include <aocommon/lane.h>
8 #include <aocommon/uvector.h>
9 
10 #include <vector>
11 
12 namespace dp3 {
13 namespace common {
14 
15 template <typename Tp>
17  public:
18  typedef typename aocommon::Lane<Tp>::size_type size_type;
19  typedef typename aocommon::Lane<Tp>::value_type value_type;
20 
21  lane_write_buffer() : _buffer_size(0), _lane(0) {}
22 
23  lane_write_buffer(aocommon::Lane<Tp>* lane, size_type buffer_size)
24  : _buffer_size(buffer_size), _lane(lane) {
25  _buffer.reserve(buffer_size);
26  }
27 
29 
30  void reset(aocommon::Lane<Tp>* lane, size_type buffer_size) {
31  _buffer.clear();
32  _buffer.reserve(buffer_size);
33  _buffer_size = buffer_size;
34  _lane = lane;
35  }
36 
37  void clear() {
38  _lane->clear();
39  _buffer.clear();
40  }
41 
42  void write(const value_type& element) {
43  _buffer.push_back(element);
44  if (_buffer.size() == _buffer_size) flush();
45  }
46 
47  void write(value_type&& element) {
48  _buffer.push_back(std::move(element));
49  if (_buffer.size() == _buffer_size) flush();
50  }
51 
52  template <typename... Args>
53  void emplace(Args&&... args) {
54  _buffer.emplace_back(args...);
55  if (_buffer.size() == _buffer_size) flush();
56  }
57 
58  void write_end() {
59  flush();
60  _lane->write_end();
61  }
62 
63  void flush() {
64  _lane->move_write(&_buffer[0], _buffer.size());
65  _buffer.clear();
66  }
67 
68  private:
69  size_type _buffer_size;
70  std::vector<value_type> _buffer;
71  aocommon::Lane<Tp>* _lane;
72 };
73 
74 template <typename Tp>
76  public:
77  lane_read_buffer(aocommon::Lane<Tp>* lane, size_t buffer_size)
78  : _buffer(buffer_size),
79  _buffer_pos(0),
80  _buffer_fill_count(0),
81  _lane(lane) {}
82 
84 
85  bool read(Tp& element) {
86  if (_buffer_pos == _buffer_fill_count) {
87  _buffer_fill_count = _lane->read(_buffer.data(), _buffer.size());
88  _buffer_pos = 0;
89  if (_buffer_fill_count == 0) return false;
90  }
91  element = std::move(_buffer[_buffer_pos]);
92  ++_buffer_pos;
93  return true;
94  }
95 
96  private:
97  lane_read_buffer(const lane_read_buffer&) = delete;
98  lane_read_buffer& operator=(const lane_read_buffer&) = delete;
99 
100  aocommon::UVector<Tp> _buffer;
101  std::size_t _buffer_pos;
102  std::size_t _buffer_fill_count;
103  aocommon::Lane<Tp>* _lane;
104 };
105 
106 } // namespace common
107 } // namespace dp3
108 
109 #endif
Definition: buffered_lane.h:75
bool read(Tp &element)
Definition: buffered_lane.h:85
lane_read_buffer(aocommon::Lane< Tp > *lane, size_t buffer_size)
Definition: buffered_lane.h:77
~lane_read_buffer()
Definition: buffered_lane.h:83
Definition: buffered_lane.h:16
void write(const value_type &element)
Definition: buffered_lane.h:42
lane_write_buffer(aocommon::Lane< Tp > *lane, size_type buffer_size)
Definition: buffered_lane.h:23
void clear()
Definition: buffered_lane.h:37
~lane_write_buffer()
Definition: buffered_lane.h:28
aocommon::Lane< Tp >::value_type value_type
Definition: buffered_lane.h:19
void write(value_type &&element)
Definition: buffered_lane.h:47
void write_end()
Definition: buffered_lane.h:58
void flush()
Definition: buffered_lane.h:63
aocommon::Lane< Tp >::size_type size_type
Definition: buffered_lane.h:18
lane_write_buffer()
Definition: buffered_lane.h:21
void reset(aocommon::Lane< Tp > *lane, size_type buffer_size)
Definition: buffered_lane.h:30
void emplace(Args &&... args)
Definition: buffered_lane.h:53
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53