You.i Engine
YiString.h
Go to the documentation of this file.
1 // © You i Labs Inc. 2000-2017. All rights reserved.
2 #ifndef _YI_STRING_H_
3 #define _YI_STRING_H_
4 
5 #include "framework/YiPredef.h"
6 
7 #include <limits>
8 #include <memory>
9 #include <ostream>
10 
11 #include <unicode/unistr.h>
12 
13 #if defined(__OBJC__)
14 @class NSString;
15 #endif
16 
35 class CYIString
36 {
37  class ConstIteratorPriv;
38 
39 public:
40 
46  static const CYIString EMPTY_STRING;
47 
49  typedef std::reverse_iterator<ConstIterator> ConstReverseIterator;
50 
57  {
58  public:
59  friend class CYIString;
60 
61  typedef std::bidirectional_iterator_tag iterator_category;
62  typedef char32_t value_type;
63  typedef ptrdiff_t difference_type;
64  typedef const char32_t *pointer;
65  typedef char32_t reference;
66 
67  ConstIterator();
68  ConstIterator(const CYIString &string, uint32_t uCharactersOffset);
69  ConstIterator(const ConstIterator &other);
71 
72  ConstIterator &operator=(const ConstIterator &other);
73 
77  value_type operator*() const;
78 
79  bool operator==(const ConstIterator &other) const;
80  bool operator!=(const ConstIterator &other) const;
81 
86 
90  const char *GetData() const;
91 
92  ConstReverseIterator Reverse() const;
93 
94  private:
95  static const size_t YI_STRING_ITERATOR_SIZE = sizeof(char *) * 3;
96 
97  ConstIterator(const CYIString &string, const char *pPosition);
98  char m_storage[YI_STRING_ITERATOR_SIZE];
99  };
100 
102  typedef std::reverse_iterator<Iterator> ReverseIterator;
103 
108  {
117  };
118 
122  static const CYIString &EmptyString();
123 
127  CYIString();
128 
132  CYIString(const CYIString &s);
133 
137  CYIString(CYIString &&s);
138 
142  CYIString(std::string &&string);
143 
149  CYIString(const std::string &s);
150 
156  explicit CYIString(char32_t character);
157 
164 
170  CYIString(const std::wstring &s);
171 
177  CYIString(const U_NAMESPACE_QUALIFIER UnicodeString &s, uint32_t uSizeHintBytes = 0);
178 
179 #if defined(__OBJC__) || defined(DOXY)
180 
185  CYIString(const NSString *string);
186 
192  CYIString(const CFStringRef string);
193 #endif
194 
200  CYIString(const char *pUTF8);
201 
209  CYIString(const char *pUTF8, uint32_t uSizeBytes);
210 
218  CYIString(const char16_t *pUTF16, uint32_t uSize = std::numeric_limits<uint32_t>::max());
219 
227  CYIString(const char32_t *pUTF32, uint32_t uSize = std::numeric_limits<uint32_t>::max());
228 
236  CYIString(const wchar_t *pWideChars, uint32_t uSize = std::numeric_limits<uint32_t>::max());
237 
241  operator const char *() const;
242 
246  CYIString &operator=(const CYIString &s);
247 
253  CYIString &operator=(const char *pUTF8);
254 
259 
263  bool operator==(const CYIString &s) const;
264 
268  bool operator==(const char *pUTF8) const;
269 
273  bool operator!=(const CYIString &s) const;
274 
278  bool operator!=(const char *pUTF8) const;
279 
283  bool operator<(const CYIString &s1) const;
284 
288  bool operator>(const CYIString &s1) const;
289 
293  bool operator<=(const CYIString &s1) const;
294 
298  bool operator>=(const CYIString &s1) const;
299 
303  char32_t operator[](int32_t nPos) const;
304 
308  CYIString &operator+=(const CYIString &s);
309 
315  CYIString &operator+=(const char *pUTF8);
316 
320  template <class T>
321  CYIString operator+(T arg) const;
322 
323 
324 
335  template<class T>
336  static CYIString FromValue(const T &arg, bool *pbError = nullptr);
337 
349  static CYIString FromFloat(float fValue, uint32_t uDecimalPlaces = 6, bool bTrailingZeroes = false, bool bUseSignificantDigits = false);
350 
362  static CYIString FromDouble(double fValue, uint32_t uDecimalPlaces = 6, bool bTrailingZeroes = false, bool bUseSignificantDigits = false);
363 
367  static const CYIString &FromBool(bool bValue);
368 
369 
370 
374  friend std::istream &operator>>(std::istream &stream, CYIString &val);
375 
376 
377 
383  bool IsEmpty() const;
384 
392  bool IsNotEmpty() const;
393 
401  uint32_t GetLength() const;
402 
408  uint32_t GetSizeInBytes() const;
409 
415  bool ContainsNonASCII() const;
416 
422  char32_t At(uint32_t uPos) const;
423 
431  char ByteAt(uint32_t uByteOffset) const;
432 
438  bool Contains(const CYIString &s, CASE_MODE eCaseSensitivity = CASE_SENSITIVE) const;
439 
447  bool StartsWith(const CYIString &s, CASE_MODE eCaseSensitivity = CASE_SENSITIVE) const;
448 
456  bool EndsWith(const CYIString &s, CASE_MODE eCaseSensitivity = CASE_SENSITIVE) const;
457 
463  int32_t Compare(const CYIString &s, CASE_MODE eCaseSensitivity = CASE_SENSITIVE) const;
464 
472  std::vector<CYIString> Split(const CYIString &delimiter, bool bIgnoreEmptySubstrings = true, uint32_t uMaximumParts = std::numeric_limits<uint32_t>::max()) const;
473 
477  CYIString SubStr(uint32_t uPos = 0, uint32_t uLen = std::numeric_limits<uint32_t>::max()) const;
478 
482  CYIString SubStr(const ConstIterator &begin, const ConstIterator &end) const;
483 
487  CYIString Left(uint32_t uLen) const;
488 
492  CYIString Right(uint32_t uLen) const;
493 
497  CYIString ToUpper() const;
498 
502  CYIString ToLower() const;
503 
511  CYIString ToNormalizedText(bool *pbError = nullptr) const;
512 
518  bool IsNumeric() const;
519 
527  int32_t IndexOf(const CYIString &s, uint32_t uPos = 0) const;
528 
536  int32_t LastIndexOf(const CYIString &s, uint32_t uPos = std::numeric_limits<uint32_t>::max()) const;
537 
541  ConstIterator Find(const CYIString &s, const ConstIterator &begin) const;
542 
546  ConstReverseIterator ReverseFind(const CYIString &s, const ConstReverseIterator &begin) const;
547 
555  CYIString Arg(const CYIString &rText) const;
556 
566  const char *GetData() const;
567 
571  ConstIterator begin() const;
572 
576  ConstIterator end() const;
577 
581  ConstReverseIterator rbegin() const;
582 
586  ConstReverseIterator rend() const;
587 
588 
589 
593  void Clear();
594 
598  CYIString &Append(const CYIString &s);
599 
607  CYIString &Append(const char *pUTF8, uint32_t uSizeBytes = std::numeric_limits<uint32_t>::max());
608 
615 
619  CYIString &Prepend(const CYIString &s);
620 
628  CYIString &Prepend(const char *pUTF8, uint32_t uSizeBytes = std::numeric_limits<uint32_t>::max());
629 
636 
644  CYIString &Insert(const CYIString &s, uint32_t uPos, uint32_t uLen = std::numeric_limits<uint32_t>::max());
645 
649  ConstIterator Insert(const CYIString &s, const ConstIterator &insertPosition);
650 
654  ConstIterator Insert(const ConstIterator &begin, const ConstIterator &end, const ConstIterator &insertPosition);
655 
659  CYIString &Erase(uint32_t uPos = 0, uint32_t uLen = std::numeric_limits<uint32_t>::max());
660 
667 
673  CYIString &Replace(const CYIString &s, uint32_t uPos, uint32_t uLen);
674 
681 
689  CYIString &Replace(const CYIString &oldSubstring, const CYIString &newSubstring, uint32_t uMaximumReplacements = std::numeric_limits<uint32_t>::max());
690 
694  void Remove(const CYIString &text);
695 
699  void Swap(CYIString &s);
700 
704  void Trim();
705 
709  void TrimLeft(uint32_t uLen = std::numeric_limits<uint32_t>::max());
710 
714  void TrimRight(uint32_t uLen = std::numeric_limits<uint32_t>::max());
715 
727  const char *AsUTF8(uint32_t *pElementsCount = nullptr) const;
728 
738  std::unique_ptr<char[]> ToUTF8(uint32_t *pElementsCount = nullptr) const;
739 
745  std::unique_ptr<char16_t[]> ToUTF16(uint32_t *pElementsCount = nullptr) const;
746 
752  std::unique_ptr<char32_t[]> ToUTF32(uint32_t *pElementsCount = nullptr) const;
753 
761  std::unique_ptr<wchar_t[]> ToWideChars(uint32_t *pElementsCount = nullptr) const;
762 
766  const std::string &ToStdString() const;
767 
773  std::wstring ToStdWString() const;
774 
778  U_NAMESPACE_QUALIFIER UnicodeString ToUnicodeString() const;
779 
780 #if defined(__OBJC__) || defined(DOXY)
781 
788  NSString *ToNSString() const;
789 
795  CFStringRef ToCFStringRef() const;
796 #endif
797 
808  template<class T>
809  T To(bool *pbError = nullptr) const;
810 
816  template<class T>
817  T ToValue(bool *pbError = nullptr) const;
818 
824  float ToFloat(bool *pbError = nullptr) const;
825 
831  double ToDouble(bool *pbError = nullptr) const;
832 
860  bool ToBool(bool *pbError = nullptr) const;
861 
862 private:
863  std::string m_string;
864  mutable uint32_t m_uLength; // 0 indicates that the length (in characters) is unknown
865 };
866 
867 
868 std::ostream &operator<<(std::ostream &stream, const CYIString &val);
869 std::istream &operator>>(std::istream &stream, CYIString &val);
870 
871 CYIString operator+(const CYIString &lhs, const CYIString &rhs);
872 
873 
876 #include "utility/YiString.inl"
877 
878 #endif
CYIString Right(uint32_t uLen) const
bool EndsWith(const CYIString &s, CASE_MODE eCaseSensitivity=CASE_SENSITIVE) const
ConstIterator & operator=(const ConstIterator &other)
std::ostream & operator<<(std::ostream &stream, const CYIString &val)
float ToFloat(bool *pbError=nullptr) const
ConstIterator Iterator
Definition: YiString.h:101
CYIString & Prepend(const CYIString &s)
char32_t reference
Definition: YiString.h:65
const char * AsUTF8(uint32_t *pElementsCount=nullptr) const
double ToDouble(bool *pbError=nullptr) const
bool IsNumeric() const
std::unique_ptr< char[]> ToUTF8(uint32_t *pElementsCount=nullptr) const
static CYIString FromDouble(double fValue, uint32_t uDecimalPlaces=6, bool bTrailingZeroes=false, bool bUseSignificantDigits=false)
Container class for Unicode strings. Conceptually, a CYIString object is a sequence of Unicode charac...
Definition: YiString.h:35
bool operator==(const ConstIterator &other) const
CFStringRef ToCFStringRef() const
ptrdiff_t difference_type
Definition: YiString.h:63
CYIString Arg(const CYIString &rText) const
const std::string & ToStdString() const
char32_t At(uint32_t uPos) const
uint32_t GetLength() const
CYIString operator+(T arg) const
int32_t Compare(const CYIString &s, CASE_MODE eCaseSensitivity=CASE_SENSITIVE) const
void TrimLeft(uint32_t uLen=std::numeric_limits< uint32_t >::max())
friend std::istream & operator>>(std::istream &stream, CYIString &val)
static const CYIString & EmptyString()
const char32_t * pointer
Definition: YiString.h:64
T ToValue(bool *pbError=nullptr) const
std::bidirectional_iterator_tag iterator_category
Definition: YiString.h:61
CYIString SubStr(uint32_t uPos=0, uint32_t uLen=std::numeric_limits< uint32_t >::max()) const
bool ToBool(bool *pbError=nullptr) const
void Clear()
ConstReverseIterator rbegin() const
std::reverse_iterator< Iterator > ReverseIterator
Definition: YiString.h:102
bool IsEmpty() const
std::unique_ptr< char32_t[]> ToUTF32(uint32_t *pElementsCount=nullptr) const
bool StartsWith(const CYIString &s, CASE_MODE eCaseSensitivity=CASE_SENSITIVE) const
bool operator!=(const ConstIterator &other) const
ConstIterator begin() const
CYIString & Insert(const CYIString &s, uint32_t uPos, uint32_t uLen=std::numeric_limits< uint32_t >::max())
std::unique_ptr< char16_t[]> ToUTF16(uint32_t *pElementsCount=nullptr) const
uint32_t GetSizeInBytes() const
Definition: YiString.h:56
CASE_MODE
Definition: YiString.h:107
std::reverse_iterator< ConstIterator > ConstReverseIterator
Definition: YiString.h:48
const char * GetData() const
bool operator>=(const CYIString &s1) const
ConstIterator Find(const CYIString &s, const ConstIterator &begin) const
CYIString ToLower() const
ConstIterator & operator++()
friend class CYIString
Definition: YiString.h:59
std::vector< CYIString > Split(const CYIString &delimiter, bool bIgnoreEmptySubstrings=true, uint32_t uMaximumParts=std::numeric_limits< uint32_t >::max()) const
int32_t IndexOf(const CYIString &s, uint32_t uPos=0) const
ConstIterator & operator--()
value_type operator*() const
ConstIterator end() const
static const CYIString & FromBool(bool bValue)
bool operator>(const CYIString &s1) const
static CYIString FromFloat(float fValue, uint32_t uDecimalPlaces=6, bool bTrailingZeroes=false, bool bUseSignificantDigits=false)
CYIString & Replace(const CYIString &s, uint32_t uPos, uint32_t uLen)
CYIString ToNormalizedText(bool *pbError=nullptr) const
CYIString ToUpper() const
std::unique_ptr< wchar_t[]> ToWideChars(uint32_t *pElementsCount=nullptr) const
void Swap(CYIString &s)
void TrimRight(uint32_t uLen=std::numeric_limits< uint32_t >::max())
bool operator<(const CYIString &s1) const
Definition: YiString.h:116
char32_t operator[](int32_t nPos) const
CYIString & Append(const CYIString &s)
NSString * ToNSString() const
CYIString Left(uint32_t uLen) const
static CYIString FromValue(const T &arg, bool *pbError=nullptr)
char ByteAt(uint32_t uByteOffset) const
bool ContainsNonASCII() const
Definition: YiString.h:112
void Remove(const CYIString &text)
U_NAMESPACE_QUALIFIER UnicodeString ToUnicodeString() const
int32_t LastIndexOf(const CYIString &s, uint32_t uPos=std::numeric_limits< uint32_t >::max()) const
bool operator<=(const CYIString &s1) const
CYIString & operator+=(const CYIString &s)
char32_t value_type
Definition: YiString.h:62
CYIString & Erase(uint32_t uPos=0, uint32_t uLen=std::numeric_limits< uint32_t >::max())
std::wstring ToStdWString() const
void Trim()
bool IsNotEmpty() const
ConstReverseIterator rend() const
bool Contains(const CYIString &s, CASE_MODE eCaseSensitivity=CASE_SENSITIVE) const
T To(bool *pbError=nullptr) const
ConstReverseIterator Reverse() const
static const CYIString EMPTY_STRING
Definition: YiString.h:37
ConstReverseIterator ReverseFind(const CYIString &s, const ConstReverseIterator &begin) const