1 #ifndef SDK_SDK_ARRAY_HANDLER_H_
11 #define SDK_SDK_ARRAY_HANDLER_H_
17 #if defined(SDK_OS_MAC) || defined(SDK_OS_ANDROID)
29 class SDKArrayHandler;
37 m_instance.num_of_elements = 0;
39 m_instance.element_size = 0;
40 m_instance.data = NULL;
47 m_instance.num_of_elements = 0;
49 m_instance.element_size = 0;
50 m_instance.data =
nullptr;
53 rhs.m_instance.element_size, rhs.m_instance.num_of_elements);
55 (rhs.m_instance.num_of_elements * rhs.m_instance.element_size) > 0) {
56 SDKMemCopy(m_instance.data,
static_cast<size_t>(
57 m_instance.num_of_elements * m_instance.element_size),
58 rhs.m_instance.data,
static_cast<size_t>(
59 rhs.m_instance.num_of_elements * rhs.m_instance.element_size));
75 SDKUInt64 num_of_elements) noexcept {
78 m_instance.num_of_elements = 0;
80 m_instance.element_size = 0;
81 m_instance.data =
nullptr;
94 SDKUInt64 num_of_elements,
const void* init_data, SDKUInt64 data_size) noexcept {
97 m_instance.num_of_elements = 0;
99 m_instance.element_size = 0;
100 m_instance.data =
nullptr;
108 SDKUInt64 size = m_instance.element_size * m_instance.num_of_elements;
109 if (init_data != NULL && size == data_size) {
110 SDKMemCopy(m_instance.data,
static_cast<size_t>(size), init_data,
111 static_cast<size_t>(data_size));
123 m_instance.num_of_elements = 0;
125 m_instance.element_size = 0;
126 m_instance.data = NULL;
129 instance.element_size, instance.num_of_elements);
131 (instance.num_of_elements * instance.element_size) > 0ULL)
133 SDKMemCopy(m_instance.data,
static_cast<unsigned int>(
134 m_instance.num_of_elements * m_instance.element_size),
135 instance.data,
static_cast<unsigned int>(
136 instance.num_of_elements * instance.element_size));
154 operator SDKArray&() noexcept {
159 operator const SDKArray&()
const noexcept {
165 return m_instance.element_type;
170 return m_instance.element_size;
175 return m_instance.num_of_elements;
180 return m_instance.data;
185 return m_instance.data;
204 SDKArray&
Get() noexcept {
208 const SDKArray&
Get() const noexcept {
212 void Attach(SDKArray& instance) noexcept
216 m_instance.num_of_elements = instance.num_of_elements;
217 m_instance.element_type = instance.element_type;
218 m_instance.element_size = instance.element_size;
219 m_instance.data = instance.data;
221 instance.num_of_elements = 0;
223 instance.element_size = 0;
224 instance.data = NULL;
227 SDKArray Detach() noexcept
230 instance.num_of_elements = m_instance.num_of_elements;
231 instance.element_type = m_instance.element_type;
232 instance.element_size = m_instance.element_size;
233 instance.data = m_instance.data;
235 m_instance.num_of_elements = 0;
237 m_instance.element_size = 0;
238 m_instance.data = NULL;
243 SDKAny DetachAsAny() noexcept
248 any.arr->num_of_elements = m_instance.num_of_elements;
249 any.arr->element_type = m_instance.element_type;
250 any.arr->element_size = m_instance.element_size;
251 any.arr->data = m_instance.data;
253 m_instance.num_of_elements = 0;
255 m_instance.element_size = 0;
256 m_instance.data = NULL;
261 void DetachAsAny(SDKAny& dest) noexcept
264 SDKAny any = DetachAsAny();
270 return (m_instance.num_of_elements == 0) ||
272 (m_instance.element_size == 0) ||
273 (m_instance.data == NULL);
277 template<
typename T >
278 static bool FromStdVector(
const std::vector< T >& v, SDKAnyType element_type,
279 SDKArray& arr) noexcept {
283 arr.num_of_elements = v.size();
285 arr.element_size =
sizeof(T);
288 arr.num_of_elements))) {
291 SDKMemCopy(arr.data,
size_t(arr.num_of_elements * arr.element_size),
292 &v.front(),
size_t(arr.num_of_elements * arr.element_size));
297 template<
typename T >
298 static bool FromStdSet(
const std::set< T >& s, SDKAnyType element_type,
299 SDKArray& arr) noexcept {
303 arr.num_of_elements = s.size();
305 arr.element_size =
sizeof(T);
308 arr.num_of_elements))) {
311 T* ptr =
reinterpret_cast<T*
>(arr.data);
312 for (
typename std::set< T >::const_iterator it = s.cbegin(); it != s.cend(); ++it) {
320 template<
typename T >
321 static bool ToStdVector(
const SDKArray* arr, SDKAnyType element_type,
322 std::vector< T >& v) noexcept {
324 if (!arr || !arr->data || !arr->num_of_elements ||
325 (
sizeof(T) != arr->element_size) ||
329 v.resize(
static_cast<size_t>(arr->num_of_elements));
330 SDKMemCopy(&v.front(),
size_t(arr->num_of_elements * arr->element_size),
331 arr->data,
size_t(arr->num_of_elements * arr->element_size));
335 template<
typename T >
336 bool ToStdVector(SDKAnyType element_type, std::vector< T >& v)
const noexcept {
341 template<
typename T >
342 static bool ToStdSet(
const SDKArray* arr, SDKAnyType element_type,
343 std::set< T >& out) noexcept {
345 if (!arr || !arr->data || !arr->num_of_elements ||
346 (
sizeof(T) != arr->element_size) ||
350 const T* ptr =
reinterpret_cast<const T*
>(arr->data);
351 SDKUInt64 count = arr->num_of_elements;
352 for (SDKUInt64 i = 0; i < count; ++i) {
360 SDKArray& arr) noexcept {
366 arr.num_of_elements = str.size();
368 arr.element_size = 1;
371 arr.num_of_elements))) {
374 SDKMemCopy(arr.data,
size_t(arr.num_of_elements * arr.element_size),
375 str.c_str(),
size_t(arr.num_of_elements * arr.element_size));
381 template <
typename _Elem,
typename _Alloc,
typename _SDKAnyHandler=SDKAnyHandler>
382 static bool FromStdString(
const std::basic_string<_Elem, _Alloc>& str,
383 SDKArray& arr) noexcept {
389 arr.num_of_elements = str.size();
391 _SDKAnyHandler::template TypeToSDKAnyType<_Elem>::value);
392 arr.element_size =
sizeof(_Elem);
395 arr.num_of_elements))) {
400 copy_n(str.c_str(),
size_t(arr.num_of_elements),
reinterpret_cast<_Elem *
>(arr.data));
408 std::string& str) noexcept {
412 if ((NULL != arr) && (NULL != arr->data) && (arr->num_of_elements > 0) &&
415 str.assign(arr->data,
416 arr->data +
size_t(arr->num_of_elements * arr->element_size));
442 : m_instance(instance)
448 return m_instance.element_type;
453 return m_instance.element_size;
458 return m_instance.num_of_elements;
463 return m_instance.data;
468 return m_instance.data;
487 SDKArray&
Get() noexcept {
492 const SDKArray&
Get() const noexcept {
502 SDKArray& m_instance;
508 T GetArrayElement(
const SDKArray& arr, SDKUInt64 idx)
510 if (idx >= arr.num_of_elements)
511 throw std::runtime_error(
"Index out of range in GetArrayElement()");
512 if (NULL == arr.data)
513 throw std::runtime_error(
"Empty array passed in GetArrayElement()");
515 switch(arr.element_type) {
521 return static_cast<T
>(
reinterpret_cast<SDKUInt8*
>(arr.data)[idx]);
523 return static_cast<T
>(
reinterpret_cast<SDKUInt16*
>(arr.data)[idx]);
525 return static_cast<T
>(
reinterpret_cast<SDKUInt32*
>(arr.data)[idx]);
527 return static_cast<T
>(
reinterpret_cast<SDKUInt64*
>(arr.data)[idx]);
529 return static_cast<T
>(
reinterpret_cast<SDKInt8*
>(arr.data)[idx]);
531 return static_cast<T
>(
reinterpret_cast<SDKInt16*
>(arr.data)[idx]);
533 return static_cast<T
>(
reinterpret_cast<SDKInt32*
>(arr.data)[idx]);
535 return static_cast<T
>(
reinterpret_cast<SDKInt64*
>(arr.data)[idx]);
537 return static_cast<T
>(
reinterpret_cast<float*
>(arr.data)[idx]);
539 return static_cast<T
>(
reinterpret_cast<double*
>(arr.data)[idx]);
541 return static_cast<T
>(
reinterpret_cast<bool*
>(arr.data)[idx]);
543 return static_cast<T
>(
reinterpret_cast<SDKTime*
>(arr.data)[idx]);
555 throw std::runtime_error(
"Unsupported type met in GetArrayElement()");
559 bool GetArrayElement(
const SDKArray& arr, SDKUInt64 index, T& val) noexcept
561 if (NULL == arr.data)
563 if (index >= arr.num_of_elements)
566 const SDKUInt8* ptr = arr.data + (index * arr.element_size);
567 SDKMemCopy(&val,
sizeof(val), ptr, arr.element_size);
572 bool SetArrayElement(
const SDKArray& arr, SDKUInt64 index,
const T& val) noexcept
574 if (NULL == arr.data)
576 if (index >= arr.num_of_elements)
578 SDKUInt8* ptr = arr.data + (index * arr.element_size);
579 SDKMemCopy(ptr, arr.element_size, &val,
sizeof(val));
584 bool GetAllArrayElements(
const SDKArray& arr, T* buffer) {
587 if (NULL == arr.data)
589 for (
size_t idx = 0; idx < arr.num_of_elements; ++idx)
590 buffer[idx] = GetArrayElement<T>(arr, idx);
612 if (arr1->num_of_elements != arr2->num_of_elements)
614 if (arr1->element_type != arr2->element_type)
616 if (arr1->element_size != arr2->element_size)
619 if (0 == arr1->num_of_elements)
622 if (NULL == arr1->data || NULL == arr2->data)
625 size_t size =
static_cast<size_t>(arr1->num_of_elements * arr1->element_size);
627 int cmp = memcmp(arr1->data, arr2->data, size);
629 int cmp = std::memcmp(arr1->data, arr2->data, size);
637 #endif // SDK_SDK_ARRAY_HANDLER_H_