ADTF
Loading...
Searching...
No Matches
rawmemory_intf.h
Go to the documentation of this file.
1
7#pragma once
8
9#include "rawmemory_base.h"
10
11#include <vector>
12#include <string>
13
14namespace adtf
15{
16namespace base
17{
18namespace ant
19{
22template<>
23struct adtf_memory_forward<adtf_util::cMemoryBlock>
24{
25public:
27 static tResult Assign(adtf_util::cMemoryBlock* pAssignValue,
28 const size_t /* szStaticSize */,
29 const void* pValueToSet,
30 const size_t szSizeToSet)
31 {
32 return pAssignValue->Set(pValueToSet, szSizeToSet);
33 }
34
35 static const void* GetPtr(const adtf_util::cMemoryBlock* pAssignValue)
36 {
37 return pAssignValue->GetPtr();
38 }
39
40 static size_t GetSize(const adtf_util::cMemoryBlock* pAssignValue, const size_t /* szStaticSize */)
41 {
42 return static_cast<tSize>(pAssignValue->GetSize());
43 }
44};
45
48template<>
49struct adtf_memory_forward<adtf_util::cMemoryPtr>
50{
51public:
52 static tResult Assign(adtf_util::cMemoryPtr* pAssignValue,
53 const size_t /* szStaticSize */,
54 const void* pValueToSet,
55 const size_t szSizeToSet)
56 {
57 return pAssignValue->Assign(pValueToSet, szSizeToSet);
58 }
59 static const void* GetPtr(const adtf_util::cMemoryPtr* pAssignValue)
60 {
61 return pAssignValue->GetPtr();
62 }
63 static size_t GetSize(const adtf_util::cMemoryPtr* pAssignValue, const size_t /* szStaticSize */)
64 {
65 return static_cast<tSize>(pAssignValue->GetSize());
66 }
67};
68
72template<>
73struct adtf_memory_forward<const void>
74{
75public:
76 static tResult Assign(const void* /* pAssignValue */,
77 const size_t /* szStaticSize */,
78 const void* /* pValueToSet */,
79 const size_t /* szSizeToSet */)
80 {
81 RETURN_ERROR(ERR_ACCESS_DENIED);
82 }
83 static const void* GetPtr(const void* pAssignValue)
84 {
85 return pAssignValue;
86 }
87 static size_t GetSize(const void* /* pAssignValue */, const size_t szStaticSize)
88 {
89 return szStaticSize;
90 }
91};
92
95template<>
97{
98private:
99 size_t m_szCurrentSize = g_npos;
100
101public:
102 tResult Assign(void* pAssignValue, const size_t szStaticSize, const void* pValueToSet, const size_t szSizeToSet)
103 {
104 if (szSizeToSet <= szStaticSize)
105 {
106 adtf_util::cMemoryBlock::MemCopy(pAssignValue, pValueToSet, szSizeToSet);
107 m_szCurrentSize = szSizeToSet;
109 }
110 else
111 {
112 RETURN_ERROR(ERR_MEMORY);
113 }
114 }
115 static const void* GetPtr(const void* pAssignValue)
116 {
117 return pAssignValue;
118 }
119 size_t GetSize(const void* /* pAssignValue */, const size_t szStaticSize) const
120 {
121 if (m_szCurrentSize != g_npos)
122 {
123 return m_szCurrentSize;
124 }
125 return szStaticSize;
126 }
127};
128
132template<>
133struct adtf_memory_forward<const std::string>
134{
135public:
136 static tResult Assign(const std::string* /* pAssignValue */,
137 const size_t /* szStaticSize */,
138 const void* /* pValueToSet */,
139 const size_t /* szSizeToSet */)
140 {
141 RETURN_ERROR(ERR_ACCESS_DENIED);
142 }
143 static const void* GetPtr(const std::string* pAssignValue)
144 {
145 return static_cast<const void*>(pAssignValue->data());
146 }
147 static size_t GetSize(const std::string* pAssignValue, const size_t /* szStaticSize */)
148 {
149 // there is no nulltermination within the std::string, we only write the size
150 return pAssignValue->size();
151 }
152};
153
157template<>
158struct adtf_memory_forward<const std::u16string>
159{
160public:
161 static tResult Assign(const std::u16string* /* pAssignValue */,
162 const size_t /* szStaticSize */,
163 const void* /* pValueToSet */,
164 const size_t /* szSizeToSet */)
165 {
166 RETURN_ERROR(ERR_ACCESS_DENIED);
167 }
168 static const void* GetPtr(const std::u16string* pAssignValue)
169 {
170 return static_cast<const void*>(pAssignValue->data());
171 }
172 static size_t GetSize(const std::u16string* pAssignValue, const size_t /* szStaticSize */)
173 {
174 return pAssignValue->size() * sizeof(typename std::u16string::value_type);
175 }
176};
177
180template<>
181struct adtf_memory_forward<std::string>
182{
183public:
184 static tResult Assign(std::string* pAssignValue,
185 const size_t /* szStaticSize */,
186 const void* pValueToSet,
187 const size_t szSizeToSet)
188 {
189 if (szSizeToSet > 0)
190 {
191 const auto pValuePtr = static_cast<const typename std::string::value_type*>(pValueToSet);
192 pAssignValue->reserve(szSizeToSet);
193 pAssignValue->assign(pValuePtr, szSizeToSet);
194 }
196 }
197 static const void* GetPtr(const std::string* pAssignValue)
198 {
199 return static_cast<const void*>(pAssignValue->data());
200 }
201 static size_t GetSize(const std::string* pAssignValue, const size_t /* szStaticSize */)
202 {
203 // there is no nulltermination within the std::string, we only write the size
204 return pAssignValue->size();
205 }
206};
207
210template<>
211struct adtf_memory_forward<std::u16string>
212{
213public:
214 static tResult Assign(std::u16string* pAssignValue,
215 const size_t /* szStaticSize */,
216 const void* pValueToSet,
217 const size_t szSizeToSet)
218 {
219 if (szSizeToSet > 0)
220 {
221 const auto pValuePtr = static_cast<const typename std::u16string::value_type*>(pValueToSet);
222 pAssignValue->reserve(szSizeToSet / sizeof(typename std::u16string::value_type));
223 pAssignValue->assign(pValuePtr, szSizeToSet / sizeof(typename std::u16string::value_type));
224 }
226 }
227 static const void* GetPtr(const std::u16string* pAssignValue)
228 {
229 return static_cast<const void*>(pAssignValue->data());
230 }
231 static size_t GetSize(const std::u16string* pAssignValue, const size_t /* szStaticSize */)
232 {
233 // there is no nulltermination within the std::u16string, we only write the size in bytes
234 return pAssignValue->size() * sizeof(typename std::u16string::value_type);
235 }
236};
237
240template<typename... Args>
241struct adtf_memory_forward<std::vector<Args...>>
242{
243public:
244 static tResult Assign(std::vector<Args...>* pAssignValue,
245 const size_t /* szStaticSize */,
246 const void* pValueToSet,
247 const size_t szSizeToSet)
248 {
249 static_assert(std::is_trivially_copyable<typename std::vector<Args...>::value_type>::value,
250 "only trivial types are allowed for adtf_memory_forward with vector");
251 pAssignValue->resize(szSizeToSet / sizeof(typename std::vector<Args...>::value_type));
252 if (pAssignValue->size() * sizeof(typename std::vector<Args...>::value_type) == szSizeToSet)
253 {
254 adtf_util::cMemoryBlock::MemCopy(pAssignValue->data(), pValueToSet, szSizeToSet);
255 }
256 else
257 {
258 RETURN_ERROR(ERR_MEMORY);
259 }
261 }
262 static const void* GetPtr(const std::vector<Args...>* pAssignValue)
263 {
264 return pAssignValue->data();
265 }
266 static size_t GetSize(const std::vector<Args...>* pAssignValue, const size_t /* szStaticSize */)
267 {
268 return pAssignValue->size() * sizeof(typename std::vector<Args...>::value_type);
269 }
270};
271
275template<typename... Args>
276struct adtf_memory_forward<const std::vector<Args...>>
277{
278public:
279 static tResult Assign(const std::vector<Args...>* /* pAssignValue */,
280 const size_t /* szStaticSize */,
281 const void* /* pValueToSet */,
282 const size_t /* szSizeToSet */)
283 {
284 RETURN_ERROR(ERR_ACCESS_DENIED);
285 }
286 static const void* GetPtr(const std::vector<Args...>* pAssignValue)
287 {
288 static_assert(std::is_trivially_copyable<typename std::vector<Args...>::value_type>::value,
289 "only trivial types are allowed for adtf_memory_forward with vector");
290 return static_cast<const void*>(pAssignValue->data());
291 }
292 static size_t GetSize(const std::vector<Args...>* pAssignValue, const size_t /* szStaticSize */)
293 {
294 return pAssignValue->size() * sizeof(typename std::vector<Args...>::value_type);
295 }
296};
297
298} // namespace ant
299
300namespace spider
301{
305class cRawMemoryRedirect : public IRawMemory
306{
307public:
308 cRawMemoryRedirect(std::function<tResult(const IRawMemory&)> fnForward): m_fnForward(std::move(fnForward))
309 {
310 }
311
312 tResult Set(const void* pValue, size_t szSize) override
313 {
314 return m_fnForward(adtf_memory_buffer<const void>(pValue, szSize));
315 }
316
317 size_t GetSize() const override
318 {
319 return 0;
320 }
321
322 const void* Get() const override
323 {
324 return nullptr;
325 }
326
327private:
328 std::function<tResult(const IRawMemory&)> m_fnForward;
329};
330
331} // namespace spider
332
333using spider::cRawMemoryRedirect;
334
335} // namespace base
336} // namespace adtf
337
344#define adtf_memory_intf(__utils_memblock__) adtf::base::adtf_memory<adtf_util::cMemoryBlock>(&(__utils_memblock__))
A_UTILS_NS::cResult tResult
For backwards compatibility and to bring latest version into scope.
Definition result.h:736
#define RETURN_NOERROR
Return status ERR_NOERROR, which requires the calling function's return type to be tResult.
Definition result.h:29
#define RETURN_ERROR(code)
Return specific error code, which requires the calling function's return type to be tResult.
Definition result.h:42
Definition rawmemory_base.h:23
Template class implementation for the IRawMemory interface.
Definition rawmemory_base.h:216
const void * Get() const override
Definition rawmemory_intf.h:322
tResult Set(const void *pValue, size_t szSize) override
Definition rawmemory_intf.h:312
size_t GetSize() const override
Definition rawmemory_intf.h:317
Namespace for all functionality of the ADTF Base SDK provided since v3.0.
Definition adtf_class_version.h:16
Namespace for all functionality of the ADTF Base SDK provided since v3.18.
Definition properties_v2.h:24
Namespace for the ADTF Base SDK.
Definition adtf_base_type_traits.h:13
Namespace for all functionality provided by ADTF and its SDKs.
Definition adtf_client_connector.h:14
static size_t GetSize(const adtf_util::cMemoryBlock *pAssignValue, const size_t)
Definition rawmemory_intf.h:40
static tResult Assign(adtf_util::cMemoryBlock *pAssignValue, const size_t, const void *pValueToSet, const size_t szSizeToSet)
Definition rawmemory_intf.h:27
static const void * GetPtr(const adtf_util::cMemoryBlock *pAssignValue)
Definition rawmemory_intf.h:35
Definition rawmemory_base.h:91
static size_t GetSize(const T *pAssignValue, const size_t szStaticSize)
Definition rawmemory_base.h:137
static tResult Assign(T *pAssignValue, const size_t szStaticSize, const void *pValueToSet, const size_t szSizeToSet)
Definition rawmemory_base.h:105
static const void * GetPtr(const T *pAssignValue)
Definition rawmemory_base.h:121