NAVTOR SDK  v.3.0
Software Development Kit for fast and efficient development of ECDIS, ECS and generic marine applications
sdk_any_helpers.h
Go to the documentation of this file.
1 #ifndef SDK_SDK_ANY_HELPERS_H_
11 #define SDK_SDK_ANY_HELPERS_H_
12 
13 #include <stdexcept>
14 #include <math.h>
15 #include <base/inc/base_types.h>
19 
20 namespace sdk {
21 
22 inline bool IsSDKAnyEmpty(const SDKAny& any_value)
23 {
24  return ANY_IS_EMPTY(&any_value);
25 }
26 
27 inline bool IsSDKAnyNull(const SDKAny& any_value)
28 {
29  return ANY_IS_NULL(&any_value);
30 }
31 
32 inline bool IsSDKAnyInteger(const SDKAny& any_value)
33 {
34  return (any_value.any_type >= kSDKAnyType_Uint8 &&
35  any_value.any_type <= kSDKAnyType_Int64);
36 }
37 
38 inline bool IsSDKAnyNumeric(const SDKAny& any_value)
39 {
40  return (any_value.any_type >= kSDKAnyType_Uint8 &&
41  any_value.any_type <= kSDKAnyType_Bool);
42 }
43 
44 inline bool IsSDKAnyString(const SDKAny& any_value)
45 {
46  return ANY_IS_STR(&any_value);
47 }
48 
49 inline bool IsSDKAnyArray(const SDKAny& any_value)
50 {
51  return ANY_IS_ARRAY(&any_value);
52 }
53 
54 inline bool IsSDKAnyComponent(const SDKAny& any_value)
55 {
56  return ANY_IS_COMPONENT(&any_value);
57 }
58 
59 inline bool IsSDKAnySimple(const SDKAny& any_value)
60 {
61  return (any_value.any_type < kSDKAnyType_SDKStringPtr);
62 }
63 
64 inline bool IsSDKAnyComplex(const SDKAny& any_value)
65 {
66  return !IsSDKAnySimple(any_value);
67 }
68 
69 inline bool IsSDKAnyTheSame(const SDKAny& any_value1, const SDKAny& any_value2)
70 {
71  if (any_value1.any_type != any_value2.any_type)
72  return false;
73 
74  switch(any_value1.any_type)
75  {
76  case kSDKAnyType_Empty: return true;
77  case kSDKAnyType_Null: return true;
78  case kSDKAnyType_Int8: return (any_value1.i8 == any_value2.i8 );
79  case kSDKAnyType_Uint8: return (any_value1.ui8 == any_value2.ui8 );
80  case kSDKAnyType_Int16: return (any_value1.i16 == any_value2.i16 );
81  case kSDKAnyType_Uint16: return (any_value1.ui16 == any_value2.ui16);
82  case kSDKAnyType_Int32: return (any_value1.i32 == any_value2.i32 );
83  case kSDKAnyType_Uint32: return (any_value1.ui32 == any_value2.ui32);
84  case kSDKAnyType_Int64: return (any_value1.i64 == any_value2.i64 );
85  case kSDKAnyType_Uint64: return (any_value1.ui64 == any_value2.ui64);
86  case kSDKAnyType_Float: return (any_value1.flt == any_value2.flt );
87  case kSDKAnyType_Double: return (any_value1.dbl == any_value2.dbl );
88  case kSDKAnyType_Bool: return (any_value1.bl == any_value2.bl );
89  case kSDKAnyType_SDKTime: return (any_value1.time == any_value2.time);
90  case kSDKAnyType_SDKTimeDelta: return (any_value1.dtime == any_value2.dtime);
91  case kSDKAnyType_SDKStringPtr: return (any_value1.str == any_value2.str);
92  case kSDKAnyType_SDKAnyPtr: return (any_value1.any == any_value2.any);
93  case kSDKAnyType_SDKArrayPtr: return (any_value1.arr == any_value2.arr);
94  case kSDKAnyType_SDKComponentPtr: return (any_value1.obj == any_value2.obj);
95  case kSDKAnyType_UserPtr: return (any_value1.vd == any_value2.vd);
96  }
97  throw std::runtime_error("Unsupported type is used to get SDKAny value in IsAnyTheSame()");
98 }
99 
100 template<class T>
101 inline T GetAnyValue(const SDKAny& any_value)
102 {
103  switch(any_value.any_type)
104  {
105  // case kSDKAnyType_Empty: return static_cast<T>(0);
106  case kSDKAnyType_Null: return static_cast<T>(0);
107  case kSDKAnyType_Int8: return static_cast<T>(any_value.i8);
108  case kSDKAnyType_Uint8: return static_cast<T>(any_value.ui8);
109  case kSDKAnyType_Int16: return static_cast<T>(any_value.i16);
110  case kSDKAnyType_Uint16: return static_cast<T>(any_value.ui16);
111  case kSDKAnyType_Int32: return static_cast<T>(any_value.i32);
112  case kSDKAnyType_Uint32: return static_cast<T>(any_value.ui32);
113  case kSDKAnyType_Int64: return static_cast<T>(any_value.i64);
114  case kSDKAnyType_Uint64: return static_cast<T>(any_value.ui64);
115  case kSDKAnyType_Float: return static_cast<T>(any_value.flt);
116  case kSDKAnyType_Double: return static_cast<T>(any_value.dbl);
117  case kSDKAnyType_Bool: return static_cast<T>(any_value.bl);
118  case kSDKAnyType_SDKTime: return static_cast<T>(any_value.time);
119  case kSDKAnyType_SDKTimeDelta: return static_cast<T>(any_value.dtime);
120  case kSDKAnyType_SDKStringPtr: break;
121  case kSDKAnyType_SDKAnyPtr: break;
122  case kSDKAnyType_SDKArrayPtr: break;
123  case kSDKAnyType_SDKComponentPtr: break;
124  case kSDKAnyType_UserPtr: break;
125  }
126  throw std::runtime_error("Unsupported type is used to get SDKAny value in GetAnyValue<T>()");
127 }
128 
129 template<>
130 inline bool GetAnyValue<bool>(const SDKAny& any_value)
131 {
132  return 0 != GetAnyValue<SDKInt64>(any_value);
133 }
134 
135 template<>
136 inline void* GetAnyValue<void*>(const SDKAny& any_value)
137 {
138  switch(any_value.any_type)
139  {
140  case kSDKAnyType_Empty:
141  case kSDKAnyType_Null:
142  case kSDKAnyType_Int8:
143  case kSDKAnyType_Uint8:
144  case kSDKAnyType_Int16:
145  case kSDKAnyType_Uint16:
146  case kSDKAnyType_Int32:
147  case kSDKAnyType_Uint32:
148  case kSDKAnyType_Int64:
149  case kSDKAnyType_Uint64:
150  case kSDKAnyType_Float:
151  case kSDKAnyType_Double:
152  case kSDKAnyType_Bool:
153  case kSDKAnyType_SDKTime: return 0;
154  case kSDKAnyType_SDKStringPtr: return static_cast<void*>(any_value.str);
155  case kSDKAnyType_SDKAnyPtr: return static_cast<void*>(any_value.any);
156  case kSDKAnyType_SDKArrayPtr: return static_cast<void*>(any_value.arr);
157  case kSDKAnyType_SDKComponentPtr: return static_cast<void*>(any_value.obj);
158  case kSDKAnyType_UserPtr: return static_cast<void*>(any_value.vd);
159  }
160  throw std::runtime_error("Unsupported any type in GetAnyValue<void*>()");
161 }
162 
163 template<>
164 inline std::string GetAnyValue<std::string>(const SDKAny& any_value)
165 {
166  if (kSDKAnyType_Empty == any_value.any_type || kSDKAnyType_Null == any_value.any_type)
167  return "";
168  if (kSDKAnyType_SDKStringPtr == any_value.any_type)
169  return any_value.str ? SDKMakeString(*any_value.str) : std::string();
170  throw std::runtime_error("Unsupported any type in GetAnyValue<std::string>()");
171 }
172 
173 template<>
174 inline std::wstring GetAnyValue<std::wstring>(const SDKAny& any_value)
175 {
176  if (kSDKAnyType_Empty == any_value.any_type || kSDKAnyType_Null == any_value.any_type)
177  return L"";
178  if (kSDKAnyType_SDKStringPtr == any_value.any_type)
179  return any_value.str ? SDKMakeWString(*any_value.str) : std::wstring();
180  throw std::runtime_error("Unsupported any type in GetAnyValue<std::wstring>()");
181 }
182 
183 template<>
184 inline ISDKComponentSP GetAnyValue<ISDKComponentSP>(const SDKAny& any_value)
185 {
186  if (kSDKAnyType_SDKComponentPtr == any_value.any_type)
187  return ISDKComponentSP(any_value.obj);
188  throw std::runtime_error("Unsupported any type in GetAnyValue<ISDKComponent>()");
189 }
190 
191 template<class T>
192 inline bool GetAnyValueSafe(const SDKAny& any_value, T& result)
193 {
194  try
195  {
196  result = GetAnyValue<T>(any_value);
197  return true;
198  }
199  catch(...) {}
200  return false;
201 }
202 
203 template<typename T>
204 inline T* GetAnyValueInterface(const SDKAny& any_value)
205 {
206  if (kSDKAnyType_SDKComponentPtr == any_value.any_type)
207  return any_value.obj ? GetInterfaceT<T>(any_value.obj) : NULL;
208  throw std::runtime_error("Any is not a component in GetAnyValueInterface<>()");
209 }
210 
211 inline bool IsSDKAnyEqual(
212  const SDKAny* any1,
213  const SDKAny* any2,
214  bool is_deep_compare,
215  double* real_threshold) // used for real types comparison if specified
216 {
217  if (!any1 && !any2)
218  return true;
219  if (!any1 || !any2)
220  return false;
221 
222  if (any1->any_type != any2->any_type)
223  return false;
224 
225  switch(any1->any_type)
226  {
227  case kSDKAnyType_Empty: return true;
228  case kSDKAnyType_Null: return true;
229  case kSDKAnyType_Int8: return any1->i8 == any2->i8;
230  case kSDKAnyType_Uint8: return any1->ui8 == any2->ui8;
231  case kSDKAnyType_Int16: return any1->i16 == any2->i16;
232  case kSDKAnyType_Uint16: return any1->ui16 == any2->ui16;
233  case kSDKAnyType_Int32: return any1->i32 == any2->i32;
234  case kSDKAnyType_Uint32: return any1->ui32 == any2->ui32;
235  case kSDKAnyType_Int64: return any1->i64 == any2->i64;
236  case kSDKAnyType_Uint64: return any1->ui32 == any2->ui32;
237  case kSDKAnyType_Float: return real_threshold
238  ? fabs(any1->flt - any2->flt) < *real_threshold
239  : any1->flt == any2->flt;
240  case kSDKAnyType_Double: return real_threshold
241  ? fabs(any1->dbl - any2->dbl) < *real_threshold
242  : any1->dbl == any2->dbl;
243  case kSDKAnyType_Bool: return any1->bl == any2->bl;
244  case kSDKAnyType_SDKTime: return any1->time == any2->time;
246  if (!is_deep_compare)
247  return any1->str == any2->str;
248  else
249  return IsSDKStringEqual(any1->str, any2->str);
250  case kSDKAnyType_SDKAnyPtr:
251  if (!is_deep_compare)
252  return any1->any == any2->any;
253  else
254  return IsSDKAnyEqual(any1->any, any2->any, is_deep_compare, real_threshold);
256  if (!is_deep_compare)
257  return any1->arr == any2->arr;
258  else
259  return IsSDKArrayEqual(any1->arr, any2->arr);
261  return any1->obj == any2->obj;
262  case kSDKAnyType_UserPtr:
263  return any1->vd == any2->vd;
264  }
265  throw std::runtime_error("Unsupported any type in IsSDKAnyEqual()");
266 }
267 
268 inline bool IsSDKAnyTrue(const SDKAny& any)
269 {
270  switch(any.any_type)
271  {
272  case kSDKAnyType_Empty: return false;
273  case kSDKAnyType_Null: return false;
274  case kSDKAnyType_Int8: return 0 != any.i8;
275  case kSDKAnyType_Uint8: return 0 != any.ui8;
276  case kSDKAnyType_Int16: return 0 != any.i16;
277  case kSDKAnyType_Uint16: return 0 != any.ui16;
278  case kSDKAnyType_Int32: return 0 != any.i32;
279  case kSDKAnyType_Uint32: return 0 != any.ui32;
280  case kSDKAnyType_Int64: return 0 != any.i64;
281  case kSDKAnyType_Uint64: return 0 != any.ui32;
282  case kSDKAnyType_Float: return 0 != any.flt;
283  case kSDKAnyType_Double: return 0 != any.dbl;
284  case kSDKAnyType_Bool: return 0 != any.bl;
285  case kSDKAnyType_SDKTime: return 0 != any.time;
286  case kSDKAnyType_SDKStringPtr: return 0 != any.str;
287  case kSDKAnyType_SDKAnyPtr: return 0 != any.any;
288  case kSDKAnyType_SDKArrayPtr: return 0 != any.arr;
289  case kSDKAnyType_SDKComponentPtr: return 0 != any.obj;
290  case kSDKAnyType_UserPtr: return 0 != any.vd;
291  }
292  throw std::runtime_error("Unsupported any type in IsSDKAnyTrue()");
293 }
294 
295 inline bool IsSDKAnyLess(const SDKAny& any1, const SDKAny& any2)
296 {
297  if (any1.any_type != any2.any_type)
298  return any1.any_type < any2.any_type;
299 
300  switch(any1.any_type)
301  {
302  case kSDKAnyType_Empty: return false;
303  case kSDKAnyType_Null: return false;
304  case kSDKAnyType_Int8: return any1.i8 < any2.i8;
305  case kSDKAnyType_Uint8: return any1.ui8 < any2.ui8;
306  case kSDKAnyType_Int16: return any1.i16 < any2.i16;
307  case kSDKAnyType_Uint16: return any1.ui16 < any2.ui16;
308  case kSDKAnyType_Int32: return any1.i32 < any2.i32;
309  case kSDKAnyType_Uint32: return any1.ui32 < any2.ui32;
310  case kSDKAnyType_Int64: return any1.i64 < any2.i64;
311  case kSDKAnyType_Uint64: return any1.ui32 < any2.ui32;
312  case kSDKAnyType_Float: return any1.flt < any2.flt;
313  case kSDKAnyType_Double: return any1.dbl < any2.dbl;
314  case kSDKAnyType_Bool: return any1.bl < any2.bl;
315  case kSDKAnyType_SDKTime: return any1.time < any2.time;
316  case kSDKAnyType_SDKStringPtr: return any1.str < any2.str;
317  case kSDKAnyType_SDKAnyPtr: return any1.any < any2.any;
318  case kSDKAnyType_SDKArrayPtr: return any1.arr < any2.arr;
319  case kSDKAnyType_SDKComponentPtr: return any1.obj < any2.obj;
320  case kSDKAnyType_UserPtr: return any1.vd < any2.vd;
321  }
322  throw std::runtime_error("Unsupported any type in IsSDKAnyLess()");
323 }
324 
325 } // namespace sdk
326 
327 #endif // SDK_SDK_ANY_HELPERS_H_
kSDKAnyType_Uint16
@ kSDKAnyType_Uint16
unsigned integer 16 bit value
Definition: base_types.h:141
base_types.h
SDK base types.
kSDKAnyType_Bool
@ kSDKAnyType_Bool
boolean value
Definition: base_types.h:152
kSDKAnyType_Uint64
@ kSDKAnyType_Uint64
unsigned integer 64 bit value
Definition: base_types.h:143
sdk::IsSDKArrayEqual
bool IsSDKArrayEqual(const SDKArray *arr1, const SDKArray *arr2)
Compares two SDKArrays.
Definition: sdk_array_handler.h:606
kSDKAnyType_Uint8
@ kSDKAnyType_Uint8
unsigned integer 8 bit value
Definition: base_types.h:140
kSDKAnyType_Int32
@ kSDKAnyType_Int32
signed integer 32 bit value
Definition: base_types.h:146
kSDKAnyType_Float
@ kSDKAnyType_Float
single precision real value
Definition: base_types.h:149
sdk::IsSDKStringEqual
bool IsSDKStringEqual(const SDKString *str1, const SDKString *str2)
Compares two SDKStrings.
Definition: sdk_string_handler.h:427
kSDKAnyType_Null
@ kSDKAnyType_Null
null value or no value
Definition: base_types.h:139
kSDKAnyType_Empty
@ kSDKAnyType_Empty
variable is empty
Definition: base_types.h:138
sdk_string_handler.h
Wrappers and helper functions for SDKString.
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
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.
kSDKAnyType_SDKTimeDelta
@ kSDKAnyType_SDKTimeDelta
Time delta.
Definition: base_types.h:159
kSDKAnyType_SDKComponentPtr
@ kSDKAnyType_SDKComponentPtr
pointer to ISDKComponent
Definition: base_types.h:157
kSDKAnyType_SDKAnyPtr
@ kSDKAnyType_SDKAnyPtr
pointer to SDKAny
Definition: base_types.h:155
sdk::SDKMakeWString
static std::wstring SDKMakeWString(const SDKString &sdk_string)
Converts SDKString to std::wstring.
Definition: sdk_string_handler.h:61
kSDKAnyType_Double
@ kSDKAnyType_Double
double precision real value
Definition: base_types.h:150
kSDKAnyType_Int64
@ kSDKAnyType_Int64
signed integer 64 bit value
Definition: base_types.h:148
kSDKAnyType_Int16
@ kSDKAnyType_Int16
signed integer 16 bit value
Definition: base_types.h:145
kSDKAnyType_SDKStringPtr
@ kSDKAnyType_SDKStringPtr
pointer to SDKString
Definition: base_types.h:154
sdk::SDKMakeString
static std::string SDKMakeString(const SDKString &sdk_string)
Converts SDKString to std::string.
Definition: sdk_string_handler.h:33
kSDKAnyType_SDKTime
@ kSDKAnyType_SDKTime
SDKTime.
Definition: base_types.h:153
sdk_array_handler.h
Wrapper for handling the SDKArray instance.