NAVTOR SDK  v.3.0
Software Development Kit for fast and efficient development of ECDIS, ECS and generic marine applications
sdk_any_handler.h
Go to the documentation of this file.
1 #ifndef SDK_SDK_ANY_HANDLER_H_
11 #define SDK_SDK_ANY_HANDLER_H_
12 
13 #include <cwchar>
14 #include <memory>
15 #include <string>
16 #include <algorithm>
17 #include <base/inc/platform.h>
18 #include <base/inc/base_types.h>
23 
24 namespace sdk {
25 
26 inline SDKUInt64 GetSDKAnySize(const SDKAny& any);
27 inline SDKUInt64 GetSDKStringSize(const SDKString& str);
28 inline SDKUInt64 GetSDKArraySize(const SDKArray& arr);
29 
32 class SDKAnyHandler : public SDKAny {
33 public:
34  SDKAnyHandler() noexcept {
35  ANY_TYPE(this) = kSDKAnyType_Empty;
36  ANY_UI64(this) = 0;
37  }
38 
39  explicit SDKAnyHandler(const SDKInt8/*&*/ i8) noexcept {
40  ANY_TYPE(this) = kSDKAnyType_Int8;
41  ANY_I8(this) = i8;
42  }
43 
44  explicit SDKAnyHandler(const SDKUInt8/*&*/ ui8) noexcept {
45  ANY_TYPE(this) = kSDKAnyType_Uint8;
46  ANY_UI8(this) = ui8;
47  }
48 
49  explicit SDKAnyHandler(const SDKInt16/*&*/ i16) noexcept {
50  ANY_TYPE(this) = kSDKAnyType_Int16;
51  ANY_I16(this) = i16;
52  }
53 
54  explicit SDKAnyHandler(const SDKUInt16/*&*/ ui16) noexcept {
55  ANY_TYPE(this) = kSDKAnyType_Uint16;
56  ANY_UI16(this) = ui16;
57  }
58 
59  explicit SDKAnyHandler(const SDKInt32/*&*/ i32) noexcept {
60  ANY_TYPE(this) = kSDKAnyType_Int32;
61  ANY_I32(this) = i32;
62  }
63 
64  explicit SDKAnyHandler(const SDKUInt32/*&*/ ui32) noexcept {
65  ANY_TYPE(this) = kSDKAnyType_Uint32;
66  ANY_UI32(this) = ui32;
67  }
68 
69  explicit SDKAnyHandler(const SDKInt64/*&*/ i64) noexcept {
70  ANY_TYPE(this) = kSDKAnyType_Int64;
71  ANY_I64(this) = i64;
72  }
73 
74  explicit SDKAnyHandler(const SDKInt64/*&*/ i64,
75  SDKAnyTypeEnum any_type) noexcept {
76  ANY_TYPE(this) = any_type;
77  ANY_I64(this) = i64;
78  }
79 
80  explicit SDKAnyHandler(const SDKUInt64/*&*/ ui64) noexcept {
81  ANY_TYPE(this) = kSDKAnyType_Uint64;
82  ANY_UI64(this) = ui64;
83  }
84 
85  explicit SDKAnyHandler(const SDKUInt64/*&*/ ui64,
86  SDKAnyTypeEnum any_type) noexcept {
87  ANY_TYPE(this) = any_type;
88  ANY_UI64(this) = ui64;
89  }
90 #if defined(SDK_ARCH_32BITS)
91  explicit SDKAnyHandler(const int/*&*/ ival) noexcept {
92  ANY_TYPE(this) = kSDKAnyType_Int64;
93  ANY_I64(this) = ival;
94  }
95 
96  explicit SDKAnyHandler(const unsigned int/*&*/ uival) noexcept {
97  ANY_TYPE(this) = kSDKAnyType_Uint64;
98  ANY_UI64(this) = uival;
99  }
100 #endif
101 #if defined(SDK_ARCH_64BITS) && defined(SDK_CC_MSVC)
102  explicit SDKAnyHandler(const long/*&*/ ival) noexcept {
103  ANY_TYPE(this) = kSDKAnyType_Int64;
104  ANY_I64(this) = ival;
105  }
106 
107  explicit SDKAnyHandler(const unsigned long/*&*/ uival) noexcept {
108  ANY_TYPE(this) = kSDKAnyType_Uint64;
109  ANY_UI64(this) = uival;
110  }
111 #endif
112  explicit SDKAnyHandler(const float/*&*/ flt) noexcept {
113  ANY_TYPE(this) = kSDKAnyType_Float;
114  ANY_FLOAT(this) = flt;
115  }
116 
117  explicit SDKAnyHandler(const double/*&*/ dbl) noexcept {
118  ANY_TYPE(this) = kSDKAnyType_Double;
119  ANY_DOUBLE(this) = dbl;
120  }
121 
122  explicit SDKAnyHandler(const bool/*&*/ bl) noexcept {
123  ANY_TYPE(this) = kSDKAnyType_Bool;
124  ANY_BOOL(this) = bl;
125  }
126 
127  explicit SDKAnyHandler(const SDKTime/*&*/ time, bool /*is_time*/) noexcept {
128  ANY_TYPE(this) = kSDKAnyType_SDKTime;
129  ANY_DATE(this) = time;
130  }
131 
132  explicit SDKAnyHandler(const SDKAny& any) {
133  ANY_TYPE(this) = kSDKAnyType_Empty;
134  SDKAnyDuplicate(&any, this);
135  }
136 
137  explicit SDKAnyHandler(const SDKString& str) {
138  SDKAnyInitString(this);
139  SDKStringDuplicate(&str, ANY_STR(this));
140  }
141 
142  explicit SDKAnyHandler(const std::wstring& str) {
143  SDKAnyInitString(this);
144  SDKStringCreateW(ANY_STR(this), str.c_str(),
145  static_cast<SDKUInt32>(str.size()));
146  }
147 
148  explicit SDKAnyHandler(const std::string& str) {
149  SDKAnyInitString(this);
150  SDKStringCreateA(ANY_STR(this), str.c_str(),
151  static_cast<SDKUInt32>(str.size()));
152  }
153 
154  explicit SDKAnyHandler(const wchar_t* str) noexcept {
155  SDKAnyInitString(this);
156  if (str) {
157  SDKStringCreateW(ANY_STR(this), str, static_cast<SDKUInt32>(wcslen(str)));
158  }
159  }
160 
161  explicit SDKAnyHandler(const char* str) noexcept {
162  SDKAnyInitString(this);
163  if (str) {
164  SDKStringCreateA(ANY_STR(this), str, static_cast<SDKUInt32>(strlen(str)));
165  }
166  }
167 
168  SDKAnyHandler(SDKAny& any, bool duplicate) {
169  ANY_TYPE(this) = kSDKAnyType_Empty;
170  if (duplicate)
171  SDKAnyDuplicate(&any, this);
172  else
173  Attach(any);
174  }
175 
176  SDKAnyHandler(SDKString& str, bool duplicate) {
177  if (duplicate) {
178  SDKAnyInitString(this);
179  SDKStringDuplicate(&str, ANY_STR(this));
180  } else {
181  ANY_TYPE(this) = kSDKAnyType_Empty;
182  Attach(str);
183  }
184  }
185 
186  SDKAnyHandler(const SDKAnyHandler& any) {
187  ANY_TYPE(this) = kSDKAnyType_Empty;
188  SDKAnyDuplicate(&any, this);
189  }
190 
191  explicit SDKAnyHandler(const SDKStringHandler& str) {
192  SDKAnyInitString(this);
193  SDKStringDuplicate(&str.GetReference(), ANY_STR(this));
194  }
195 
196  explicit SDKAnyHandler(const SDKArrayHandler& arr) {
197  SDKAnyInitArray(this, arr.GetType(), arr.GetElementSize());
198  SDKArrayDuplicate(&arr.GetReference(), ANY_ARRAY(this));
199  }
200 
201  explicit SDKAnyHandler(const SDKComponentSP& obj) noexcept {
202  #if 1
203  ANY_TYPE(this) = kSDKAnyType_SDKComponentPtr;
204  ANY_COMPONENT(this) = obj;
205  if (ANY_COMPONENT(this)) {
206  ANY_COMPONENT(this)->AddRef();
207  }
208  #else
209  ANY_TYPE(this) = kSDKAnyType_Null;
210  ANY_COMPONENT(this) = obj;
211  if (ANY_COMPONENT(this)) {
212  ANY_TYPE(this) = kSDKAnyType_SDKComponentPtr;
213  ANY_COMPONENT(this)->AddRef();
214  }
215  #endif
216  }
217 
218  explicit SDKAnyHandler(sdk::ISDKComponent* obj) noexcept {
219  #if 1
220  ANY_TYPE(this) = kSDKAnyType_SDKComponentPtr;
221  ANY_COMPONENT(this) = obj;
222  if (ANY_COMPONENT(this)) {
223  ANY_COMPONENT(this)->AddRef();
224  }
225  #else
226  ANY_TYPE(this) = kSDKAnyType_Null;
227  ANY_COMPONENT(this) = obj;
228  if (ANY_COMPONENT(this)) {
229  ANY_TYPE(this) = kSDKAnyType_SDKComponentPtr;
230  ANY_COMPONENT(this)->AddRef();
231  }
232  #endif
233  }
234 
235  SDKAnyHandler(SDKAnyType element_type, SDKUInt32 element_size,
236  SDKUInt64 num_of_elements) noexcept {
237  SDKAnyInit(this);
238  SDKArrayHandler arr(element_type, element_size, num_of_elements);
239  *static_cast<SDKAny*>(this) = arr.DetachAsAny();
240  }
241 
242  SDKAnyHandler(SDKAnyType element_type, SDKUInt32 element_size,
243  SDKUInt64 num_of_elements, const void* init_data,
244  SDKUInt64 data_size) noexcept {
245  SDKAnyInit(this);
246  SDKArrayHandler arr(element_type, element_size, num_of_elements, init_data,
247  data_size);
248  *static_cast<SDKAny*>(this) = arr.DetachAsAny();
249  }
250 
253  Clear();
254  }
255 
257  SDKAnyHandler& operator=(const SDKAny& any) noexcept {
258  if (this != &any) {
259  Clear();
260  SDKAnyDuplicate(&any, this);
261  }
262  return *this;
263  }
264 
266  SDKAnyHandler& operator=(const SDKAnyHandler& any) noexcept {
267  if (this != &any) {
268  Clear();
269  SDKAnyDuplicate(&any, this);
270  }
271  return *this;
272  }
273 
274 #if defined(SDK_HAS_CXX0X_RVALUE_REFS)
275  // C++0x is supported
276  //SDKAnyHandler(SDKAny&& any) throw ()
277  //{
278  // *static_cast<SDKAny*>(this) = any;
279  // ANY_TYPE(&any) = kSDKAnyType_Empty;
280  //}
281  //explicit SDKAnyHandler(SDKString&& str) throw ()
282  //{
283  // ANY_TYPE(this) = kSDKAnyType_Empty;
284  // Attach(str);
285  //}
286 
287  SDKAnyHandler(SDKAnyHandler&& any) noexcept {
288  *static_cast<SDKAny*>(this) = any;
289  ANY_TYPE(&any) = kSDKAnyType_Empty;
290  }
291 
292  explicit SDKAnyHandler(SDKStringHandler&& str) noexcept {
293  ANY_TYPE(this) = kSDKAnyType_Empty;
294  Attach(str);
295  }
296 
297  explicit SDKAnyHandler(SDKArrayHandler&& arr) {
298  SDKAnyInitArray(this, arr.GetType(), arr.GetElementSize());
299  SDKArrayDuplicate(&arr.GetReference(), ANY_ARRAY(this));
300  }
301 
303  //SDKAnyHandler& operator=(SDKAny&& any) {
304  // if (this != &any)
305  // {
306  // Clear();
307  // *static_cast<SDKAny*>(this) = any;
308  // ANY_TYPE(&any) = kSDKAnyType_Empty;
309  // }
310  // return *this;
311  //}
312 
314  SDKAnyHandler& operator=(SDKAnyHandler&& any) {
315  if (this != &any) {
316  Clear();
317  *static_cast<SDKAny*>(this) = any;
318  ANY_TYPE(&any) = kSDKAnyType_Empty;
319  }
320  return *this;
321  }
322 #endif
323  //bool operator==(const SDKAny& any_src) const noexcept {
325  // return (kSDKResult_True == SDKAnyCompare(this, &any_src));
326  //}
327 
328  //bool operator!=(const SDKAny& any_src) const noexcept {
329  // return !operator==(any_src);
330  //}
331 
333  friend bool operator==(const SDKAny& any_lhs, const SDKAny& any_rhs) noexcept {
334  return (kSDKResult_True == SDKAnyCompare(&any_lhs, &any_rhs));
335  }
336 
337  friend bool operator!=(const SDKAny& any_lhs, const SDKAny& any_rhs) noexcept {
338  return (kSDKResult_True != SDKAnyCompare(&any_lhs, &any_rhs));
339  }
340 
341 #if defined(__GNUC__)
342  const SDKAny* operator&() const noexcept {
346  return (this);
347  }
348 
349  SDKAny* operator&() noexcept {
350  return (this);
351  }
352 #endif
353 
355  //operator SDKAny&() noexcept {
356  // return (*this);
357  //}
358 
360  //operator const SDKAny&() const noexcept {
361  // return (*this);
362  //}
363 
365  SDKAnyHandler& Attach(const SDKAny& any) noexcept {
366  Clear();
367  *static_cast<SDKAny*>(this) = any;
368  SDKAnyInit(&(const_cast<SDKAny&>(any))); // clear input variable
369  return *this;
370  }
371 
373  SDKAnyHandler& Attach(const SDKString& str) noexcept {
374  Clear();
375  if (kSDKResult_Succeeded == SDKAnyInitString(this)) {
376  *ANY_STR(this) = str;
377  SDKStringInit(&(const_cast<SDKString&>(str))); // clear input variable
378  }
379  return *this;
380  }
381 
383  SDKAnyHandler& Attach(const SDKArray& arr) noexcept {
384  Clear();
385  SDKArrayHandler handler;
386  handler.Attach(const_cast<SDKArray&>(arr));
387  *static_cast<SDKAny*>(this) = handler.DetachAsAny();
388  return *this;
389  }
390 
392  SDKAny Detach() noexcept {
393  SDKAny any = (*this);
394  ANY_TYPE(this) = kSDKAnyType_Empty;
395  return any;
396  }
397 
399  SDKString DetachAsString() noexcept {
400  if (IsString()) {
401  SDKString& int_ref = *ANY_STR(this);
402  SDKString str_copy = int_ref;
403  SDKStringInit(&int_ref);
404  SDKAnyClear(this);
405  return str_copy;
406  }
407  SDKString empty_str;
408  SDKStringInit(&empty_str);
409  return empty_str;
410  }
411 
413  SDKArray DetachAsArray() noexcept {
414  if (IsArray()) {
415  SDKArray& int_ref = *ANY_ARRAY(this);
416  SDKArray arr_copy = int_ref;
417  SDKArrayInit(&int_ref);
418  SDKAnyClear(this);
419  return arr_copy;
420  }
421  SDKArray empty_arr;
422  SDKArrayInit(&empty_arr);
423  return empty_arr;
424  }
425 
427  void Clear() noexcept {
428  SDKAnyClear(this);
429  }
430 
432  SDKAnyType GetType() const noexcept {
433  return ANY_TYPE(this);
434  }
435 
437  bool IsEmpty() const noexcept {
438  return IsSDKAnyEmpty(*this);
439  }
440 
442  bool IsNULL() const noexcept {
443  return IsSDKAnyNull(*this);
444  }
445 
447  bool IsEmptyOrNULL() const noexcept {
448  return IsSDKAnyEmpty(*this) || IsSDKAnyNull(*this);
449  }
450 
452  bool IsInteger() const noexcept {
453  return IsSDKAnyInteger(*this);
454  }
455 
457  bool IsNumeric() const noexcept {
458  return IsSDKAnyNumeric(*this);
459  }
460 
462  bool IsString() const noexcept {
463  return IsSDKAnyString(*this);
464  }
465 
467  bool IsArray() const noexcept {
468  return IsSDKAnyArray(*this);
469  }
470 
472  bool IsComponent() const noexcept {
473  return IsSDKAnyComponent(*this);
474  }
475 
477  SDKResult ChangeType(SDKAnyType new_type) noexcept {
478  return SDKAnyChangeType(this, new_type);
479  }
480 
482  SDKResult Compare(const SDKAny& any_src) const noexcept {
483  return SDKAnyCompare(this, &any_src);
484  }
485 
486  template< typename T >
487  bool GetAs(T& value) const {
488  try
489  {
490  if (ANY_IS_EMPTY(this))
491  return false;
492  value = GetAnyValue< T >(*this);
493  } catch (...) {
494  return false;
495  }
496  return true;
497  }
498 
500  inline std::wstring WString() const noexcept {
501  std::wstring out_value;
502  if (GetAs< std::wstring >(out_value))
503  return out_value;
504  return std::wstring();
505  }
506 
507  inline std::wstring GetAsWString() const noexcept {
508  return WString();
509  }
510 
512  inline std::string ASCIIString() const noexcept {
513  std::string out_value;
514  if (GetAs< std::string >(out_value))
515  return out_value;
516  return std::string();
517  }
518 
519  inline std::string GetAsString() const noexcept {
520  return ASCIIString();
521  }
522 
523  template <typename T>
524  inline SDKResult GetInterface(T **obj_ptr) const noexcept {
525  if (kSDKAnyType_Empty == ANY_TYPE(this))
526  return kSDKResult_NULLPointer;
527  if (kSDKAnyType_Null == ANY_TYPE(this))
528  return kSDKResult_NULLPointer;
529  if (kSDKAnyType_SDKComponentPtr != ANY_TYPE(this))
531  if (NULL == (*this).obj)
532  return kSDKResult_NULLPointer;
533  return (*this).obj->GetInterface(T::IID(), (void**)obj_ptr);
534  }
535 
536  template <typename T>
537  inline SDKRefPtr<T> GetInterface() const noexcept {
538  SDKRefPtr<T> obj_ptr = NULL;
539  SDKResult res = GetInterface<T>(&obj_ptr);
540  if (SDK_OK(res))
541  return obj_ptr;
542  return NULL;
543  }
544 
545  SDKUInt64 GetSize() const {
546  return GetSDKAnySize(*this);
547  }
548 
549  SDKAny& GetReference() {
550  return (*this);
551  }
552 
553  const SDKAny& GetReference() const {
554  return (*this);
555  }
556 
557  SDKAny& Get() {
558  return (*this);
559  }
560 
561  const SDKAny& Get() const {
562  return (*this);
563  }
564 };
565 
570 
577 template<typename T>
580 public:
581  SDKAnyReturnHelper(T& value, const T* default_value = nullptr)
582  : m_value(value), m_default_value(default_value) {
583  ANY_TYPE(&m_any) = kSDKAnyType_Empty;
584  }
585 
586  ~SDKAnyReturnHelper() {
587  bool is_value_set = false;
588  try
589  {
590  if (!ANY_IS_EMPTY(&m_any)) {
591  m_value = GetAnyValue<T>(m_any);
592  is_value_set = true;
593  }
594 
595  if (!is_value_set && m_default_value)
596  m_value = *m_default_value;
597  } catch (...) {
598  }
599  SDKAnyClear(&m_any);
600  }
601 
602  operator SDKAny&() noexcept {
603  return m_any;
604  }
605 
606  operator const SDKAny&() const noexcept {
607  return m_any;
608  }
609 
610  SDKAny& GetReference() noexcept {
611  return m_any;
612  }
613 
616  : m_any(), m_value(rhs.m_value), m_default_value(rhs.m_default_value) {
617  SDKAnyDuplicate(&rhs.m_any, &m_any);
618  }
619 
620  MyType& operator=(const MyType& rhs) {
621  if (&rhs != this) {
622  SDKAnyClear(&m_any);
623  SDKAnyDuplicate(&rhs.m_any, &m_any);
624  }
625  return *this;
626  }
627 
628  #ifdef SDK_HAS_CXX0X_RVALUE_REFS
629  SDKAnyReturnHelper(MyType&& rhs)
630  : m_any(rhs.m_any), m_value(rhs.m_value),
631  m_default_value(rhs.m_default_value) {
632  ANY_TYPE(&rhs.m_any) = kSDKAnyType_Empty;
633  m_value = nullptr;
634  m_default_value = nullptr;
635  }
636 
637  MyType& operator=(MyType&& rhs) {
638  if (&rhs != this) {
639  SDKAnyClear(&m_any);
640  m_any = rhs.m_any;
641  m_value = rhs.m_value;
642  m_default_value = rhs.m_default_value;
643  ANY_TYPE(&rhs.m_any) = kSDKAnyType_Empty;
644  m_value = NULL;
645  m_default_value = nullptr;
646  }
647  return *this;
648  }
649  #endif
650 
651 private:
652  SDKAny m_any;
653  T &m_value;
654  const T *m_default_value;
655 };
656 
657 template <>
658 class SDKAnyReturnHelper<SDKAny> {
659  typedef SDKAnyReturnHelper<SDKAny> MyType;
660 public:
661  SDKAnyReturnHelper(SDKAny& value, const SDKAny *default_value = nullptr)
662  : m_value(&value), m_default_value(default_value) {
663  }
664 
665  ~SDKAnyReturnHelper() {
666  if (m_value && ANY_IS_EMPTY(m_value) && m_default_value)
667  SDKAnyDuplicate(m_default_value, m_value);
668  }
669 
670  SDKAnyReturnHelper(MyType& rhs)
671  : m_value(rhs.m_value), m_default_value(rhs.m_default_value) {
672  rhs.m_value = NULL;
673  }
674 
675  MyType& operator=(MyType& rhs) {
676  if (this != &rhs) {
677  m_value = rhs.m_value;
678  rhs.m_value = NULL;
679  m_default_value = rhs.m_default_value;
680  }
681  return *this;
682  }
683 
684  operator SDKAny&() noexcept {
685  return *m_value;
686  }
687 
688  operator const SDKAny&() const noexcept {
689  return *m_value;
690  }
691 
692  SDKAny& GetReference() noexcept {
693  return *m_value;
694  }
695 
696  const SDKAny& GetReference() const noexcept {
697  return *m_value;
698  }
699 
700 private:
701  mutable SDKAny* m_value;
702  mutable const SDKAny* m_default_value;
703 };
704 
705 template <typename T>
706 SDKAnyReturnHelper<T> MakeSDKAnyReturnHelper(T& value,
707  const T* default_value = nullptr) {
708  return SDKAnyReturnHelper<T>(value, default_value);
709 }
710 
711 inline SDKUInt64 GetSDKStringSize(const SDKString& str) {
712  return
713  sizeof(str.length) +
714  sizeof(str.data) +
715  str.length * sizeof(SDKUInt16);
716 }
717 
718 inline SDKUInt64 GetSDKArraySize(const SDKArray& arr) {
719  return
720  sizeof(arr.num_of_elements) +
721  sizeof(arr.element_type) +
722  sizeof(arr.element_size) +
723  sizeof(arr.data) +
724  arr.num_of_elements * arr.element_size;
725 }
726 
727 inline SDKUInt64 GetSDKAnySize(const SDKAny& any) {
728  SDKUInt64 size = sizeof(any.any_type);
729  switch (any.any_type) {
730  case kSDKAnyType_Empty: // = 0, ///< variable is empty
731  case kSDKAnyType_Null: // = 1, ///< null value or no value
732  case kSDKAnyType_Uint8: // = 2, ///< unsigned integer 8 bit value
733  case kSDKAnyType_Uint16: // = 3, ///< unsigned integer 16 bit value
734  case kSDKAnyType_Uint32: // = 4, ///< unsigned integer 32 bit value
735  case kSDKAnyType_Uint64: // = 5, ///< unsigned integer 64 bit value
736  case kSDKAnyType_Int8: // = 6, ///< signed integer 8 bit value
737  case kSDKAnyType_Int16: // = 7, ///< signed integer 16 bit value
738  case kSDKAnyType_Int32: // = 8, ///< signed integer 32 bit value
739  case kSDKAnyType_Int64: // = 9, ///< signed integer 64 bit value
740  case kSDKAnyType_Float: // = 10, ///< single precision real value
741  case kSDKAnyType_Double: // = 11, ///< double precision real value
742  case kSDKAnyType_Bool: // = 12, ///< boolean value
743  case kSDKAnyType_SDKTime: // = 13, ///< SDKTime
744  return size + sizeof(SDKUInt64);
745  case kSDKAnyType_SDKStringPtr: // = 14, ///< pointer to SDKString
746  return size + sizeof(SDKUInt64) + (any.str ? GetSDKStringSize(*any.str) : 0);
747  case kSDKAnyType_SDKAnyPtr: // = 15, ///< pointer to SDKAny
748  return size + sizeof(SDKUInt64) + (any.any ? GetSDKAnySize(*any.any) : 0);
749  case kSDKAnyType_SDKArrayPtr: // = 16, ///< pointer to SDKArray
750  return size + sizeof(SDKUInt64) + (any.arr ? GetSDKArraySize(*any.arr) : 0);
751  case kSDKAnyType_SDKComponentPtr: // = 17, ///< pointer to ISDKComponent
752  return size + sizeof(SDKUInt64); // TODO: get IOccupiedSize?
753  case kSDKAnyType_SDKTimePacked: // = 18, ///< SDKTime packed structure
754  case kSDKAnyType_SDKTimeDelta: // = 19, ///< Time delta
755  return size + sizeof(SDKUInt64);
756  case kSDKAnyType_UserPtr: // = 255 ///< user defined type of any size
757  return size + sizeof(SDKUInt64);
758  }
759  return size + sizeof(SDKUInt64);
760 }
761 
768 
770 
771 namespace sdk_any_handler_detail {
772 
773 // Calculates a pair of the UTF-8 string
774 // and UTF-32 string lengths corresponded
775 // to the UTF-16 string respectively.
776 inline std::pair<SDKUInt32, SDKUInt32> lengths_of_utf16_string(
777  const SDKUInt16 *src, size_t size) {
778  std::pair<SDKUInt32, SDKUInt32> lengths(0, SDKUInt32(size));
779  for (size_t i = 0; i < size; ++i) {
780  if (src[i] < 0x80) {
781  lengths.first += 1;
782  } else if (src[i] < 0x800) {
783  lengths.first += 2;
784  } else {
785  if ((src[i] & 0xFFFFFC00) == 0xD800) { // Probably a surrogate pair
786  if ((src[i] & 0x400) != 0
787  || ++i >= size
788  || (src[i] & 0xFFFFFC00) != 0xDC00) { // Bad Unicode character
789  lengths.first = static_cast<SDKUInt32>(i);
790  lengths.second = static_cast<SDKUInt32>(-1);
791  break;
792  }
793  lengths.first += 4;
794  lengths.second -= 1;
795  } else {
796  lengths.first += 3;
797  }
798  }
799  }
800  return lengths;
801 }
802 
803 template <typename _Elem, typename _Traits, typename _Ax>
804 bool sdk_string_to_std_string(const SDKString& sdk_string,
805  std::basic_string<_Elem, _Traits, _Ax>& str, std::true_type) noexcept {
806  str.clear();
807  if (0 != sdk_string.length && NULL != sdk_string.data) {
808  try
809  {
810  #if 0 && defined(SDK_OS_WIN)
811  const wchar_t *src = reinterpret_cast<const wchar_t*>(sdk_string.data);
812  enum {
813  _CP_UTF8 = 65001,
814  _WC_ERR_INVALID_CHARS = 0x80,
815  };
816  int dst_len = WideCharToMultiByte(_CP_UTF8, _WC_ERR_INVALID_CHARS, src,
817  int(sdk_string.length), NULL, 0, NULL, NULL);
818  if (dst_len != 0) {
819  char *dst = (char*)std::alloca(dst_len + 1);
820  WideCharToMultiByte(_CP_UTF8, _WC_ERR_INVALID_CHARS, src,
821  int(sdk_string.length), dst, dst_len, NULL, NULL);
822  dst[dst_len] = 0;
823  str.assign(dst, dst + dst_len);
824  }
825  #else
826  const SDKUInt16 *src = sdk_string.data;
827  std::pair<SDKUInt32, SDKUInt32> lengths = lengths_of_utf16_string(
828  src, sdk_string.length);
829  if (lengths.second == SDKUInt32(-1)) { // Bad Unicode character
830  return false;
831  }
832  str.reserve(lengths.first);
833  for (SDKUInt32 i = 0; i < sdk_string.length; ++i) {
834  SDKUInt32 utf32_symb = SDKUInt32(src[i]);
835  if (utf32_symb < 0x80) {
836  str.push_back(_Elem(utf32_symb));
837  } else { // if (utf32_symb < 0x80000000)
838  if ((utf32_symb & 0xFFFFFC00) == 0xD800) { // Sure the surrogate pair
839  utf32_symb = (utf32_symb << 10) + src[i + 1] - ((0xD800 << 10) +
840  0xDC00 - 0x10000);
841  ++i;
842  }
843  int range = 1;
844  if (utf32_symb < 0x800)
845  ; // range = 1;
846  else if (utf32_symb < 0x10000)
847  range = 2;
848  else if (utf32_symb < 0x200000)
849  range = 3;
850  else if (utf32_symb < 0x4000000)
851  range = 4;
852  else if (utf32_symb < 0x80000000)
853  range = 5;
854 
855  _Elem utf8_symb[6];
856  utf8_symb[0] = _Elem((0xFC << (5 - range)) +
857  ((utf32_symb >> (6 * range)) & (0x3F >> range)));
858  switch (range - 1) {
859  case 4:
860  utf8_symb[range - 4] = char(0x80 + ((utf32_symb >> 24) & 0x3F)); break;
861  case 3:
862  utf8_symb[range - 3] = char(0x80 + ((utf32_symb >> 18) & 0x3F)); break;
863  case 2:
864  utf8_symb[range - 2] = char(0x80 + ((utf32_symb >> 12) & 0x3F)); break;
865  case 1:
866  utf8_symb[range - 1] = char(0x80 + ((utf32_symb >> 06) & 0x3F)); break;
867  case 0:
868  utf8_symb[range - 0] = char(0x80 + ((utf32_symb >> 00) & 0x3F)); break;
869  default:
870  break;
871  }
872  str.append(utf8_symb, range + 1);
873  }
874  }
875  #endif
876  } catch (...) {
877  str.clear();
878  return false;
879  }
880  }
881  //TODO: handle errors
882  return true;
883 }
884 
885 template <typename _Elem, typename _Traits, typename _Ax>
886 bool sdk_string_to_std_string(const SDKString& sdk_string,
887  std::basic_string<_Elem, _Traits, _Ax>& str, std::false_type) noexcept {
888  str.clear();
889  if (0 != sdk_string.length && NULL != sdk_string.data) {
890  try
891  {
892  if (sizeof(_Elem) == sizeof(sdk_string.data[0])) { // UTF16 wstring encoding case
893  str.assign((_Elem*)sdk_string.data, sdk_string.length);
894  } else { // UTF32 wstring encoding case -- convert UTF16 SDKString to UTF32
895  const SDKUInt16 *src = sdk_string.data;
896  std::pair<SDKUInt32, SDKUInt32> lengths = lengths_of_utf16_string(
897  src, sdk_string.length);
898  if (lengths.second == SDKUInt32(-1)) { // Bad Unicode character
899  return false;
900  }
901  str.reserve(lengths.second);
902  for (SDKUInt32 i = 0; i < sdk_string.length; ++i) {
903  SDKUInt32 utf32_symb = SDKUInt32(src[i]);
904  if (((utf32_symb & 0xFFFFFC00) == 0xD800)) { // Surrogate pair
905  utf32_symb = (utf32_symb << 10) + src[i + 1] - ((0xD800 << 10) +
906  0xDC00 - 0x10000);
907  ++i;
908  }
909  str.push_back(_Elem(utf32_symb));
910  }
911  }
912  } catch (...) {
913  str.clear();
914  return false;
915  }
916  }
917  //TODO: handle errors
918  return true;
919 }
920 
921 } // namespace sdk_any_handler_detail
922 
924 template <typename _Elem, typename _Traits, typename _Ax>
925 class SDKAnyReturnHelper< std::basic_string<_Elem, _Traits, _Ax> > {
926  typedef std::basic_string<_Elem, _Traits, _Ax> string;
927  typedef typename string::value_type value_type;
929 public:
930  explicit SDKAnyReturnHelper(string& wstr)
931  : m_value(&wstr), m_default_value(nullptr) {
932  ANY_TYPE(&m_any) = kSDKAnyType_Empty;
933  }
934 
935  SDKAnyReturnHelper(string& wstr, const string* default_value)
936  : m_value(&wstr), m_default_value(default_value) {
937  ANY_TYPE(&m_any) = kSDKAnyType_Empty;
938  }
939 
940  ~SDKAnyReturnHelper() {
941  if (m_value) {
942  if (IsSDKAnyString(m_any)) {
943  sdk_any_handler_detail::sdk_string_to_std_string(*m_any.str, *m_value,
944  std::integral_constant<bool, sizeof(_Elem) == sizeof(char)>());
945  } else if (m_default_value) {
946  *m_value = *m_default_value;
947  }
948  }
949  SDKAnyClear(&m_any);
950  }
951 
952  operator SDKAny&() noexcept {
953  return m_any;
954  }
955 
956  operator const SDKAny&() const noexcept {
957  return m_any;
958  }
959 
960  SDKAny& GetReference() {
961  return m_any;
962  }
963 
964  //private:
967  : m_any(), m_value(rhs.m_value), m_default_value(rhs.m_default_value) {
968  ANY_TYPE(&m_any) = kSDKAnyType_Empty;
969  SDKAnyDuplicate(&rhs.m_any, &m_any);
970  }
971 
972  MyType& operator=(const MyType& rhs) {
973  if (&rhs != this) {
974  SDKAnyClear(&m_any);
975  SDKAnyDuplicate(&rhs.m_any, &m_any);
976  m_value = rhs.m_value;
977  m_default_value = rhs.m_default_value;
978  }
979  return *this;
980  }
981 
982 #ifdef SDK_HAS_CXX0X_RVALUE_REFS
983  SDKAnyReturnHelper(MyType&& rhs)
984  : m_any(rhs.m_any), m_value(rhs.m_value),
985  m_default_value(rhs.m_default_value) {
986  ANY_TYPE(&rhs.m_any) = kSDKAnyType_Empty;
987  rhs.m_value = NULL;
988  rhs.m_default_value = NULL;
989  }
990 
991  MyType& operator=(MyType&& rhs) {
992  if (&rhs != this) {
993  SDKAnyClear(&m_any);
994  m_any = rhs.m_any;
995  m_value = rhs.m_value;
996  m_default_value = rhs.m_default_value;
997  ANY_TYPE(&rhs.m_any) = kSDKAnyType_Empty;
998  rhs.m_value = NULL;
999  rhs.m_default_value = NULL;
1000  }
1001  return *this;
1002  }
1003 #endif
1004 
1005 private:
1006  SDKAny m_any;
1007  string* m_value;
1008  const string* m_default_value;
1009 };
1010 
1011 } // namespace sdk
1012 
1013 #endif // SDK_SDK_ANY_HANDLER_H_
SDKStringInit
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringInit(SDKString *str)
Initializes SDKString structure.
sdk::SDKAnyHandler::IsString
bool IsString() const noexcept
Returns true if any is a valid string.
Definition: sdk_any_handler.h:462
sdk::SDKAnyHandler::IsEmptyOrNULL
bool IsEmptyOrNULL() const noexcept
Returns true if any is an empty or null value.
Definition: sdk_any_handler.h:447
sdk::SDKAnyReturnHelper
Helps to get value results from SDKAny interface output parameters.
Definition: sdk_any_handler.h:578
sdk::SDKArrayHandler::GetReference
SDKArray & GetReference() noexcept
Returns the reference.
Definition: sdk_array_handler.h:194
sdk::SDKAnyHandler::DetachAsArray
SDKArray DetachAsArray() noexcept
Detaches array from any.
Definition: sdk_any_handler.h:413
sdk::SDKAnyHandler::DetachAsString
SDKString DetachAsString() noexcept
Detaches string from any.
Definition: sdk_any_handler.h:399
SDKStringCreateA
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringCreateA(SDKString *str, const char *ascii_string, SDKUInt32 size)
Creates SDKString and initializes it with specified string, if 'size' is not 0, only 'size' chars are...
sdk::SDKAnyReturnHelper::SDKAnyReturnHelper
SDKAnyReturnHelper(const MyType &rhs)
Disallow copy and assign.
Definition: sdk_any_handler.h:615
sdk::SDKAnyHandler::operator=
SDKAnyHandler & operator=(const SDKAnyHandler &any) noexcept
Assign operator.
Definition: sdk_any_handler.h:266
sdk::SDKAnyHandler::Attach
SDKAnyHandler & Attach(const SDKAny &any) noexcept
Attaches a new any value.
Definition: sdk_any_handler.h:365
kSDKAnyType_Uint16
@ kSDKAnyType_Uint16
unsigned integer 16 bit value
Definition: base_types.h:141
sdk::SDKAnyHandler::IsEmpty
bool IsEmpty() const noexcept
Returns true if any is an empty value.
Definition: sdk_any_handler.h:437
base_types.h
SDK base types.
SDKAnyInitString
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyInitString(SDKAny *any)
Initializes SDKAny value to contain pointer to empty SDKString.
SDKAnyInit
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyInit(SDKAny *any)
Initializes SDKAny value to empty state.
sdk::SDKAnyHandler::Clear
void Clear() noexcept
Clears the any contents.
Definition: sdk_any_handler.h:427
kSDKAnyType_Bool
@ kSDKAnyType_Bool
boolean value
Definition: base_types.h:152
sdk::SDKArrayHandler::GetElementSize
SDKUInt32 GetElementSize() const noexcept
Returns the size of the element.
Definition: sdk_array_handler.h:169
sdk::SDKAnyHandler::Compare
SDKResult Compare(const SDKAny &any_src) const noexcept
Compares ScopedAny with the specified SDKAny.
Definition: sdk_any_handler.h:482
kSDKAnyType_Uint64
@ kSDKAnyType_Uint64
unsigned integer 64 bit value
Definition: base_types.h:143
SDKAnyClear
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyClear(SDKAny *any)
Clears SDKAny value (deleting complex types)
kSDKAnyType_Uint8
@ kSDKAnyType_Uint8
unsigned integer 8 bit value
Definition: base_types.h:140
sdk::SDKAnyHandler::ChangeType
SDKResult ChangeType(SDKAnyType new_type) noexcept
Changes an any type.
Definition: sdk_any_handler.h:477
kSDKAnyType_Int32
@ kSDKAnyType_Int32
signed integer 32 bit value
Definition: base_types.h:146
sdk::SDKAnyHandler::IsComponent
bool IsComponent() const noexcept
Returns true if any is a valid component reference.
Definition: sdk_any_handler.h:472
sdk::SDKAnyHandler::Detach
SDKAny Detach() noexcept
Detaches the any contents.
Definition: sdk_any_handler.h:392
sdk::SDKAnyHandler::IsNULL
bool IsNULL() const noexcept
Returns true if any is a null value.
Definition: sdk_any_handler.h:442
kSDKAnyType_Float
@ kSDKAnyType_Float
single precision real value
Definition: base_types.h:149
sdk::SDKAnyReturnHelper< std::basic_string< _Elem, _Traits, _Ax > >::SDKAnyReturnHelper
SDKAnyReturnHelper(const MyType &rhs)
Disallow copy and assign.
Definition: sdk_any_handler.h:966
kSDKAnyType_Null
@ kSDKAnyType_Null
null value or no value
Definition: base_types.h:139
sdk::SDKAnyHandler::Attach
SDKAnyHandler & Attach(const SDKString &str) noexcept
Attaches existing value taking over the ownership.
Definition: sdk_any_handler.h:373
kSDKResult_Succeeded
static const SDKResult kSDKResult_Succeeded
Operation completed successfully.
Definition: sdk_results.h:22
sdk::SDKArrayHandler::GetType
SDKAnyType GetType() const noexcept
Returns the type of the element.
Definition: sdk_array_handler.h:164
kSDKAnyType_Empty
@ kSDKAnyType_Empty
variable is empty
Definition: base_types.h:138
sdk_string_handler.h
Wrappers and helper functions for SDKString.
sdk::SDKAnyHandler::~SDKAnyHandler
~SDKAnyHandler()
Destroys internal any.
Definition: sdk_any_handler.h:252
SDKArrayInit
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKArrayInit(SDKArray *arr)
Initialize SDKArray structure.
SDKResult
SDKInt32 SDKResult
Type of all error or return codes which SDK functions can end with.
Definition: sdk_results.h:17
sdk::SDKStringHandler
This class wraps the SDKString type.
Definition: sdk_string_handler.h:100
sdk::SDKArrayHandler
This class wraps the SDKArray type.
Definition: sdk_array_handler.h:33
kSDKAnyType_Uint32
@ kSDKAnyType_Uint32
unsigned integer 32 bit value
Definition: base_types.h:142
kSDKAnyType_UserPtr
@ kSDKAnyType_UserPtr
user defined type of any size
Definition: base_types.h:163
SDKAnyCompare
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyCompare(const SDKAny *any1, const SDKAny *any2)
Compares two SDKAny.
sdk_any_helpers.h
Helper functions for SDKAny type.
sdk::SDKAnyHandler::ASCIIString
std::string ASCIIString() const noexcept
Returns SDKAny as std::string.
Definition: sdk_any_handler.h:512
SDKRefPtr
A smart pointer class for managing SDK components interface pointers.
Definition: sdk_ref_ptr.h:23
sdk::SDKAnyHandler::IsNumeric
bool IsNumeric() const noexcept
Returns true if any is a ordinary number or a bool.
Definition: sdk_any_handler.h:457
sdk::SDKAnyHandler::IsInteger
bool IsInteger() const noexcept
Returns true if any is a ordinary number or a bool.
Definition: sdk_any_handler.h:452
kSDKAnyType_Int8
@ kSDKAnyType_Int8
signed integer 8 bit value
Definition: base_types.h:144
kSDKAnyType_SDKArrayPtr
@ kSDKAnyType_SDKArrayPtr
pointer to SDKArray
Definition: base_types.h:156
sdk_component_interface.h
Common base SDK interfaces.
SDKStringDuplicate
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringDuplicate(const SDKString *src, SDKString *dst)
Duplicates SDKString instance.
SDKArrayDuplicate
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKArrayDuplicate(const SDKArray *arr_src, SDKArray *arr_dest)
Duplicates SDKArray instance.
sdk::SDKAnyHandler::operator==
friend bool operator==(const SDKAny &any_lhs, const SDKAny &any_rhs) noexcept
Comparison Operators.
Definition: sdk_any_handler.h:333
platform.h
Describes the platform constants.
kSDKAnyType_SDKTimeDelta
@ kSDKAnyType_SDKTimeDelta
Time delta.
Definition: base_types.h:159
kSDKAnyType_SDKComponentPtr
@ kSDKAnyType_SDKComponentPtr
pointer to ISDKComponent
Definition: base_types.h:157
sdk::SDKAnyHandler::Attach
SDKAnyHandler & Attach(const SDKArray &arr) noexcept
Attaches existing value taking over the ownership.
Definition: sdk_any_handler.h:383
SDK_OK
#define SDK_OK(res)
Checks succeeded result.
Definition: sdk_results_enum.h:65
SDKStringCreateW
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringCreateW(SDKString *str, const wchar_t *wide_string, SDKUInt32 size)
Creates SDKString and initializes it with specified string if 'size' is not 0, only 'size' chars are ...
kSDKAnyType_SDKAnyPtr
@ kSDKAnyType_SDKAnyPtr
pointer to SDKAny
Definition: base_types.h:155
sdk::SDKAnyHandler
This class wraps the SDKAny type.
Definition: sdk_any_handler.h:32
kSDKAnyType_Double
@ kSDKAnyType_Double
double precision real value
Definition: base_types.h:150
SDKAnyChangeType
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyChangeType(SDKAny *any, SDKAnyType new_type)
Converts SDKAny value of one type to SDKAny value of another type.
kSDKAnyType_Int64
@ kSDKAnyType_Int64
signed integer 64 bit value
Definition: base_types.h:148
sdk::SDKAnyHandler::WString
std::wstring WString() const noexcept
Returns SDKAny as std::wstring.
Definition: sdk_any_handler.h:500
kSDKAnyType_SDKTimePacked
@ kSDKAnyType_SDKTimePacked
SDKTime packed structure.
Definition: base_types.h:158
kSDKAnyType_Int16
@ kSDKAnyType_Int16
signed integer 16 bit value
Definition: base_types.h:145
SDKTime
SDK_END_NAMESPACE typedef SDKInt64 SDKTime
Milliseconds from Unix epoch.
Definition: base_types.h:56
kSDKAnyType_SDKStringPtr
@ kSDKAnyType_SDKStringPtr
pointer to SDKString
Definition: base_types.h:154
sdk::SDKAnyHandler::IsArray
bool IsArray() const noexcept
Returns true if any is a valid array.
Definition: sdk_any_handler.h:467
SDKAnyDuplicate
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyDuplicate(const SDKAny *any_src, SDKAny *any_dest)
Duplicates SDKAny value (deep copy)
kSDKResult_True
static const SDKResult kSDKResult_True
Operation completed successfully with true result.
Definition: sdk_results.h:25
SDKAnyInitArray
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyInitArray(SDKAny *any, SDKAnyType element_type, SDKUInt32 element_size)
Initializes SDKAny value to contain pointer to empty SDKArray.
sdk::SDKAnyHandler::operator=
SDKAnyHandler & operator=(const SDKAny &any) noexcept
Assign operator.
Definition: sdk_any_handler.h:257
kSDKResult_InvalidArgument
static const SDKResult kSDKResult_InvalidArgument
Wrong argument passed to function.
Definition: sdk_results.h:55
kSDKResult_NULLPointer
static const SDKResult kSDKResult_NULLPointer
NULL pointer passed to function.
Definition: sdk_results.h:58
SDKAnyTypeEnum
SDKAnyTypeEnum
Enumeration of supported types of data.
Definition: base_types.h:137
kSDKAnyType_SDKTime
@ kSDKAnyType_SDKTime
SDKTime.
Definition: base_types.h:153
sdk::SDKAnyHandler::GetType
SDKAnyType GetType() const noexcept
Returns the any type.
Definition: sdk_any_handler.h:432
base_types_functions.h
Functions to work with SDK basic types.