 |
NAVTOR SDK
v.3.0
Software Development Kit for fast and efficient development of ECDIS, ECS and generic marine applications
|
|
Go to the documentation of this file. 1 #ifndef SDK_SDK_ANY_HANDLER_H_
11 #define SDK_SDK_ANY_HANDLER_H_
26 inline SDKUInt64 GetSDKAnySize(
const SDKAny& any);
27 inline SDKUInt64 GetSDKStringSize(
const SDKString& str);
28 inline SDKUInt64 GetSDKArraySize(
const SDKArray& arr);
56 ANY_UI16(
this) = ui16;
66 ANY_UI32(
this) = ui32;
76 ANY_TYPE(
this) = any_type;
82 ANY_UI64(
this) = ui64;
87 ANY_TYPE(
this) = any_type;
88 ANY_UI64(
this) = ui64;
90 #if defined(SDK_ARCH_32BITS)
98 ANY_UI64(
this) = uival;
101 #if defined(SDK_ARCH_64BITS) && defined(SDK_CC_MSVC)
104 ANY_I64(
this) = ival;
109 ANY_UI64(
this) = uival;
114 ANY_FLOAT(
this) = flt;
119 ANY_DOUBLE(
this) = dbl;
129 ANY_DATE(
this) = time;
145 static_cast<SDKUInt32
>(str.size()));
151 static_cast<SDKUInt32
>(str.size()));
204 ANY_COMPONENT(
this) = obj;
205 if (ANY_COMPONENT(
this)) {
206 ANY_COMPONENT(
this)->AddRef();
210 ANY_COMPONENT(
this) = obj;
211 if (ANY_COMPONENT(
this)) {
213 ANY_COMPONENT(
this)->AddRef();
221 ANY_COMPONENT(
this) = obj;
222 if (ANY_COMPONENT(
this)) {
223 ANY_COMPONENT(
this)->AddRef();
227 ANY_COMPONENT(
this) = obj;
228 if (ANY_COMPONENT(
this)) {
230 ANY_COMPONENT(
this)->AddRef();
235 SDKAnyHandler(SDKAnyType element_type, SDKUInt32 element_size,
236 SDKUInt64 num_of_elements) noexcept {
239 *
static_cast<SDKAny*
>(
this) = arr.DetachAsAny();
242 SDKAnyHandler(SDKAnyType element_type, SDKUInt32 element_size,
243 SDKUInt64 num_of_elements,
const void* init_data,
244 SDKUInt64 data_size) noexcept {
246 SDKArrayHandler arr(element_type, element_size, num_of_elements, init_data,
248 *
static_cast<SDKAny*
>(
this) = arr.DetachAsAny();
274 #if defined(SDK_HAS_CXX0X_RVALUE_REFS)
288 *
static_cast<SDKAny*
>(
this) = any;
292 explicit SDKAnyHandler(SDKStringHandler&& str) noexcept {
297 explicit SDKAnyHandler(SDKArrayHandler&& arr) {
314 SDKAnyHandler&
operator=(SDKAnyHandler&& any) {
317 *
static_cast<SDKAny*
>(
this) = any;
333 friend bool operator==(
const SDKAny& any_lhs,
const SDKAny& any_rhs) noexcept {
337 friend bool operator!=(
const SDKAny& any_lhs,
const SDKAny& any_rhs) noexcept {
341 #if defined(__GNUC__)
342 const SDKAny* operator&() const noexcept {
349 SDKAny* operator&() noexcept {
367 *
static_cast<SDKAny*
>(
this) = any;
376 *ANY_STR(
this) = str;
386 handler.Attach(
const_cast<SDKArray&
>(arr));
387 *
static_cast<SDKAny*
>(
this) = handler.DetachAsAny();
393 SDKAny any = (*this);
401 SDKString& int_ref = *ANY_STR(
this);
402 SDKString str_copy = int_ref;
415 SDKArray& int_ref = *ANY_ARRAY(
this);
416 SDKArray arr_copy = int_ref;
433 return ANY_TYPE(
this);
438 return IsSDKAnyEmpty(*
this);
443 return IsSDKAnyNull(*
this);
448 return IsSDKAnyEmpty(*
this) || IsSDKAnyNull(*
this);
453 return IsSDKAnyInteger(*
this);
458 return IsSDKAnyNumeric(*
this);
463 return IsSDKAnyString(*
this);
468 return IsSDKAnyArray(*
this);
473 return IsSDKAnyComponent(*
this);
486 template<
typename T >
487 bool GetAs(T& value)
const {
490 if (ANY_IS_EMPTY(
this))
492 value = GetAnyValue< T >(*
this);
500 inline std::wstring
WString() const noexcept {
501 std::wstring out_value;
502 if (GetAs< std::wstring >(out_value))
504 return std::wstring();
507 inline std::wstring GetAsWString() const noexcept {
513 std::string out_value;
514 if (GetAs< std::string >(out_value))
516 return std::string();
519 inline std::string GetAsString() const noexcept {
523 template <
typename T>
524 inline SDKResult GetInterface(T **obj_ptr)
const noexcept {
531 if (NULL == (*this).obj)
533 return (*this).obj->GetInterface(T::IID(), (
void**)obj_ptr);
536 template <
typename T>
539 SDKResult res = GetInterface<T>(&obj_ptr);
545 SDKUInt64 GetSize()
const {
546 return GetSDKAnySize(*
this);
549 SDKAny& GetReference() {
553 const SDKAny& GetReference()
const {
561 const SDKAny& Get()
const {
582 : m_value(value), m_default_value(default_value) {
587 bool is_value_set =
false;
590 if (!ANY_IS_EMPTY(&m_any)) {
591 m_value = GetAnyValue<T>(m_any);
595 if (!is_value_set && m_default_value)
596 m_value = *m_default_value;
602 operator SDKAny&() noexcept {
606 operator const SDKAny&()
const noexcept {
610 SDKAny& GetReference() noexcept {
616 : m_any(), m_value(rhs.m_value), m_default_value(rhs.m_default_value) {
620 MyType& operator=(
const MyType& rhs) {
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) {
634 m_default_value =
nullptr;
637 MyType& operator=(MyType&& rhs) {
641 m_value = rhs.m_value;
642 m_default_value = rhs.m_default_value;
645 m_default_value =
nullptr;
654 const T *m_default_value;
658 class SDKAnyReturnHelper<SDKAny> {
659 typedef SDKAnyReturnHelper<SDKAny> MyType;
661 SDKAnyReturnHelper(SDKAny& value,
const SDKAny *default_value =
nullptr)
662 : m_value(&value), m_default_value(default_value) {
665 ~SDKAnyReturnHelper() {
666 if (m_value && ANY_IS_EMPTY(m_value) && m_default_value)
670 SDKAnyReturnHelper(MyType& rhs)
671 : m_value(rhs.m_value), m_default_value(rhs.m_default_value) {
675 MyType& operator=(MyType& rhs) {
677 m_value = rhs.m_value;
679 m_default_value = rhs.m_default_value;
684 operator SDKAny&() noexcept {
688 operator const SDKAny&()
const noexcept {
692 SDKAny& GetReference() noexcept {
696 const SDKAny& GetReference() const noexcept {
701 mutable SDKAny* m_value;
702 mutable const SDKAny* m_default_value;
705 template <
typename T>
706 SDKAnyReturnHelper<T> MakeSDKAnyReturnHelper(T& value,
707 const T* default_value =
nullptr) {
708 return SDKAnyReturnHelper<T>(value, default_value);
711 inline SDKUInt64 GetSDKStringSize(
const SDKString& str) {
715 str.length *
sizeof(SDKUInt16);
718 inline SDKUInt64 GetSDKArraySize(
const SDKArray& arr) {
720 sizeof(arr.num_of_elements) +
721 sizeof(arr.element_type) +
722 sizeof(arr.element_size) +
724 arr.num_of_elements * arr.element_size;
727 inline SDKUInt64 GetSDKAnySize(
const SDKAny& any) {
728 SDKUInt64 size =
sizeof(any.any_type);
729 switch (any.any_type) {
744 return size +
sizeof(SDKUInt64);
746 return size +
sizeof(SDKUInt64) + (any.str ? GetSDKStringSize(*any.str) : 0);
748 return size +
sizeof(SDKUInt64) + (any.any ? GetSDKAnySize(*any.any) : 0);
750 return size +
sizeof(SDKUInt64) + (any.arr ? GetSDKArraySize(*any.arr) : 0);
752 return size +
sizeof(SDKUInt64);
755 return size +
sizeof(SDKUInt64);
757 return size +
sizeof(SDKUInt64);
759 return size +
sizeof(SDKUInt64);
771 namespace sdk_any_handler_detail {
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) {
782 }
else if (src[i] < 0x800) {
785 if ((src[i] & 0xFFFFFC00) == 0xD800) {
786 if ((src[i] & 0x400) != 0
788 || (src[i] & 0xFFFFFC00) != 0xDC00) {
789 lengths.first =
static_cast<SDKUInt32
>(i);
790 lengths.second =
static_cast<SDKUInt32
>(-1);
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 {
807 if (0 != sdk_string.length && NULL != sdk_string.data) {
810 #if 0 && defined(SDK_OS_WIN)
811 const wchar_t *src =
reinterpret_cast<const wchar_t*
>(sdk_string.data);
814 _WC_ERR_INVALID_CHARS = 0x80,
816 int dst_len = WideCharToMultiByte(_CP_UTF8, _WC_ERR_INVALID_CHARS, src,
817 int(sdk_string.length), NULL, 0, NULL, NULL);
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);
823 str.assign(dst, dst + dst_len);
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)) {
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));
838 if ((utf32_symb & 0xFFFFFC00) == 0xD800) {
839 utf32_symb = (utf32_symb << 10) + src[i + 1] - ((0xD800 << 10) +
844 if (utf32_symb < 0x800)
846 else if (utf32_symb < 0x10000)
848 else if (utf32_symb < 0x200000)
850 else if (utf32_symb < 0x4000000)
852 else if (utf32_symb < 0x80000000)
856 utf8_symb[0] = _Elem((0xFC << (5 - range)) +
857 ((utf32_symb >> (6 * range)) & (0x3F >> range)));
860 utf8_symb[range - 4] = char(0x80 + ((utf32_symb >> 24) & 0x3F));
break;
862 utf8_symb[range - 3] = char(0x80 + ((utf32_symb >> 18) & 0x3F));
break;
864 utf8_symb[range - 2] = char(0x80 + ((utf32_symb >> 12) & 0x3F));
break;
866 utf8_symb[range - 1] = char(0x80 + ((utf32_symb >> 06) & 0x3F));
break;
868 utf8_symb[range - 0] = char(0x80 + ((utf32_symb >> 00) & 0x3F));
break;
872 str.append(utf8_symb, range + 1);
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 {
889 if (0 != sdk_string.length && NULL != sdk_string.data) {
892 if (
sizeof(_Elem) ==
sizeof(sdk_string.data[0])) {
893 str.assign((_Elem*)sdk_string.data, sdk_string.length);
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)) {
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)) {
905 utf32_symb = (utf32_symb << 10) + src[i + 1] - ((0xD800 << 10) +
909 str.push_back(_Elem(utf32_symb));
924 template <
typename _Elem,
typename _Traits,
typename _Ax>
926 typedef std::basic_string<_Elem, _Traits, _Ax> string;
927 typedef typename string::value_type value_type;
931 : m_value(&wstr), m_default_value(
nullptr) {
936 : m_value(&wstr), m_default_value(default_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;
952 operator SDKAny&() noexcept {
956 operator const SDKAny&()
const noexcept {
960 SDKAny& GetReference() {
967 : m_any(), m_value(rhs.m_value), m_default_value(rhs.m_default_value) {
972 MyType& operator=(
const MyType& rhs) {
976 m_value = rhs.m_value;
977 m_default_value = rhs.m_default_value;
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) {
988 rhs.m_default_value = NULL;
991 MyType& operator=(MyType&& rhs) {
995 m_value = rhs.m_value;
996 m_default_value = rhs.m_default_value;
999 rhs.m_default_value = NULL;
1008 const string* m_default_value;
1013 #endif // SDK_SDK_ANY_HANDLER_H_
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringInit(SDKString *str)
Initializes SDKString structure.
bool IsString() const noexcept
Returns true if any is a valid string.
Definition: sdk_any_handler.h:462
bool IsEmptyOrNULL() const noexcept
Returns true if any is an empty or null value.
Definition: sdk_any_handler.h:447
Helps to get value results from SDKAny interface output parameters.
Definition: sdk_any_handler.h:578
SDKArray & GetReference() noexcept
Returns the reference.
Definition: sdk_array_handler.h:194
SDKArray DetachAsArray() noexcept
Detaches array from any.
Definition: sdk_any_handler.h:413
SDKString DetachAsString() noexcept
Detaches string from any.
Definition: sdk_any_handler.h:399
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...
SDKAnyReturnHelper(const MyType &rhs)
Disallow copy and assign.
Definition: sdk_any_handler.h:615
SDKAnyHandler & operator=(const SDKAnyHandler &any) noexcept
Assign operator.
Definition: sdk_any_handler.h:266
SDKAnyHandler & Attach(const SDKAny &any) noexcept
Attaches a new any value.
Definition: sdk_any_handler.h:365
@ kSDKAnyType_Uint16
unsigned integer 16 bit value
Definition: base_types.h:141
bool IsEmpty() const noexcept
Returns true if any is an empty value.
Definition: sdk_any_handler.h:437
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyInitString(SDKAny *any)
Initializes SDKAny value to contain pointer to empty SDKString.
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyInit(SDKAny *any)
Initializes SDKAny value to empty state.
void Clear() noexcept
Clears the any contents.
Definition: sdk_any_handler.h:427
@ kSDKAnyType_Bool
boolean value
Definition: base_types.h:152
SDKUInt32 GetElementSize() const noexcept
Returns the size of the element.
Definition: sdk_array_handler.h:169
SDKResult Compare(const SDKAny &any_src) const noexcept
Compares ScopedAny with the specified SDKAny.
Definition: sdk_any_handler.h:482
@ kSDKAnyType_Uint64
unsigned integer 64 bit value
Definition: base_types.h:143
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyClear(SDKAny *any)
Clears SDKAny value (deleting complex types)
@ kSDKAnyType_Uint8
unsigned integer 8 bit value
Definition: base_types.h:140
SDKResult ChangeType(SDKAnyType new_type) noexcept
Changes an any type.
Definition: sdk_any_handler.h:477
@ kSDKAnyType_Int32
signed integer 32 bit value
Definition: base_types.h:146
bool IsComponent() const noexcept
Returns true if any is a valid component reference.
Definition: sdk_any_handler.h:472
SDKAny Detach() noexcept
Detaches the any contents.
Definition: sdk_any_handler.h:392
bool IsNULL() const noexcept
Returns true if any is a null value.
Definition: sdk_any_handler.h:442
@ kSDKAnyType_Float
single precision real value
Definition: base_types.h:149
SDKAnyReturnHelper(const MyType &rhs)
Disallow copy and assign.
Definition: sdk_any_handler.h:966
@ kSDKAnyType_Null
null value or no value
Definition: base_types.h:139
SDKAnyHandler & Attach(const SDKString &str) noexcept
Attaches existing value taking over the ownership.
Definition: sdk_any_handler.h:373
static const SDKResult kSDKResult_Succeeded
Operation completed successfully.
Definition: sdk_results.h:22
SDKAnyType GetType() const noexcept
Returns the type of the element.
Definition: sdk_array_handler.h:164
@ kSDKAnyType_Empty
variable is empty
Definition: base_types.h:138
Wrappers and helper functions for SDKString.
~SDKAnyHandler()
Destroys internal any.
Definition: sdk_any_handler.h:252
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKArrayInit(SDKArray *arr)
Initialize SDKArray structure.
SDKInt32 SDKResult
Type of all error or return codes which SDK functions can end with.
Definition: sdk_results.h:17
This class wraps the SDKString type.
Definition: sdk_string_handler.h:100
This class wraps the SDKArray type.
Definition: sdk_array_handler.h:33
@ kSDKAnyType_Uint32
unsigned integer 32 bit value
Definition: base_types.h:142
@ kSDKAnyType_UserPtr
user defined type of any size
Definition: base_types.h:163
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyCompare(const SDKAny *any1, const SDKAny *any2)
Compares two SDKAny.
Helper functions for SDKAny type.
std::string ASCIIString() const noexcept
Returns SDKAny as std::string.
Definition: sdk_any_handler.h:512
A smart pointer class for managing SDK components interface pointers.
Definition: sdk_ref_ptr.h:23
bool IsNumeric() const noexcept
Returns true if any is a ordinary number or a bool.
Definition: sdk_any_handler.h:457
bool IsInteger() const noexcept
Returns true if any is a ordinary number or a bool.
Definition: sdk_any_handler.h:452
@ kSDKAnyType_Int8
signed integer 8 bit value
Definition: base_types.h:144
@ kSDKAnyType_SDKArrayPtr
pointer to SDKArray
Definition: base_types.h:156
Common base SDK interfaces.
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringDuplicate(const SDKString *src, SDKString *dst)
Duplicates SDKString instance.
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKArrayDuplicate(const SDKArray *arr_src, SDKArray *arr_dest)
Duplicates SDKArray instance.
friend bool operator==(const SDKAny &any_lhs, const SDKAny &any_rhs) noexcept
Comparison Operators.
Definition: sdk_any_handler.h:333
@ kSDKAnyType_SDKTimeDelta
Time delta.
Definition: base_types.h:159
@ kSDKAnyType_SDKComponentPtr
pointer to ISDKComponent
Definition: base_types.h:157
SDKAnyHandler & Attach(const SDKArray &arr) noexcept
Attaches existing value taking over the ownership.
Definition: sdk_any_handler.h:383
#define SDK_OK(res)
Checks succeeded result.
Definition: sdk_results_enum.h:65
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
pointer to SDKAny
Definition: base_types.h:155
This class wraps the SDKAny type.
Definition: sdk_any_handler.h:32
@ kSDKAnyType_Double
double precision real value
Definition: base_types.h:150
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
signed integer 64 bit value
Definition: base_types.h:148
std::wstring WString() const noexcept
Returns SDKAny as std::wstring.
Definition: sdk_any_handler.h:500
@ kSDKAnyType_SDKTimePacked
SDKTime packed structure.
Definition: base_types.h:158
@ kSDKAnyType_Int16
signed integer 16 bit value
Definition: base_types.h:145
SDK_END_NAMESPACE typedef SDKInt64 SDKTime
Milliseconds from Unix epoch.
Definition: base_types.h:56
@ kSDKAnyType_SDKStringPtr
pointer to SDKString
Definition: base_types.h:154
bool IsArray() const noexcept
Returns true if any is a valid array.
Definition: sdk_any_handler.h:467
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyDuplicate(const SDKAny *any_src, SDKAny *any_dest)
Duplicates SDKAny value (deep copy)
static const SDKResult kSDKResult_True
Operation completed successfully with true result.
Definition: sdk_results.h:25
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.
SDKAnyHandler & operator=(const SDKAny &any) noexcept
Assign operator.
Definition: sdk_any_handler.h:257
static const SDKResult kSDKResult_InvalidArgument
Wrong argument passed to function.
Definition: sdk_results.h:55
static const SDKResult kSDKResult_NULLPointer
NULL pointer passed to function.
Definition: sdk_results.h:58
SDKAnyTypeEnum
Enumeration of supported types of data.
Definition: base_types.h:137
@ kSDKAnyType_SDKTime
SDKTime.
Definition: base_types.h:153
SDKAnyType GetType() const noexcept
Returns the any type.
Definition: sdk_any_handler.h:432
Functions to work with SDK basic types.