17#if !defined(ADOLC_STRUCT_BUF_H)
18#define ADOLC_STRUCT_BUF_H 1
27 { t.allmem } -> std::convertible_to<void *>;
36template <AllMemType T,
size_t buff_size>
class Buffer {
37 using InitFunctionPointer = void (*)(T *subBufferElement);
41 std::array<T, buff_size> elements;
42 SubBuffer *nextSubBuffer{
nullptr};
43 SubBuffer() =
default;
48 Buffer(InitFunctionPointer _initFunction) : initFunction(_initFunction) {}
56 inline void init(InitFunctionPointer _initFunction) {
57 initFunction = _initFunction;
63 SubBuffer *firstSubBuffer{
nullptr};
64 InitFunctionPointer initFunction{
nullptr};
68template <AllMemType T,
size_t buff_size>
73 SubBuffer *next =
nullptr;
74 while (firstSubBuffer) {
75 next = firstSubBuffer->nextSubBuffer;
76 for (
auto &ele : firstSubBuffer->elements)
79 delete firstSubBuffer;
80 firstSubBuffer = next;
84 firstSubBuffer = other.firstSubBuffer;
85 numEntries = other.numEntries;
86 initFunction = other.initFunction;
89 other.firstSubBuffer =
nullptr;
91 other.initFunction =
nullptr;
97 SubBuffer *next =
nullptr;
100 while (firstSubBuffer) {
101 next = firstSubBuffer->nextSubBuffer;
102 for (
auto &ele : firstSubBuffer->elements)
105 delete firstSubBuffer;
106 firstSubBuffer = next;
111 SubBuffer *currentSubBuffer = firstSubBuffer, *previousSubBuffer =
nullptr;
112 size_t tmp = numEntries;
114 while (tmp >= buff_size) {
115 previousSubBuffer = currentSubBuffer;
116 currentSubBuffer = currentSubBuffer->nextSubBuffer;
119 if (currentSubBuffer ==
nullptr) {
120 currentSubBuffer =
new SubBuffer;
121 if (firstSubBuffer ==
nullptr)
122 firstSubBuffer = currentSubBuffer;
124 previousSubBuffer->nextSubBuffer = currentSubBuffer;
125 currentSubBuffer->nextSubBuffer =
nullptr;
127 const size_t index = tmp;
129 currentSubBuffer->elements[index].allmem =
nullptr;
130 if (initFunction !=
nullptr)
131 initFunction(&(currentSubBuffer->elements[index]));
133 currentSubBuffer->elements[index].index = numEntries;
136 return ¤tSubBuffer->elements[index];
139template <AllMemType T,
size_t buff_size>
141 if (index >= numEntries)
145 SubBuffer *currentSubBuffer = firstSubBuffer;
146 while (index >= buff_size) {
147 currentSubBuffer = currentSubBuffer->nextSubBuffer;
150 return ¤tSubBuffer->elements[index];
#define CURRENT_LOCATION
Definition adolcerror.h:26
Block-based storage for registered external-function descriptors.
Definition buffer_temp.h:36
T * append()
Definition buffer_temp.h:110
Buffer & operator=(const Buffer &)=delete
void init(InitFunctionPointer _initFunction)
Definition buffer_temp.h:56
T * getElement(size_t index) const
Definition buffer_temp.h:140
Buffer(InitFunctionPointer _initFunction)
Definition buffer_temp.h:48
Buffer & operator=(Buffer &&other) noexcept
Definition buffer_temp.h:70
Buffer(const Buffer &)=delete
~Buffer()
Definition buffer_temp.h:96
Buffer(Buffer &&other) noexcept=default
Definition buffer_temp.h:26
void ADOLC_API fail(ErrorType error, const source_location LocInfo, const FailInfo &failinfo=FailInfo())