diff options
| author | Li Jin <dragon-fly@qq.com> | 2022-11-15 17:23:46 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2022-11-15 17:52:09 +0800 |
| commit | 94f8330613877b3582d32bd11abd83a97b4399ad (patch) | |
| tree | 5359de314be1ebde17f8d1e48632a97d18f9e50f /src/3rdParty/efsw/String.hpp | |
| parent | 60f8f00a022ac08701792b2897b72d8c99b50f52 (diff) | |
| download | yuescript-94f8330613877b3582d32bd11abd83a97b4399ad.tar.gz yuescript-94f8330613877b3582d32bd11abd83a97b4399ad.tar.bz2 yuescript-94f8330613877b3582d32bd11abd83a97b4399ad.zip | |
adding -w option to Yuescript tool.
Diffstat (limited to 'src/3rdParty/efsw/String.hpp')
| -rwxr-xr-x | src/3rdParty/efsw/String.hpp | 631 |
1 files changed, 631 insertions, 0 deletions
diff --git a/src/3rdParty/efsw/String.hpp b/src/3rdParty/efsw/String.hpp new file mode 100755 index 0000000..65bce33 --- /dev/null +++ b/src/3rdParty/efsw/String.hpp | |||
| @@ -0,0 +1,631 @@ | |||
| 1 | /** NOTE: | ||
| 2 | * This code is based on the Utf implementation from SFML2. License zlib/png ( | ||
| 3 | *http://www.sfml-dev.org/license.php ) The class was modified to fit efsw own needs. This is not | ||
| 4 | *the original implementation from SFML2. Functions and methods are the same that in std::string to | ||
| 5 | *facilitate portability. | ||
| 6 | **/ | ||
| 7 | |||
| 8 | #ifndef EFSW_STRING_HPP | ||
| 9 | #define EFSW_STRING_HPP | ||
| 10 | |||
| 11 | #include <cstdlib> | ||
| 12 | #include <cstring> | ||
| 13 | #include <efsw/base.hpp> | ||
| 14 | #include <fstream> | ||
| 15 | #include <iostream> | ||
| 16 | #include <locale> | ||
| 17 | #include <sstream> | ||
| 18 | #include <string> | ||
| 19 | #include <vector> | ||
| 20 | |||
| 21 | namespace efsw { | ||
| 22 | |||
| 23 | /** @brief Utility string class that automatically handles conversions between types and encodings | ||
| 24 | * **/ | ||
| 25 | class String { | ||
| 26 | public: | ||
| 27 | typedef Uint32 StringBaseType; | ||
| 28 | typedef std::basic_string<StringBaseType> StringType; | ||
| 29 | typedef StringType::iterator Iterator; //! Iterator type | ||
| 30 | typedef StringType::const_iterator ConstIterator; //! Constant iterator type | ||
| 31 | typedef StringType::reverse_iterator ReverseIterator; //! Reverse Iterator type | ||
| 32 | typedef StringType::const_reverse_iterator ConstReverseIterator; //! Constant iterator type | ||
| 33 | |||
| 34 | static const std::size_t InvalidPos; ///< Represents an invalid position in the string | ||
| 35 | |||
| 36 | template <class T> static std::string toStr( const T& i ) { | ||
| 37 | std::ostringstream ss; | ||
| 38 | ss << i; | ||
| 39 | return ss.str(); | ||
| 40 | } | ||
| 41 | |||
| 42 | /** Converts from a string to type */ | ||
| 43 | template <class T> | ||
| 44 | static bool fromString( T& t, const std::string& s, | ||
| 45 | std::ios_base& ( *f )( std::ios_base& ) = std::dec ) { | ||
| 46 | std::istringstream iss( s ); | ||
| 47 | return !( iss >> f >> t ).fail(); | ||
| 48 | } | ||
| 49 | |||
| 50 | /** Converts from a String to type */ | ||
| 51 | template <class T> | ||
| 52 | static bool fromString( T& t, const String& s, | ||
| 53 | std::ios_base& ( *f )( std::ios_base& ) = std::dec ) { | ||
| 54 | std::istringstream iss( s.toUtf8() ); | ||
| 55 | return !( iss >> f >> t ).fail(); | ||
| 56 | } | ||
| 57 | |||
| 58 | /** Split a string and hold it on a vector */ | ||
| 59 | static std::vector<std::string> split( const std::string& str, const char& splitchar, | ||
| 60 | const bool& pushEmptyString = false ); | ||
| 61 | |||
| 62 | /** Split a string and hold it on a vector */ | ||
| 63 | static std::vector<String> split( const String& str, const Uint32& splitchar, | ||
| 64 | const bool& pushEmptyString = false ); | ||
| 65 | |||
| 66 | /** Determine if a string starts with the string passed | ||
| 67 | ** @param start The substring expected to start | ||
| 68 | ** @param str The string to compare | ||
| 69 | ** @return -1 if the substring is no in str, otherwise the size of the substring | ||
| 70 | */ | ||
| 71 | static int strStartsWith( const std::string& start, const std::string& str ); | ||
| 72 | |||
| 73 | static int strStartsWith( const String& start, const String& str ); | ||
| 74 | |||
| 75 | /** @brief Construct from an UTF-8 string to UTF-32 according | ||
| 76 | ** @param uf8String UTF-8 string to convert | ||
| 77 | **/ | ||
| 78 | static String fromUtf8( const std::string& utf8String ); | ||
| 79 | |||
| 80 | /** @brief Default constructor | ||
| 81 | ** This constructor creates an empty string. | ||
| 82 | **/ | ||
| 83 | String(); | ||
| 84 | |||
| 85 | /** @brief Construct from a single ANSI character and a locale | ||
| 86 | ** The source character is converted to UTF-32 according | ||
| 87 | ** to the given locale. If you want to use the current global | ||
| 88 | ** locale, rather use the other constructor. | ||
| 89 | ** @param ansiChar ANSI character to convert | ||
| 90 | ** @param locale Locale to use for conversion | ||
| 91 | **/ | ||
| 92 | String( char ansiChar, const std::locale& locale = std::locale() ); | ||
| 93 | |||
| 94 | #ifndef EFSW_NO_WIDECHAR | ||
| 95 | /** @brief Construct from single wide character | ||
| 96 | ** @param wideChar Wide character to convert | ||
| 97 | **/ | ||
| 98 | String( wchar_t wideChar ); | ||
| 99 | #endif | ||
| 100 | |||
| 101 | /** @brief Construct from single UTF-32 character | ||
| 102 | ** @param utf32Char UTF-32 character to convert | ||
| 103 | **/ | ||
| 104 | String( StringBaseType utf32Char ); | ||
| 105 | |||
| 106 | /** @brief Construct from an from a null-terminated C-style UTF-8 string to UTF-32 | ||
| 107 | ** @param uf8String UTF-8 string to convert | ||
| 108 | **/ | ||
| 109 | String( const char* uf8String ); | ||
| 110 | |||
| 111 | /** @brief Construct from an UTF-8 string to UTF-32 according | ||
| 112 | ** @param uf8String UTF-8 string to convert | ||
| 113 | **/ | ||
| 114 | String( const std::string& utf8String ); | ||
| 115 | |||
| 116 | /** @brief Construct from a null-terminated C-style ANSI string and a locale | ||
| 117 | ** The source string is converted to UTF-32 according | ||
| 118 | ** to the given locale. If you want to use the current global | ||
| 119 | ** locale, rather use the other constructor. | ||
| 120 | ** @param ansiString ANSI string to convert | ||
| 121 | ** @param locale Locale to use for conversion | ||
| 122 | **/ | ||
| 123 | String( const char* ansiString, const std::locale& locale ); | ||
| 124 | |||
| 125 | /** @brief Construct from an ANSI string and a locale | ||
| 126 | ** The source string is converted to UTF-32 according | ||
| 127 | ** to the given locale. If you want to use the current global | ||
| 128 | ** locale, rather use the other constructor. | ||
| 129 | ** @param ansiString ANSI string to convert | ||
| 130 | ** @param locale Locale to use for conversion | ||
| 131 | **/ | ||
| 132 | String( const std::string& ansiString, const std::locale& locale ); | ||
| 133 | |||
| 134 | #ifndef EFSW_NO_WIDECHAR | ||
| 135 | /** @brief Construct from null-terminated C-style wide string | ||
| 136 | ** @param wideString Wide string to convert | ||
| 137 | **/ | ||
| 138 | String( const wchar_t* wideString ); | ||
| 139 | |||
| 140 | /** @brief Construct from a wide string | ||
| 141 | ** @param wideString Wide string to convert | ||
| 142 | **/ | ||
| 143 | String( const std::wstring& wideString ); | ||
| 144 | #endif | ||
| 145 | |||
| 146 | /** @brief Construct from a null-terminated C-style UTF-32 string | ||
| 147 | ** @param utf32String UTF-32 string to assign | ||
| 148 | **/ | ||
| 149 | String( const StringBaseType* utf32String ); | ||
| 150 | |||
| 151 | /** @brief Construct from an UTF-32 string | ||
| 152 | ** @param utf32String UTF-32 string to assign | ||
| 153 | **/ | ||
| 154 | String( const StringType& utf32String ); | ||
| 155 | |||
| 156 | /** @brief Copy constructor | ||
| 157 | ** @param str Instance to copy | ||
| 158 | **/ | ||
| 159 | String( const String& str ); | ||
| 160 | |||
| 161 | /** @brief Implicit cast operator to std::string (ANSI string) | ||
| 162 | ** The current global locale is used for conversion. If you | ||
| 163 | ** want to explicitely specify a locale, see toAnsiString. | ||
| 164 | ** Characters that do not fit in the target encoding are | ||
| 165 | ** discarded from the returned string. | ||
| 166 | ** This operator is defined for convenience, and is equivalent | ||
| 167 | ** to calling toAnsiString(). | ||
| 168 | ** @return Converted ANSI string | ||
| 169 | ** @see toAnsiString, operator String | ||
| 170 | **/ | ||
| 171 | operator std::string() const; | ||
| 172 | |||
| 173 | /** @brief Convert the unicode string to an ANSI string | ||
| 174 | ** The UTF-32 string is converted to an ANSI string in | ||
| 175 | ** the encoding defined by \a locale. If you want to use | ||
| 176 | ** the current global locale, see the other overload | ||
| 177 | ** of toAnsiString. | ||
| 178 | ** Characters that do not fit in the target encoding are | ||
| 179 | ** discarded from the returned string. | ||
| 180 | ** @param locale Locale to use for conversion | ||
| 181 | ** @return Converted ANSI string | ||
| 182 | ** @see toWideString, operator std::string | ||
| 183 | **/ | ||
| 184 | std::string toAnsiString( const std::locale& locale = std::locale() ) const; | ||
| 185 | |||
| 186 | #ifndef EFSW_NO_WIDECHAR | ||
| 187 | /** @brief Convert the unicode string to a wide string | ||
| 188 | ** Characters that do not fit in the target encoding are | ||
| 189 | ** discarded from the returned string. | ||
| 190 | ** @return Converted wide string | ||
| 191 | ** @see toAnsiString, operator String | ||
| 192 | **/ | ||
| 193 | std::wstring toWideString() const; | ||
| 194 | #endif | ||
| 195 | |||
| 196 | std::string toUtf8() const; | ||
| 197 | |||
| 198 | /** @brief Overload of assignment operator | ||
| 199 | ** @param right Instance to assign | ||
| 200 | ** @return Reference to self | ||
| 201 | **/ | ||
| 202 | String& operator=( const String& right ); | ||
| 203 | |||
| 204 | String& operator=( const StringBaseType& right ); | ||
| 205 | |||
| 206 | /** @brief Overload of += operator to append an UTF-32 string | ||
| 207 | ** @param right String to append | ||
| 208 | ** @return Reference to self | ||
| 209 | **/ | ||
| 210 | String& operator+=( const String& right ); | ||
| 211 | |||
| 212 | String& operator+=( const StringBaseType& right ); | ||
| 213 | |||
| 214 | /** @brief Overload of [] operator to access a character by its position | ||
| 215 | ** This function provides read-only access to characters. | ||
| 216 | ** Note: this function doesn't throw if \a index is out of range. | ||
| 217 | ** @param index Index of the character to get | ||
| 218 | ** @return Character at position \a index | ||
| 219 | **/ | ||
| 220 | StringBaseType operator[]( std::size_t index ) const; | ||
| 221 | |||
| 222 | /** @brief Overload of [] operator to access a character by its position | ||
| 223 | ** This function provides read and write access to characters. | ||
| 224 | ** Note: this function doesn't throw if \a index is out of range. | ||
| 225 | ** @param index Index of the character to get | ||
| 226 | ** @return Reference to the character at position \a index | ||
| 227 | **/ | ||
| 228 | |||
| 229 | StringBaseType& operator[]( std::size_t index ); | ||
| 230 | |||
| 231 | /** @brief Get character in string | ||
| 232 | ** Performs a range check, throwing an exception of type out_of_range in case that pos is not an | ||
| 233 | *actual position in the string. | ||
| 234 | ** @return The character at position pos in the string. | ||
| 235 | */ | ||
| 236 | StringBaseType at( std::size_t index ) const; | ||
| 237 | |||
| 238 | /** @brief clear the string | ||
| 239 | ** This function removes all the characters from the string. | ||
| 240 | ** @see empty, erase | ||
| 241 | **/ | ||
| 242 | void clear(); | ||
| 243 | |||
| 244 | /** @brief Get the size of the string | ||
| 245 | ** @return Number of characters in the string | ||
| 246 | ** @see empty | ||
| 247 | **/ | ||
| 248 | std::size_t size() const; | ||
| 249 | |||
| 250 | /** @see size() */ | ||
| 251 | std::size_t length() const; | ||
| 252 | |||
| 253 | /** @brief Check whether the string is empty or not | ||
| 254 | ** @return True if the string is empty (i.e. contains no character) | ||
| 255 | ** @see clear, size | ||
| 256 | **/ | ||
| 257 | bool empty() const; | ||
| 258 | |||
| 259 | /** @brief Erase one or more characters from the string | ||
| 260 | ** This function removes a sequence of \a count characters | ||
| 261 | ** starting from \a position. | ||
| 262 | ** @param position Position of the first character to erase | ||
| 263 | ** @param count Number of characters to erase | ||
| 264 | **/ | ||
| 265 | void erase( std::size_t position, std::size_t count = 1 ); | ||
| 266 | |||
| 267 | /** @brief Insert one or more characters into the string | ||
| 268 | ** This function inserts the characters of \a str | ||
| 269 | ** into the string, starting from \a position. | ||
| 270 | ** @param position Position of insertion | ||
| 271 | ** @param str Characters to insert | ||
| 272 | **/ | ||
| 273 | String& insert( std::size_t position, const String& str ); | ||
| 274 | |||
| 275 | String& insert( std::size_t pos1, const String& str, std::size_t pos2, std::size_t n ); | ||
| 276 | |||
| 277 | String& insert( std::size_t pos1, const char* s, std::size_t n ); | ||
| 278 | |||
| 279 | String& insert( std::size_t pos1, const char* s ); | ||
| 280 | |||
| 281 | String& insert( std::size_t pos1, size_t n, char c ); | ||
| 282 | |||
| 283 | Iterator insert( Iterator p, char c ); | ||
| 284 | |||
| 285 | void insert( Iterator p, std::size_t n, char c ); | ||
| 286 | |||
| 287 | template <class InputIterator> | ||
| 288 | void insert( Iterator p, InputIterator first, InputIterator last ) { | ||
| 289 | mString.insert( p, first, last ); | ||
| 290 | } | ||
| 291 | |||
| 292 | /** @brief Find a sequence of one or more characters in the string | ||
| 293 | ** This function searches for the characters of \a str | ||
| 294 | ** into the string, starting from \a start. | ||
| 295 | ** @param str Characters to find | ||
| 296 | ** @param start Where to begin searching | ||
| 297 | ** @return Position of \a str in the string, or String::InvalidPos if not found | ||
| 298 | **/ | ||
| 299 | std::size_t find( const String& str, std::size_t start = 0 ) const; | ||
| 300 | |||
| 301 | std::size_t find( const char* s, std::size_t pos, std::size_t n ) const; | ||
| 302 | |||
| 303 | std::size_t find( const char* s, std::size_t pos = 0 ) const; | ||
| 304 | |||
| 305 | std::size_t find( char c, std::size_t pos = 0 ) const; | ||
| 306 | |||
| 307 | /** @brief Get a pointer to the C-style array of characters | ||
| 308 | ** This functions provides a read-only access to a | ||
| 309 | ** null-terminated C-style representation of the string. | ||
| 310 | ** The returned pointer is temporary and is meant only for | ||
| 311 | ** immediate use, thus it is not recommended to store it. | ||
| 312 | ** @return Read-only pointer to the array of characters | ||
| 313 | **/ | ||
| 314 | const StringBaseType* c_str() const; | ||
| 315 | |||
| 316 | /** @brief Get string data | ||
| 317 | ** Notice that no terminating null character is appended (see member c_str for such a | ||
| 318 | *functionality). | ||
| 319 | ** The returned array points to an internal location which should not be modified directly in | ||
| 320 | *the program. | ||
| 321 | ** Its contents are guaranteed to remain unchanged only until the next call to a non-constant | ||
| 322 | *member function of the string object. | ||
| 323 | ** @return Pointer to an internal array containing the same content as the string. | ||
| 324 | **/ | ||
| 325 | const StringBaseType* data() const; | ||
| 326 | |||
| 327 | /** @brief Return an iterator to the beginning of the string | ||
| 328 | ** @return Read-write iterator to the beginning of the string characters | ||
| 329 | ** @see end | ||
| 330 | **/ | ||
| 331 | Iterator begin(); | ||
| 332 | |||
| 333 | /** @brief Return an iterator to the beginning of the string | ||
| 334 | ** @return Read-only iterator to the beginning of the string characters | ||
| 335 | ** @see end | ||
| 336 | **/ | ||
| 337 | ConstIterator begin() const; | ||
| 338 | |||
| 339 | /** @brief Return an iterator to the beginning of the string | ||
| 340 | ** The end iterator refers to 1 position past the last character; | ||
| 341 | ** thus it represents an invalid character and should never be | ||
| 342 | ** accessed. | ||
| 343 | ** @return Read-write iterator to the end of the string characters | ||
| 344 | ** @see begin | ||
| 345 | **/ | ||
| 346 | Iterator end(); | ||
| 347 | |||
| 348 | /** @brief Return an iterator to the beginning of the string | ||
| 349 | ** The end iterator refers to 1 position past the last character; | ||
| 350 | ** thus it represents an invalid character and should never be | ||
| 351 | ** accessed. | ||
| 352 | ** @return Read-only iterator to the end of the string characters | ||
| 353 | ** @see begin | ||
| 354 | **/ | ||
| 355 | ConstIterator end() const; | ||
| 356 | |||
| 357 | /** @brief Return an reverse iterator to the beginning of the string | ||
| 358 | ** @return Read-write reverse iterator to the beginning of the string characters | ||
| 359 | ** @see end | ||
| 360 | **/ | ||
| 361 | ReverseIterator rbegin(); | ||
| 362 | |||
| 363 | /** @brief Return an reverse iterator to the beginning of the string | ||
| 364 | ** @return Read-only reverse iterator to the beginning of the string characters | ||
| 365 | ** @see end | ||
| 366 | **/ | ||
| 367 | ConstReverseIterator rbegin() const; | ||
| 368 | |||
| 369 | /** @brief Return an reverse iterator to the beginning of the string | ||
| 370 | ** The end reverse iterator refers to 1 position past the last character; | ||
| 371 | ** thus it represents an invalid character and should never be | ||
| 372 | ** accessed. | ||
| 373 | ** @return Read-write reverse iterator to the end of the string characters | ||
| 374 | ** @see begin | ||
| 375 | **/ | ||
| 376 | ReverseIterator rend(); | ||
| 377 | |||
| 378 | /** @brief Return an reverse iterator to the beginning of the string | ||
| 379 | ** The end reverse iterator refers to 1 position past the last character; | ||
| 380 | ** thus it represents an invalid character and should never be | ||
| 381 | ** accessed. | ||
| 382 | ** @return Read-only reverse iterator to the end of the string characters | ||
| 383 | ** @see begin | ||
| 384 | **/ | ||
| 385 | ConstReverseIterator rend() const; | ||
| 386 | |||
| 387 | /** @brief Resize String */ | ||
| 388 | void resize( std::size_t n, StringBaseType c ); | ||
| 389 | |||
| 390 | /** @brief Resize String */ | ||
| 391 | void resize( std::size_t n ); | ||
| 392 | |||
| 393 | /** @return Maximum size of string */ | ||
| 394 | std::size_t max_size() const; | ||
| 395 | |||
| 396 | /** @brief Request a change in capacity */ | ||
| 397 | void reserve( size_t res_arg = 0 ); | ||
| 398 | |||
| 399 | /** @return Size of allocated storage */ | ||
| 400 | std::size_t capacity() const; | ||
| 401 | |||
| 402 | /** @brief Append character to string */ | ||
| 403 | void push_back( StringBaseType c ); | ||
| 404 | |||
| 405 | /** @brief Swap contents with another string */ | ||
| 406 | void swap( String& str ); | ||
| 407 | |||
| 408 | String& assign( const String& str ); | ||
| 409 | |||
| 410 | String& assign( const String& str, std::size_t pos, std::size_t n ); | ||
| 411 | |||
| 412 | String& assign( const char* s, std::size_t n ); | ||
| 413 | |||
| 414 | String& assign( const char* s ); | ||
| 415 | |||
| 416 | String& assign( std::size_t n, char c ); | ||
| 417 | |||
| 418 | template <class InputIterator> String& assign( InputIterator first, InputIterator last ) { | ||
| 419 | mString.assign( first, last ); | ||
| 420 | return *this; | ||
| 421 | } | ||
| 422 | |||
| 423 | String& append( const String& str ); | ||
| 424 | |||
| 425 | String& append( const String& str, std::size_t pos, std::size_t n ); | ||
| 426 | |||
| 427 | String& append( const char* s, std::size_t n ); | ||
| 428 | |||
| 429 | String& append( const char* s ); | ||
| 430 | |||
| 431 | String& append( std::size_t n, char c ); | ||
| 432 | |||
| 433 | String& append( std::size_t n, StringBaseType c ); | ||
| 434 | |||
| 435 | template <class InputIterator> String& append( InputIterator first, InputIterator last ) { | ||
| 436 | mString.append( first, last ); | ||
| 437 | return *this; | ||
| 438 | } | ||
| 439 | |||
| 440 | String& replace( std::size_t pos1, std::size_t n1, const String& str ); | ||
| 441 | |||
| 442 | String& replace( Iterator i1, Iterator i2, const String& str ); | ||
| 443 | |||
| 444 | String& replace( std::size_t pos1, std::size_t n1, const String& str, std::size_t pos2, | ||
| 445 | std::size_t n2 ); | ||
| 446 | |||
| 447 | String& replace( std::size_t pos1, std::size_t n1, const char* s, std::size_t n2 ); | ||
| 448 | |||
| 449 | String& replace( Iterator i1, Iterator i2, const char* s, std::size_t n2 ); | ||
| 450 | |||
| 451 | String& replace( std::size_t pos1, std::size_t n1, const char* s ); | ||
| 452 | |||
| 453 | String& replace( Iterator i1, Iterator i2, const char* s ); | ||
| 454 | |||
| 455 | String& replace( std::size_t pos1, std::size_t n1, std::size_t n2, char c ); | ||
| 456 | |||
| 457 | String& replace( Iterator i1, Iterator i2, std::size_t n2, char c ); | ||
| 458 | |||
| 459 | template <class InputIterator> | ||
| 460 | String& replace( Iterator i1, Iterator i2, InputIterator j1, InputIterator j2 ) { | ||
| 461 | mString.replace( i1, i2, j1, j2 ); | ||
| 462 | return *this; | ||
| 463 | } | ||
| 464 | |||
| 465 | std::size_t rfind( const String& str, std::size_t pos = StringType::npos ) const; | ||
| 466 | |||
| 467 | std::size_t rfind( const char* s, std::size_t pos, std::size_t n ) const; | ||
| 468 | |||
| 469 | std::size_t rfind( const char* s, std::size_t pos = StringType::npos ) const; | ||
| 470 | |||
| 471 | std::size_t rfind( char c, std::size_t pos = StringType::npos ) const; | ||
| 472 | |||
| 473 | String substr( std::size_t pos = 0, std::size_t n = StringType::npos ) const; | ||
| 474 | |||
| 475 | std::size_t copy( StringBaseType* s, std::size_t n, std::size_t pos = 0 ) const; | ||
| 476 | |||
| 477 | int compare( const String& str ) const; | ||
| 478 | |||
| 479 | int compare( const char* s ) const; | ||
| 480 | |||
| 481 | int compare( std::size_t pos1, std::size_t n1, const String& str ) const; | ||
| 482 | |||
| 483 | int compare( std::size_t pos1, std::size_t n1, const char* s ) const; | ||
| 484 | |||
| 485 | int compare( std::size_t pos1, std::size_t n1, const String& str, std::size_t pos2, | ||
| 486 | std::size_t n2 ) const; | ||
| 487 | |||
| 488 | int compare( std::size_t pos1, std::size_t n1, const char* s, std::size_t n2 ) const; | ||
| 489 | |||
| 490 | std::size_t find_first_of( const String& str, std::size_t pos = 0 ) const; | ||
| 491 | |||
| 492 | std::size_t find_first_of( const char* s, std::size_t pos, std::size_t n ) const; | ||
| 493 | |||
| 494 | std::size_t find_first_of( const char* s, std::size_t pos = 0 ) const; | ||
| 495 | |||
| 496 | std::size_t find_first_of( StringBaseType c, std::size_t pos = 0 ) const; | ||
| 497 | |||
| 498 | std::size_t find_last_of( const String& str, std::size_t pos = StringType::npos ) const; | ||
| 499 | |||
| 500 | std::size_t find_last_of( const char* s, std::size_t pos, std::size_t n ) const; | ||
| 501 | |||
| 502 | std::size_t find_last_of( const char* s, std::size_t pos = StringType::npos ) const; | ||
| 503 | |||
| 504 | std::size_t find_last_of( StringBaseType c, std::size_t pos = StringType::npos ) const; | ||
| 505 | |||
| 506 | std::size_t find_first_not_of( const String& str, std::size_t pos = 0 ) const; | ||
| 507 | |||
| 508 | std::size_t find_first_not_of( const char* s, std::size_t pos, std::size_t n ) const; | ||
| 509 | |||
| 510 | std::size_t find_first_not_of( const char* s, std::size_t pos = 0 ) const; | ||
| 511 | |||
| 512 | std::size_t find_first_not_of( StringBaseType c, std::size_t pos = 0 ) const; | ||
| 513 | |||
| 514 | std::size_t find_last_not_of( const String& str, std::size_t pos = StringType::npos ) const; | ||
| 515 | |||
| 516 | std::size_t find_last_not_of( const char* s, std::size_t pos, std::size_t n ) const; | ||
| 517 | |||
| 518 | std::size_t find_last_not_of( const char* s, std::size_t pos = StringType::npos ) const; | ||
| 519 | |||
| 520 | std::size_t find_last_not_of( StringBaseType c, std::size_t pos = StringType::npos ) const; | ||
| 521 | |||
| 522 | private: | ||
| 523 | friend bool operator==( const String& left, const String& right ); | ||
| 524 | friend bool operator<( const String& left, const String& right ); | ||
| 525 | |||
| 526 | StringType mString; ///< Internal string of UTF-32 characters | ||
| 527 | }; | ||
| 528 | |||
| 529 | /** @relates String | ||
| 530 | ** @brief Overload of == operator to compare two UTF-32 strings | ||
| 531 | ** @param left Left operand (a string) | ||
| 532 | ** @param right Right operand (a string) | ||
| 533 | ** @return True if both strings are equal | ||
| 534 | **/ | ||
| 535 | bool operator==( const String& left, const String& right ); | ||
| 536 | |||
| 537 | /** @relates String | ||
| 538 | ** @brief Overload of != operator to compare two UTF-32 strings | ||
| 539 | ** @param left Left operand (a string) | ||
| 540 | ** @param right Right operand (a string) | ||
| 541 | ** @return True if both strings are different | ||
| 542 | **/ | ||
| 543 | bool operator!=( const String& left, const String& right ); | ||
| 544 | |||
| 545 | /** @relates String | ||
| 546 | ** @brief Overload of < operator to compare two UTF-32 strings | ||
| 547 | ** @param left Left operand (a string) | ||
| 548 | ** @param right Right operand (a string) | ||
| 549 | ** @return True if \a left is alphabetically lesser than \a right | ||
| 550 | **/ | ||
| 551 | bool operator<( const String& left, const String& right ); | ||
| 552 | |||
| 553 | /** @relates String | ||
| 554 | ** @brief Overload of > operator to compare two UTF-32 strings | ||
| 555 | ** @param left Left operand (a string) | ||
| 556 | ** @param right Right operand (a string) | ||
| 557 | ** @return True if \a left is alphabetically greater than \a right | ||
| 558 | **/ | ||
| 559 | bool operator>( const String& left, const String& right ); | ||
| 560 | |||
| 561 | /** @relates String | ||
| 562 | ** @brief Overload of <= operator to compare two UTF-32 strings | ||
| 563 | ** @param left Left operand (a string) | ||
| 564 | ** @param right Right operand (a string) | ||
| 565 | ** @return True if \a left is alphabetically lesser or equal than \a right | ||
| 566 | **/ | ||
| 567 | bool operator<=( const String& left, const String& right ); | ||
| 568 | |||
| 569 | /** @relates String | ||
| 570 | ** @brief Overload of >= operator to compare two UTF-32 strings | ||
| 571 | ** @param left Left operand (a string) | ||
| 572 | ** @param right Right operand (a string) | ||
| 573 | ** @return True if \a left is alphabetically greater or equal than \a right | ||
| 574 | **/ | ||
| 575 | bool operator>=( const String& left, const String& right ); | ||
| 576 | |||
| 577 | /** @relates String | ||
| 578 | ** @brief Overload of binary + operator to concatenate two strings | ||
| 579 | ** @param left Left operand (a string) | ||
| 580 | ** @param right Right operand (a string) | ||
| 581 | ** @return Concatenated string | ||
| 582 | **/ | ||
| 583 | String operator+( const String& left, const String& right ); | ||
| 584 | |||
| 585 | } // namespace efsw | ||
| 586 | |||
| 587 | #endif | ||
| 588 | |||
| 589 | /** @class efsw::String | ||
| 590 | ** @ingroup system | ||
| 591 | ** efsw::String is a utility string class defined mainly for | ||
| 592 | ** convenience. It is a Unicode string (implemented using | ||
| 593 | ** UTF-32), thus it can store any character in the world | ||
| 594 | ** (european, chinese, arabic, hebrew, etc.). | ||
| 595 | ** It automatically handles conversions from/to ANSI and | ||
| 596 | ** wide strings, so that you can work with standard string | ||
| 597 | ** classes and still be compatible with functions taking a | ||
| 598 | ** efsw::String. | ||
| 599 | ** @code | ||
| 600 | ** efsw::String s; | ||
| 601 | ** std::string s1 = s; // automatically converted to ANSI string | ||
| 602 | ** String s2 = s; // automatically converted to wide string | ||
| 603 | ** s = "hello"; // automatically converted from ANSI string | ||
| 604 | ** s = L"hello"; // automatically converted from wide string | ||
| 605 | ** s += 'a'; // automatically converted from ANSI string | ||
| 606 | ** s += L'a'; // automatically converted from wide string | ||
| 607 | ** @endcode | ||
| 608 | ** Conversions involving ANSI strings use the default user locale. However | ||
| 609 | ** it is possible to use a custom locale if necessary: | ||
| 610 | ** @code | ||
| 611 | ** std::locale locale; | ||
| 612 | ** efsw::String s; | ||
| 613 | ** ... | ||
| 614 | ** std::string s1 = s.toAnsiString(locale); | ||
| 615 | ** s = efsw::String("hello", locale); | ||
| 616 | ** @endcode | ||
| 617 | ** | ||
| 618 | ** efsw::String defines the most important functions of the | ||
| 619 | ** standard std::string class: removing, random access, iterating, | ||
| 620 | ** appending, comparing, etc. However it is a simple class | ||
| 621 | ** provided for convenience, and you may have to consider using | ||
| 622 | ** a more optimized class if your program requires complex string | ||
| 623 | ** handling. The automatic conversion functions will then take | ||
| 624 | ** care of converting your string to efsw::String whenever EE | ||
| 625 | ** requires it. | ||
| 626 | ** | ||
| 627 | ** Please note that EE also defines a low-level, generic | ||
| 628 | ** interface for Unicode handling, see the efsw::Utf classes. | ||
| 629 | ** | ||
| 630 | ** All credits to Laurent Gomila, i just modified and expanded a little bit the implementation. | ||
| 631 | **/ | ||
