commonlib
array_buffer.h
1 
11 #pragma once
12 
13 #include "direct_array_buffer.h"
14 
15 BEGIN_NAMESPACE_MEMORY
16 
20 template <typename T, typename I>
21 class BaseArrayDescImpl : public I
22 {
23 public:
24  BaseArrayDescImpl(T* buffer, size_t capacity)
25  : buffer(buffer)
26  , capacity(capacity)
27  {
28  }
29 
30  std::recursive_mutex& getLock() override
31  {
32  return lock;
33  }
34 
35  T* getData() const override
36  {
37  return buffer;
38  }
39 
40  size_t getCapacity() const override
41  {
42  return capacity;
43  }
44 
45 private:
46  std::recursive_mutex lock;
47  T* buffer;
48  size_t capacity;
49 };
50 
54 template <typename T>
55 class ArrayBufferSourceDesc : public BaseArrayDescImpl<T, IDirectArraySourceBuffer<T>>
56 {
57 public:
58  ArrayBufferSourceDesc(T* buffer, size_t capacity)
60  , readPos(0)
61  , size(capacity)
62  {
63  }
64 
65  size_t getReadPos() override
66  {
67  std::lock_guard<std::recursive_mutex> guard(this->getLock());
68  return readPos;
69  }
70 
71  void incrementReadPosition(size_t pos) override
72  {
73  std::lock_guard<std::recursive_mutex> guard(this->getLock());
74  readPos += pos;
75  size -= pos;
76  }
77 
78  size_t getSize() override
79  {
80  std::lock_guard<std::recursive_mutex> guard(this->getLock());
81  return size;
82  }
83 
84 protected:
85  size_t readPos;
86  size_t size;
87 };
88 
92 template <typename T>
94 {
95 public:
96  explicit ArrayBufferSource(size_t capacity)
97  : ArrayBufferSourceDesc<T>(new T[capacity], capacity)
98  {
99  }
100 
102  {
103  delete[] this->getData();
104  }
105 };
106 
110 template <typename T>
111 class ArrayBufferTargetDesc : public BaseArrayDescImpl<T, IDirectArrayTargetBuffer<T>>
112 {
113 public:
114  ArrayBufferTargetDesc(T* buffer, size_t capacity)
116  , remainingSize(capacity)
117  , writePos(0)
118  {
119  }
120 
121  size_t getWritePos() override
122  {
123  std::lock_guard<std::recursive_mutex> guard(this->getLock());
124  return writePos;
125  }
126 
127  void incrementWritePosition(size_t pos) override
128  {
129  std::lock_guard<std::recursive_mutex> guard(this->getLock());
130  writePos += pos;
131  remainingSize -= pos;
132  }
133 
134  size_t getRemainingSize() override
135  {
136  std::lock_guard<std::recursive_mutex> guard(this->getLock());
137  return remainingSize;
138  }
139 
140 protected:
141  size_t remainingSize;
142  size_t writePos;
143 };
144 
148 template <typename T>
150 {
151 public:
152  explicit ArrayBufferTarget(size_t capacity)
153  : ArrayBufferTargetDesc<T>(new T[capacity], capacity)
154  {
155  }
156 
158  {
159  delete[] this->getData();
160  }
161 };
162 
163 END_NAMESPACE_MEMORY
size_t getWritePos() override
Function returns current write position.
Definition: array_buffer.h:121
Array wrapper for buffer source.
Definition: array_buffer.h:55
Interfaces for buffers which are backed by the array (circular buffers, array buffers, ...). On such buffers data transfering is done without without intermediate buffer.
void incrementReadPosition(size_t pos) override
Function increments read position for N samples.
Definition: array_buffer.h:71
Base array wrapper implementation.
Definition: array_buffer.h:21
Array wrapper for buffer target.
Definition: array_buffer.h:111
void incrementWritePosition(size_t pos) override
Function increments write position for N samples.
Definition: array_buffer.h:127
size_t getRemainingSize() override
Function returns remaining size in samples.
Definition: array_buffer.h:134
size_t getReadPos() override
Function returns current read position.
Definition: array_buffer.h:65
Array target with internal data.
Definition: array_buffer.h:149
size_t getSize() override
Function returns current buffer size in samples.
Definition: array_buffer.h:78
Array source with internal data.
Definition: array_buffer.h:93