Back to home page

EIC code displayed by LXR

 
 

    


Warning, /include/opencascade/NCollection_UtfString.lxx is written in an unsupported language. File is not indexed.

0001 // Created on: 2013-01-28
0002 // Created by: Kirill GAVRILOV
0003 // Copyright (c) 2013-2014 OPEN CASCADE SAS
0004 //
0005 // This file is part of Open CASCADE Technology software library.
0006 //
0007 // This library is free software; you can redistribute it and/or modify it under
0008 // the terms of the GNU Lesser General Public License version 2.1 as published
0009 // by the Free Software Foundation, with special exception defined in the file
0010 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0011 // distribution for complete text of the license and disclaimer of any warranty.
0012 //
0013 // Alternatively, this file may be used under the terms of Open CASCADE
0014 // commercial license or contractual agreement.
0015 
0016 // =======================================================================
0017 // function : GetChar
0018 // purpose  :
0019 // =======================================================================
0020 template<typename Type>
0021 Standard_Utf32Char NCollection_UtfString<Type>::GetChar (const Standard_Integer theCharIndex) const
0022 {
0023   //Standard_ASSERT_SKIP (theCharIndex < myLength, "Out of range");
0024   NCollection_UtfIterator<Type> anIter (myString);
0025   for (; *anIter != 0; ++anIter)
0026   {
0027     if (anIter.Index() == theCharIndex)
0028     {
0029       return *anIter;
0030     }
0031   }
0032   return 0;
0033 }
0034 
0035 // =======================================================================
0036 // function : GetCharBuffer
0037 // purpose  :
0038 // =======================================================================
0039 template<typename Type>
0040 const Type* NCollection_UtfString<Type>::GetCharBuffer (const Standard_Integer theCharIndex) const
0041 {
0042   //Standard_ASSERT_SKIP(theCharIndex < myLength);
0043   NCollection_UtfIterator<Type> anIter (myString);
0044   for (; *anIter != 0; ++anIter)
0045   {
0046     if (anIter.Index() == theCharIndex)
0047     {
0048       return anIter.BufferHere();
0049     }
0050   }
0051   return NULL;
0052 }
0053 
0054 // =======================================================================
0055 // function : Clear
0056 // purpose  :
0057 // =======================================================================
0058 template<typename Type> inline
0059 void NCollection_UtfString<Type>::Clear()
0060 {
0061   strFree (myString);
0062   mySize   = 0;
0063   myLength = 0;
0064   myString = strAlloc (mySize);
0065 }
0066 
0067 // =======================================================================
0068 // function : NCollection_UtfString
0069 // purpose  :
0070 // =======================================================================
0071 template<typename Type> inline
0072 NCollection_UtfString<Type>::NCollection_UtfString()
0073 : myString (strAlloc(0)),
0074   mySize   (0),
0075   myLength (0)
0076 {
0077   //
0078 }
0079 
0080 // =======================================================================
0081 // function : NCollection_UtfString
0082 // purpose  :
0083 // =======================================================================
0084 template<typename Type> inline
0085 NCollection_UtfString<Type>::NCollection_UtfString (const NCollection_UtfString& theCopy)
0086 : myString (strAlloc (theCopy.mySize)),
0087   mySize   (theCopy.mySize),
0088   myLength (theCopy.myLength)
0089 {
0090   strCopy ((Standard_Byte* )myString, (const Standard_Byte* )theCopy.myString, mySize);
0091 }
0092 
0093 // =======================================================================
0094 // function : NCollection_UtfString
0095 // purpose  :
0096 // =======================================================================
0097 template<typename Type> inline
0098 NCollection_UtfString<Type>::NCollection_UtfString (NCollection_UtfString&& theOther)
0099 : myString(theOther.myString),
0100   mySize  (theOther.mySize),
0101   myLength(theOther.myLength)
0102 {
0103   theOther.myString = NULL;
0104   theOther.mySize   = 0;
0105   theOther.myLength = 0;
0106 }
0107 
0108 // =======================================================================
0109 // function : NCollection_UtfString
0110 // purpose  :
0111 // =======================================================================
0112 template<typename Type> inline
0113 NCollection_UtfString<Type>::NCollection_UtfString (const char*            theCopyUtf8,
0114                                                     const Standard_Integer theLength)
0115 : myString (NULL),
0116   mySize   (0),
0117   myLength (0)
0118 {
0119   FromUnicode (theCopyUtf8, theLength);
0120 }
0121 
0122 // =======================================================================
0123 // function : NCollection_UtfString
0124 // purpose  :
0125 // =======================================================================
0126 template<typename Type> inline
0127 NCollection_UtfString<Type>::NCollection_UtfString (const Standard_Utf16Char* theCopyUtf16,
0128                                                     const Standard_Integer    theLength)
0129 : myString (NULL),
0130   mySize   (0),
0131   myLength (0)
0132 {
0133   FromUnicode (theCopyUtf16, theLength);
0134 }
0135 
0136 // =======================================================================
0137 // function : NCollection_UtfString
0138 // purpose  :
0139 // =======================================================================
0140 template<typename Type> inline
0141 NCollection_UtfString<Type>::NCollection_UtfString (const Standard_Utf32Char* theCopyUtf32,
0142                                                     const Standard_Integer     theLength)
0143 : myString (NULL),
0144   mySize   (0),
0145   myLength (0)
0146 {
0147   FromUnicode (theCopyUtf32, theLength);
0148 }
0149 
0150 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) || (defined(_MSC_VER) && _MSC_VER >= 1900)
0151 // =======================================================================
0152 // function : NCollection_UtfString
0153 // purpose  :
0154 // =======================================================================
0155 template<typename Type> inline
0156 NCollection_UtfString<Type>::NCollection_UtfString (const Standard_WideChar* theCopyUtfWide,
0157                                                     const Standard_Integer   theLength)
0158 : myString (NULL),
0159   mySize   (0),
0160   myLength (0)
0161 {
0162   FromUnicode (theCopyUtfWide, theLength);
0163 }
0164 #endif
0165 
0166 // =======================================================================
0167 // function : ~NCollection_UtfString
0168 // purpose  :
0169 // =======================================================================
0170 template<typename Type> inline
0171 NCollection_UtfString<Type>::~NCollection_UtfString()
0172 {
0173   strFree (myString);
0174 }
0175 
0176 // =======================================================================
0177 // function : Assign
0178 // purpose  :
0179 // =======================================================================
0180 template<typename Type> inline
0181 const NCollection_UtfString<Type>& NCollection_UtfString<Type>::Assign (const NCollection_UtfString<Type>& theOther)
0182 {
0183   if (this == &theOther)
0184   {
0185     return (*this);
0186   }
0187 
0188   strFree (myString);
0189   mySize   = theOther.mySize;
0190   myLength = theOther.myLength;
0191   myString = strAlloc (mySize);
0192   strCopy ((Standard_Byte* )myString, (const Standard_Byte* )theOther.myString, mySize);
0193   return (*this);
0194 }
0195 
0196 // =======================================================================
0197 // function : Swap
0198 // purpose  :
0199 // =======================================================================
0200 template<typename Type> inline
0201 void NCollection_UtfString<Type>::Swap (NCollection_UtfString<Type>& theOther)
0202 {
0203   // Note: we could use std::swap() here, but prefer to not
0204   // have dependency on <algorithm> header at that level
0205   Type* aString = myString;
0206   const Standard_Integer aSize   = mySize;
0207   const Standard_Integer aLength = myLength;
0208   myString = theOther.myString;
0209   mySize   = theOther.mySize;
0210   myLength = theOther.myLength;
0211   theOther.myString = aString;
0212   theOther.mySize   = aSize;
0213   theOther.myLength = aLength;
0214 }
0215 
0216 #if !defined(__ANDROID__)
0217 //! Auxiliary conversion tool.
0218 class NCollection_UtfStringTool
0219 {
0220 public:
0221   //! Empty constructor.
0222   NCollection_UtfStringTool() : myWideBuffer (NULL) {}
0223 
0224   //! Destructor for temporary resources.
0225   Standard_EXPORT ~NCollection_UtfStringTool();
0226 
0227   //! Convert the string from current locale into UNICODE (wide characters) using system APIs.
0228   //! Returned pointer will be released by this tool.
0229   Standard_EXPORT wchar_t* FromLocale (const char* theString);
0230 
0231   //! Convert the UNICODE (wide characters) string into locale using system APIs.
0232   Standard_EXPORT static bool ToLocale (const wchar_t*         theWideString,
0233                                         char*                  theBuffer,
0234                                         const Standard_Integer theSizeBytes);
0235 private:
0236   wchar_t* myWideBuffer; //!< temporary variable
0237 };
0238 #endif
0239 
0240 // =======================================================================
0241 // function : FromLocale
0242 // purpose  :
0243 // =======================================================================
0244 template<typename Type> inline
0245 void NCollection_UtfString<Type>::FromLocale (const char*            theString,
0246                                               const Standard_Integer theLength)
0247 {
0248 #if defined(__ANDROID__)
0249   // no locales on Android
0250   FromUnicode (theString, theLength);
0251 #else
0252   NCollection_UtfStringTool aConvertor;
0253   wchar_t* aWideBuffer = aConvertor.FromLocale (theString);
0254   if (aWideBuffer == NULL)
0255   {
0256     Clear();
0257     return;
0258   }
0259   FromUnicode (aWideBuffer, theLength);
0260 #endif
0261 }
0262 
0263 // =======================================================================
0264 // function : ToLocale
0265 // purpose  :
0266 // =======================================================================
0267 template<typename Type> inline
0268 bool NCollection_UtfString<Type>::ToLocale (char*                  theBuffer,
0269                                             const Standard_Integer theSizeBytes) const
0270 {
0271 #if defined(__ANDROID__)
0272   // no locales on Android
0273   NCollection_UtfString<Standard_Utf8Char> anUtf8Copy (myString, myLength);
0274   const Standard_Integer aSize = anUtf8Copy.Size() + 1;
0275   if (theSizeBytes < aSize)
0276   {
0277     return false;
0278   }
0279   std::memcpy (theBuffer, anUtf8Copy.ToCString(), (Standard_Size )aSize);
0280   return true;
0281 #else
0282   NCollection_UtfString<wchar_t> aWideCopy (myString, myLength);
0283   return NCollection_UtfStringTool::ToLocale (aWideCopy.ToCString(), theBuffer, theSizeBytes);
0284 #endif
0285 }
0286 
0287 // =======================================================================
0288 // function : operator=
0289 // purpose  :
0290 // =======================================================================
0291 template<typename Type> inline
0292 const NCollection_UtfString<Type>& NCollection_UtfString<Type>::operator= (const char* theStringUtf8)
0293 {
0294   FromUnicode (theStringUtf8);
0295   return (*this);
0296 }
0297 
0298 // =======================================================================
0299 // function : operator=
0300 // purpose  :
0301 // =======================================================================
0302 template<typename Type> inline
0303 const NCollection_UtfString<Type>& NCollection_UtfString<Type>::operator= (const Standard_WideChar* theStringUtfWide)
0304 {
0305   FromUnicode (theStringUtfWide);
0306   return (*this);
0307 }
0308 
0309 // =======================================================================
0310 // function : IsEqual
0311 // purpose  :
0312 // =======================================================================
0313 template<typename Type> inline
0314 bool NCollection_UtfString<Type>::IsEqual (const NCollection_UtfString& theCompare) const
0315 {
0316   return this == &theCompare
0317       || strAreEqual (myString, mySize, theCompare.myString, theCompare.mySize);
0318 }
0319 
0320 // =======================================================================
0321 // function : operator!=
0322 // purpose  :
0323 // =======================================================================
0324 template<typename Type> inline
0325 bool NCollection_UtfString<Type>::operator!= (const NCollection_UtfString& theCompare) const
0326 {
0327   return (!NCollection_UtfString::operator== (theCompare));
0328 }
0329 
0330 // =======================================================================
0331 // function : operator+=
0332 // purpose  :
0333 // =======================================================================
0334 template<typename Type> inline
0335 NCollection_UtfString<Type>& NCollection_UtfString<Type>::operator+= (const NCollection_UtfString<Type>& theAppend)
0336 {
0337   if (theAppend.IsEmpty())
0338   {
0339     return (*this);
0340   }
0341 
0342   // create new string
0343   Standard_Integer aSize = mySize + theAppend.mySize;
0344   Type* aString = strAlloc (aSize);
0345   strCopy ((Standard_Byte* )aString,          (const Standard_Byte* )myString,           mySize);
0346   strCopy ((Standard_Byte* )aString + mySize, (const Standard_Byte* )theAppend.myString, theAppend.mySize);
0347 
0348   strFree (myString);
0349   mySize   = aSize;
0350   myString = aString;
0351   myLength += theAppend.myLength;
0352   return (*this);
0353 }
0354 
0355 // =======================================================================
0356 // function : SubString
0357 // purpose  :
0358 // =======================================================================
0359 template<typename Type> inline
0360 NCollection_UtfString<Type> NCollection_UtfString<Type>::SubString (const Standard_Integer theStart,
0361                                                                     const Standard_Integer theEnd) const
0362 {
0363   if (theStart >= theEnd)
0364   {
0365     return NCollection_UtfString<Type>();
0366   }
0367   for (NCollection_UtfIterator<Type> anIter(myString); *anIter != 0; ++anIter)
0368   {
0369     if (anIter.Index() >= theStart)
0370     {
0371       return NCollection_UtfString<Type> (anIter.BufferHere(), theEnd - theStart);
0372     }
0373   }
0374   return NCollection_UtfString<Type>();
0375 }
0376 
0377 // =======================================================================
0378 // function : ToUtf8
0379 // purpose  :
0380 // =======================================================================
0381 template<typename Type> inline
0382 const NCollection_UtfString<Standard_Utf8Char> NCollection_UtfString<Type>::ToUtf8() const
0383 {
0384   NCollection_UtfString<Standard_Utf8Char> aCopy;
0385   aCopy.FromUnicode (myString);
0386   return aCopy;
0387 }
0388 
0389 // =======================================================================
0390 // function : ToUtf16
0391 // purpose  :
0392 // =======================================================================
0393 template<typename Type> inline
0394 const NCollection_UtfString<Standard_Utf16Char> NCollection_UtfString<Type>::ToUtf16() const
0395 {
0396   NCollection_UtfString<Standard_Utf16Char> aCopy;
0397   aCopy.FromUnicode (myString);
0398   return aCopy;
0399 }
0400 
0401 // =======================================================================
0402 // function : ToUtf32
0403 // purpose  :
0404 // =======================================================================
0405 template<typename Type> inline
0406 const NCollection_UtfString<Standard_Utf32Char> NCollection_UtfString<Type>::ToUtf32() const
0407 {
0408   NCollection_UtfString<Standard_Utf32Char> aCopy;
0409   aCopy.FromUnicode (myString);
0410   return aCopy;
0411 }
0412 
0413 // =======================================================================
0414 // function : ToUtfWide
0415 // purpose  :
0416 // =======================================================================
0417 template<typename Type> inline
0418 const NCollection_UtfString<Standard_WideChar> NCollection_UtfString<Type>::ToUtfWide() const
0419 {
0420   NCollection_UtfString<Standard_WideChar> aCopy;
0421   aCopy.FromUnicode (myString);
0422   return aCopy;
0423 }