NAVTOR SDK  v.3.0
Software Development Kit for fast and efficient development of ECDIS, ECS and generic marine applications
sdk_string_handler.h
Go to the documentation of this file.
1 #ifndef SDK_SDK_STRING_HANDLER_H_
11 #define SDK_SDK_STRING_HANDLER_H_
12 
13 #include <cassert>
14 #include <string>
15 #include <iterator>
16 #include <base/inc/platform.h>
18 #include <base/inc/base_types.h>
20 
21 namespace sdk {
22 
33 static std::string SDKMakeString(const SDKString& sdk_string) {
34  if (0 == sdk_string.length || NULL == sdk_string.data)
35  return std::string();
36 
37  std::string str;
38  try
39  {
40  // TODO: Refactoring
41  for (unsigned int counter = 0; counter < sdk_string.length; ++counter) {
42  char symb = static_cast<char>(sdk_string.data[counter]);
43  str.push_back(symb);
44  }
45  } catch(...) {
46  }
47  //TODO: handle errors
48  return str;
49 }
50 
61 static std::wstring SDKMakeWString(const SDKString& sdk_string) {
62  if (0 == sdk_string.length || NULL == sdk_string.data)
63  return std::wstring();
64 
65  std::wstring wstr;
66  try
67  {
68  std::copy(sdk_string.data, sdk_string.data + sdk_string.length,
69  std::back_inserter(wstr));
70  } catch(...) {
71  }
72  //TODO: handle errors
73  return wstr;
74 }
75 
76 #if !defined(WideFromSDKString)
77 #define WideFromSDKString(arg) SDKMakeWString(arg)
78 #endif
79 
80 #if !defined(ASCIIFromSDKString)
81 #define ASCIIFromSDKString(arg) SDKMakeString(arg)
82 #endif
83 
84 static inline SDKResult SDKStringFromWide(const std::wstring& wide,
85  SDKString* sdk_string) {
86  return SDKStringCreateW(sdk_string, wide.c_str(),
87  static_cast<SDKUInt32>(wide.size()));
88 }
89 
90 static inline SDKResult SDKStringFromASCII(const std::string& ascii,
91  SDKString* sdk_string) {
92  return SDKStringCreateA(sdk_string, ascii.c_str(),
93  static_cast<SDKUInt32>(ascii.size()));
94 }
95 
96 class SDKAnyHandler;
97 
100 class SDKStringHandler : public SDKString {
101 public:
104  //SDKStringInit(&(*this));
105  (*this).length = 0;
106  (*this).data = NULL;
107  }
108 
110  explicit SDKStringHandler(const char* ascii, SDKUInt32 size = 0) {
111  SDKStringCreateA(&(*this), ascii, size);
112  //TODO: handle errors
113  }
114 
116  explicit SDKStringHandler(const wchar_t* wide, SDKUInt32 size = 0) {
117  SDKStringCreateW(&(*this), wide, size);
118  //TODO: handle errors
119  }
120 
121  explicit SDKStringHandler(SDKUInt32 size, const SDKUInt16* wide) {
122  SDKStringCreateI(&(*this), wide, size);
123  }
124 
126  explicit SDKStringHandler(const std::wstring& wide) {
127  SDKStringInit(&(*this));
128  if (!wide.empty()) {
129  SDKStringCreateW(&(*this), wide.c_str(),
130  static_cast<SDKUInt32>(wide.size()));
131  //TODO: handle errors
132  }
133  }
134 
136  explicit SDKStringHandler(const std::string& ascii) {
137  SDKStringInit(&(*this));
138  if (!ascii.empty()) {
139  SDKStringCreateA(&(*this), ascii.c_str(),
140  static_cast<SDKUInt32>(ascii.size()));
141  //TODO: handle errors
142  }
143  }
144 
146  explicit SDKStringHandler(const SDKString& instance) {
147  SDKStringInit(&(*this));
148  SDKStringDuplicate(&instance, &(*this));
149  }
150 
152  explicit SDKStringHandler(SDKString& instance, bool duplicate) {
153  SDKStringInit(&(*this));
154  if (duplicate) {
155  SDKStringDuplicate(&instance, &(*this));
156  } else {
157  Attach(instance);
158  }
159  }
160 
162  /*explicit */SDKStringHandler(const SDKStringHandler& from) {
163  SDKStringInit(&(*this));
164  SDKStringDuplicate(&from.GetReference(), &(*this));
165  }
166 
169  Clear();
170  }
171 
174  if (&from != this) {
175  Clear();
176  SDKStringDuplicate(&from, &(*this));
177  }
178  return *this;
179  }
180 
182  SDKStringHandler& operator=(const SDKString& from) {
183  if (&from != this) {
184  Clear();
185  SDKStringDuplicate(&from, &(*this));
186  }
187  return *this;
188  }
189 
190  #if defined(SDK_HAS_CXX0X_RVALUE_REFS)
191  // C++0x is supported
192  SDKStringHandler(SDKStringHandler&& from) : SDKString(from) {
193  from.length = 0;
194  from.data = NULL;
195  }
196 
197  SDKStringHandler(SDKString&& from) : SDKString(from) {
198  from.length = 0;
199  from.data = NULL;
200  }
201 
203  {
204  assert(&from != this);
205  static_cast<SDKString&>(*this) = from;
206  from.length = 0;
207  from.data = NULL;
208  return *this;
209  }
210 
211  SDKStringHandler& operator=(SDKString&& from) {
212  assert(&from != this); // Paranoid
213  static_cast<SDKString&>(*this) = from;
214  from.length = 0;
215  from.data = NULL;
216  return *this;
217  }
218  #endif
219 
221  void operator=(const char* ascii) {
222  Clear();
223  SDKStringCreateA(&(*this), ascii, 0);
224  }
225 
227  void operator=(const wchar_t* wide) {
228  Clear();
229  SDKStringCreateW(&(*this), wide, 0);
230  }
231 
233  void operator=(const std::string& ascii) {
234  Clear();
235  SDKStringCreateA(&(*this), ascii.c_str(),
236  static_cast<SDKUInt32>(ascii.size()));
237  }
238 
240  void operator=(const std::wstring& wide) {
241  Clear();
242  SDKStringCreateW(&(*this), wide.c_str(),
243  static_cast<SDKUInt32>(wide.size()));
244  }
245 
247  bool operator==(const char* ascii) const {
248  SDKStringHandler scoped_ascii(ascii);
249  return (kSDKResult_True == SDKStringCompare(&(*this), &scoped_ascii));
250  }
251 
253  bool operator==(const wchar_t* wide) const {
254  SDKStringHandler scoped_wide(wide);
255  return (kSDKResult_True == SDKStringCompare(&(*this), &scoped_wide));
256  }
257 
259  SDKString* operator&() {
260  return static_cast<SDKString*>(this);
261  }
262 
264  //operator SDKString&() {
265  // return GetReference();
266  //}
267 
269  //operator const SDKString&() const {
270  // return GetReference();
271  //}
272 
274  SDKStringHandler& Attach(SDKString& instance) {
275  Clear();
276  static_cast<SDKString&>(*this) = instance;
277  SDKStringInit(&instance); // clear input variable
278  return *this;
279  }
280 
282  SDKString Detach() {
283  SDKString instance;
284  instance = static_cast<SDKString&>(*this);
285  SDKStringInit(&(*this));
286  return instance;
287  }
288 
290  SDKString Copy() {
291  SDKString res;
292  SDKStringInit(&res);
293  SDKStringDuplicate(&(*this), &res);
294  return res;
295  }
296 
298  SDKAny DetachAsAny() {
299  SDKAny any;
300  SDKAnyInitString(&any);
301  *any.str = static_cast<SDKString&>(*this);
302  SDKStringInit(&(*this));
303  return any;
304  }
305 
307  void Clear() {
308  SDKStringDelete(&(*this));
309  }
310 
312  std::wstring WString() const {
313  return WideFromSDKString((*this));
314  }
316  std::string ASCIIString() const {
317  return ASCIIFromSDKString((*this));
318  }
319 
321  SDKUInt64 GetLength() const {
322  return (*this).length;
323  }
324 
325  SDKUInt16* GetData() {
326  return (*this).data;
327  }
328 
329  const SDKUInt16* GetData() const {
330  return (*this).data;
331  }
332 
333  SDKString& GetReference() {
334  return *(static_cast<SDKString*>(this));
335  }
336 
337  const SDKString& GetReference() const {
338  return *(static_cast<const SDKString*>(this));
339  }
340 
341 private:
342 // SDKString m_instance;
343  friend class SDKAnyHandler;
344 };
348 
353 public:
354  SDKStringWrapper(SDKString& instance) : m_instance(instance) {
355  }
356 
358  SDKUInt64 GetLength() const {
359  return m_instance.length;
360  }
361 
362  SDKUInt16* GetData() {
363  return m_instance.data;
364  }
365 
366  const SDKUInt16* GetData() const {
367  return m_instance.data;
368  }
369 
370 private:
372  SDKStringWrapper(const SDKStringWrapper&);
373  void operator=(const SDKStringWrapper&);
374 
375  SDKString& m_instance;
376 };
377 
386 public:
387  SDKStringReturnHelper(std::wstring& wstr) : m_wstr(wstr) {
388  SDKStringInit(&m_sdk_string);
389  }
390 
392  m_wstr = SDKMakeWString(m_sdk_string);
393  SDKStringDelete(&m_sdk_string);
394  }
395 
396  operator SDKString&() {
397  return m_sdk_string;
398  }
399 
400  operator const SDKString&() const {
401  return m_sdk_string;
402  }
403 
404  SDKString& GetReference() {
405  return m_sdk_string;
406  }
407 
408 private:
411  void operator=(const SDKStringReturnHelper&);
412 
413 private:
414  SDKString m_sdk_string;
415  std::wstring& m_wstr;
416 };
417 
427 inline bool IsSDKStringEqual(const SDKString* str1, const SDKString* str2) {
428  if (!str1 && !str2)
429  return true;
430  if (!str1 || !str2)
431  return false;
432 
433  if (str1->length != str2->length)
434  return false;
435 
436  if (0 == str1->length)
437  return true;
438 
439  if (NULL == str1->data || NULL == str2->data)
440  return false; // wrong strings actually
441 
442 #ifndef SDK_CC_BCC
443  int cmp = memcmp(str1->data, str2->data,
444  str1->length * sizeof(str1->data[0]));
445 #else
446  int cmp = std::memcmp(str1->data, str2->data,
447  str1->length * sizeof(str1->data[0]));
448 #endif
449 
450  return (0 == cmp);
451 }
452 
453 } // namespace sdk
454 
455 #endif // SDK_SDK_STRING_HANDLER_H_
SDKStringInit
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringInit(SDKString *str)
Initializes SDKString structure.
sdk::SDKStringHandler::operator=
SDKStringHandler & operator=(const SDKStringHandler &from)
Assign operator.
Definition: sdk_string_handler.h:173
sdk::SDKStringReturnHelper
Helps to get wide string results from SDKString interface parameters.
Definition: sdk_string_handler.h:385
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler(const wchar_t *wide, SDKUInt32 size=0)
Creates handler from wide string.
Definition: sdk_string_handler.h:116
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::SDKStringHandler::SDKStringHandler
SDKStringHandler(const std::string &ascii)
Creates handler from the std::wstring string.
Definition: sdk_string_handler.h:136
sdk::SDKStringHandler::DetachAsAny
SDKAny DetachAsAny()
Detaches existing value placing it inside any.
Definition: sdk_string_handler.h:298
sdk::SDKStringHandler::operator=
void operator=(const char *ascii)
Assign operator.
Definition: sdk_string_handler.h:221
memory_portable.h
Portable way of including 'memory' header.
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler()
Creates handler with empty string.
Definition: sdk_string_handler.h:103
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler(const std::wstring &wide)
Creates handler from the std::wstring string.
Definition: sdk_string_handler.h:126
base_types.h
SDK base types.
sdk::SDKStringHandler::operator=
void operator=(const wchar_t *wide)
Assign operator.
Definition: sdk_string_handler.h:227
SDKAnyInitString
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKAnyInitString(SDKAny *any)
Initializes SDKAny value to contain pointer to empty SDKString.
sdk::SDKStringHandler::operator=
void operator=(const std::wstring &wide)
Assign operator.
Definition: sdk_string_handler.h:240
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler(SDKString &instance, bool duplicate)
Creates handler on the specified string.
Definition: sdk_string_handler.h:152
SDKStringDelete
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringDelete(SDKString *str)
Deletes SDKString instance.
sdk::IsSDKStringEqual
bool IsSDKStringEqual(const SDKString *str1, const SDKString *str2)
Compares two SDKStrings.
Definition: sdk_string_handler.h:427
SDKStringCreateI
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringCreateI(SDKString *str, const SDKUInt16 *int_string, SDKUInt32 size)
Creates SDKString from its internal representation. 'size' should contain length of the initializatio...
sdk::SDKStringHandler::ASCIIString
std::string ASCIIString() const
Returns SDKString as std::string.
Definition: sdk_string_handler.h:316
sdk::SDKStringHandler::Copy
SDKString Copy()
Assign operator.
Definition: sdk_string_handler.h:290
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler(const SDKString &instance)
Creates handler on copy of the specified string.
Definition: sdk_string_handler.h:146
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::SDKStringHandler::operator=
void operator=(const std::string &ascii)
Assign operator.
Definition: sdk_string_handler.h:233
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler(const char *ascii, SDKUInt32 size=0)
Creates handler from ASCII string.
Definition: sdk_string_handler.h:110
SDKStringCompare
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringCompare(const SDKString *str1, const SDKString *str2)
Compares strings.
sdk::SDKStringHandler::~SDKStringHandler
~SDKStringHandler()
Destroys internal sdk string.
Definition: sdk_string_handler.h:168
SDKStringDuplicate
SDK_EXTERN_C SDK_BASE_LIBRARY_EXPORT_API SDKResult SDK_APICALLTYPE SDKStringDuplicate(const SDKString *src, SDKString *dst)
Duplicates SDKString instance.
platform.h
Describes the platform constants.
sdk::SDKStringHandler::SDKStringHandler
SDKStringHandler(const SDKStringHandler &from)
Copy constructor.
Definition: sdk_string_handler.h:162
sdk::SDKStringHandler::operator==
bool operator==(const wchar_t *wide) const
Comparison operator.
Definition: sdk_string_handler.h:253
sdk::SDKStringHandler::operator&
SDKString * operator&()
Returns address of the internal sdk string.
Definition: sdk_string_handler.h:259
sdk::ScopedString
sdk::SDKStringHandler ScopedString
Synonym for the SDKStringHandler.
Definition: sdk_string_handler.h:347
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 ...
sdk::SDKMakeWString
static std::wstring SDKMakeWString(const SDKString &sdk_string)
Converts SDKString to std::wstring.
Definition: sdk_string_handler.h:61
sdk::SDKStringHandler::Detach
SDKString Detach()
Detaches existing value.
Definition: sdk_string_handler.h:282
sdk::SDKStringWrapper::GetLength
SDKUInt64 GetLength() const
String properties.
Definition: sdk_string_handler.h:358
sdk::SDKStringHandler::GetLength
SDKUInt64 GetLength() const
String properties.
Definition: sdk_string_handler.h:321
kSDKResult_True
static const SDKResult kSDKResult_True
Operation completed successfully with true result.
Definition: sdk_results.h:25
sdk::SDKMakeString
static std::string SDKMakeString(const SDKString &sdk_string)
Converts SDKString to std::string.
Definition: sdk_string_handler.h:33
sdk::SDKStringHandler::Clear
void Clear()
Clears existing value.
Definition: sdk_string_handler.h:307
sdk::SDKStringWrapper
Simple wrapper to access the SDKString properties.
Definition: sdk_string_handler.h:352
sdk::SDKStringHandler::WString
std::wstring WString() const
Returns SDKString as std::wstring.
Definition: sdk_string_handler.h:312
sdk::SDKStringHandler::operator==
bool operator==(const char *ascii) const
Comparison operator.
Definition: sdk_string_handler.h:247
sdk::SDKStringHandler::Attach
SDKStringHandler & Attach(SDKString &instance)
Returns reference to the internal sdk string.
Definition: sdk_string_handler.h:274
base_types_functions.h
Functions to work with SDK basic types.
sdk::SDKStringHandler::operator=
SDKStringHandler & operator=(const SDKString &from)
Assign operator.
Definition: sdk_string_handler.h:182