libcrn  3.9.5
A document image processing library
•All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CRNString.h
Go to the documentation of this file.
1 /* Copyright 2008-2016 INSA Lyon, CoReNum, Université Paris Descartes, ENS-Lyon
2  *
3  * This file is part of libcrn.
4  *
5  * libcrn is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public License as published by
7  * the Free Software Foundation, either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * libcrn is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public License
16  * along with libcrn. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * file: CRNString.h
19  * \author Yann LEYDIER
20  */
21 
22 #ifndef CRNSTRING_Header
23 #define CRNSTRING_Header
24 
25 #include <CRNObject.h>
26 #include <string>
27 #include <vector>
28 #include <sstream>
29 #include <complex>
30 #include <iomanip>
31 #include <stdlib.h>
32 
33 #include <string.h> // MT : because new error with strlen - gcc 6.2.0 - Ubuntu 16.10
34 
37 namespace crn
38 {
39  class StringUTF8;
40  class Prop3;
41 
45  inline wint_t ToWUpper(wint_t c) { return towupper(c); }
47  inline wint_t ToWLower(wint_t c) { return towlower(c); }
50  /****************************************************************************/
61  class String: public Object
62  {
63  public:
64  /**********************************************************************/
65  /* Constructors */
66  /**********************************************************************/
68  String() = default;
69  virtual ~String() override = default;
71  String(const std::u32string &s):data(s) {}
73  String(std::u32string &&s) noexcept:data(std::move(s)) {}
75  String(char32_t *s) {if (s) data = s; else data = U""; }
77  String(const char32_t *s) {if (s) data = s; else data = U""; }
79  String(const String &s):data(s.data) {}
81  String(char32_t c, size_t n = 1);
83  String(const StringUTF8 &s);
85  String(const Prop3 &p);
87  String(char *s);
89  String(const char *s);
91  String(const std::string &s);
93  String(char c, size_t n = 1);
95  String(int i) { convertFrom(i); }
97  String(unsigned int i) { convertFrom(i); }
99  String(long i) { convertFrom(i); }
101  String(unsigned long i) { convertFrom(i); }
103  String(float f) { convertFrom(f); }
105  String(double d) { convertFrom(double(d)); }
107  String(long double d) { convertFrom(d); }
109  String(long long i) { convertFrom(i); }
111  String(unsigned long long i) { convertFrom(i); }
113  template<typename T> String(const std::complex<T> &c) { *this = String(U"(") + c.real() + String(U", ") + c.imag() + String(U")"); }
114 
115  String(String&&) = default;
116  String& operator=(String&&) = default;
117 
118  /**********************************************************************/
119  /* Typecast methods */
120  /**********************************************************************/
122  std::u32string& Std() & noexcept { return data; }
124  const std::u32string& Std() const & noexcept { return data; }
126  std::u32string Std() && { return std::move(data); }
128  const char32_t* CWStr() const noexcept { return data.c_str(); }
130  const char* CStr() const;
132  Prop3 ToProp3() const;
134  int ToInt() const { return convertTo<int>(); }
136  unsigned int ToUInt() const { return convertTo<unsigned int>(); }
138  long ToLong() const { return convertTo<long>(); }
140  unsigned long ToULong() const { return convertTo<unsigned long>(); }
142  float ToFloat() const { return convertTo<float>(); }
144  double ToDouble() const { return convertTo<double>(); }
146  long double ToLongDouble() const { return convertTo<long double>(); }
148 long long ToLongLong() const { return convertTo<long long>(); }
150  unsigned long long ToULongLong() const { return convertTo<unsigned long long>(); }
152  int64_t ToInt64() const { return convertTo<int64_t>(); }
154  uint64_t ToUInt64() const { return convertTo<uint64_t>(); }
155 
156  /**********************************************************************/
157  /* String manipulation */
158  /**********************************************************************/
160  size_t Size() const noexcept { return data.length(); }
162  size_t Length() const noexcept { return data.length(); }
164  bool operator!() const noexcept { return data.empty(); }
166  bool IsEmpty() const noexcept { return data.empty(); }
168  bool IsNotEmpty() const noexcept { return !data.empty(); }
169 
171  char32_t& operator[](size_t index);
173  const char32_t& operator[](size_t index) const;
174 
176  String& operator=(const String &s) { data = s.data; return *this; }
177 
179  String& operator+=(const String &s) { data += s.data; return *this; }
180 
182  String& Insert(size_t pos, const String &s);
183 
185  String& Crop(size_t pos, size_t n = 0);
187  String& Erase(size_t pos, size_t n = 0);
188 
190  String& Replace(const String &s, size_t pos, size_t n = 0);
191 
193  String& ReplaceSuffix(const String &old_suffix, const String &new_suffix);
195  String& ReplaceSuffix(const size_t n, const String &new_suffix);
197  String& DeleteSuffix(const String &suffix);
199  std::vector<String> WhichSuffixes(const std::vector<String> &suffixes) const;
201  std::vector<String> WhichPrefixes(const std::vector<String> &prefixes) const;
203  std::vector<String> WhichSubstrings(const std::vector<String> &substrings) const;
204 
206  String& Replace(char32_t from, char32_t to);
207 
209  String& ToUpper();
212 
214  String& ToLower();
215 
217  String SubString(size_t pos, size_t n = 0) const;
218 
220  size_t Find(const String &s, size_t from_pos = 0) const;
222  size_t FindAnyOf(const String &s, size_t from_pos = 0) const;
224  size_t FindNotOf(const String &s, size_t from_pos = 0) const;
225 
227  size_t BackwardFind(const String &s, size_t last_pos = NPos()) const;
229  size_t BackwardFindAnyOf(const String &s, size_t from_pos = NPos()) const;
231  size_t BackwardFindNotOf(const String &s, size_t from_pos = NPos()) const;
232 
234  bool StartsWith(const String &s) const;
235 
237  bool EndsWith(const String &s) const;
239  bool EndsWith(const std::vector<String> &suffixes) const;
240 
242  std::vector<String> Split(const String &sep) const;
243 
245  int EditDistance(const String &s) const;
246 
248  static int& Precision() noexcept;
249 
251  void ShrinkToFit();
252 
254  void Swap(String &str) noexcept { data.swap(str.data); }
255 
257  static size_t NPos() noexcept;
258 
260  static String CreateUniqueId(size_t len = 8);
261 
263  void Deserialize(xml::Element &el);
265  xml::Element Serialize(xml::Element &parent) const;
266 
267  private:
269  template<typename T> T convertTo() const { std::stringstream ss(CStr()); T val; ss >> val; return val; }
271  template<typename T> void convertFrom(T val) { std::stringstream ss; ss << std::setprecision(Precision()) << val; *this = ss.str(); }
272 
273  std::u32string data;
274  mutable std::string cdata;
278  };
279  template<> struct IsClonable<String> : public std::true_type {};
280  template<> struct IsSerializable<String> : public std::true_type {};
281  template<> struct IsMetric<String> : public std::true_type {};
282 
283  /* \addtogroup string */
287  inline bool operator==(const String &s1, const String &s2) { return s1.Std() == s2.Std(); }
289  inline bool operator!=(const String &s1, const String &s2) { return s1.Std() != s2.Std(); }
291  inline bool operator<(const String &s1, const String &s2) { return s1.Std() < s2.Std(); }
293  inline bool operator>(const String &s1, const String &s2) { return s1.Std() > s2.Std(); }
295  inline bool operator<=(const String &s1, const String &s2) { return s1.Std() <= s2.Std(); }
297  inline bool operator>=(const String &s1, const String &s2) { return s1.Std() >= s2.Std(); }
299  inline String operator+(const String &s1, const String &s2) { return String(s1.Std() + s2.Std()); }
300 
302  inline double Distance(const String &s1, const String &s2) { return s1.EditDistance(s2); }
303 
305  inline void Swap(String &s1, String &s2) noexcept { s1.Swap(s2); }
306 
308  inline size_t Size(const String &s) noexcept { return s.Size(); }
309 
310  namespace literals
311  {
313  inline String operator"" _s(const char32_t *str, size_t len)
314  {
315  return String{std::u32string{str, len}};
316  }
317  }
319 }
320 
321 #include <CRNStringPtr.h>
322 
323 namespace std
324 {
326  inline void swap(crn::String &s1, crn::String &s2) noexcept { s1.Swap(s2); }
327 
328  template<> struct hash<crn::String>
329  {
330  inline size_t operator()(const crn::String&s) const { return hash<u32string>{}(s.Std()); }
331  };
332 }
333 
334 #include <ostream>
336 template<typename traits> inline std::basic_ostream<char, traits>& operator<<(std::basic_ostream<char, traits> &strm, const crn::String &s)
337 {
338  strm << s.CStr();
339  return strm;
340 }
341 
342 #endif
wint_t ToWLower(wint_t c)
Transforms a character to its lower case.
Definition: CRNString.h:47
String(long i)
Constructor from an long.
Definition: CRNString.h:99
int64_t ToInt64() const
Conversion to int64_t.
Definition: CRNString.h:152
String(int i)
Constructor from an int.
Definition: CRNString.h:95
String(const char32_t *s)
Constructor from a wide cstring.
Definition: CRNString.h:77
#define CRN_SERIALIZATION_CONSTRUCTOR(classname)
Defines a default constructor from xml element.
Definition: CRNObject.h:165
size_t BackwardFind(const String &s, size_t last_pos=NPos()) const
Finds the last occurrence of a string.
Definition: CRNString.cpp:651
bool operator>(const String &s1, const String &s2)
Compares two strings.
Definition: CRNString.h:293
wint_t ToWUpper(wint_t c)
Transforms a character to its upper case.
Definition: CRNString.h:45
std::vector< String > Split(const String &sep) const
Splits the string in multiple strings delimited by a set of separators.
Definition: CRNString.cpp:772
size_t Size() const noexcept
Returns the length of the string.
Definition: CRNString.h:160
String(long long i)
Constructor from an long.
Definition: CRNString.h:109
float ToFloat() const
Conversion to float.
Definition: CRNString.h:142
bool operator>=(const String &s1, const String &s2)
Compares two strings.
Definition: CRNString.h:297
bool operator<=(const String &s1, const String &s2)
Compares two strings.
Definition: CRNString.h:295
bool StartsWith(const String &s) const
Check if string has a given prefix.
Definition: CRNString.cpp:533
unsigned int ToUInt() const
Conversion to unsigned int.
Definition: CRNString.h:136
const char * CStr() const
Conversion to UTF8 cstring.
Definition: CRNString.cpp:167
std::u32string Std()&&
Conversion to std u32string.
Definition: CRNString.h:126
String(unsigned long long i)
Constructor from an unsigned long.
Definition: CRNString.h:111
double ToDouble() const
Conversion to double.
Definition: CRNString.h:144
size_t BackwardFindNotOf(const String &s, size_t from_pos=NPos()) const
Finds the last occurrence of character not in a list.
Definition: CRNString.cpp:695
bool IsEmpty() const noexcept
Checks if the string is empty.
Definition: CRNString.h:166
size_t Find(const String &s, size_t from_pos=0) const
Finds the first occurrence of a string.
Definition: CRNString.cpp:509
String()=default
Default constructor (empty string)
const std::u32string & Std() const &noexcept
Conversion to std u32string.
Definition: CRNString.h:124
String(unsigned int i)
Constructor from an unsigned int.
Definition: CRNString.h:97
A UTF32 character string class.
Definition: CRNString.h:61
long double ToLongDouble() const
Conversion to long double.
Definition: CRNString.h:146
void Deserialize(xml::Element &el)
Initializes the object from an XML element. Unsafe.
Definition: CRNString.cpp:738
static int & Precision() noexcept
Precision of the floating point conversion.
Definition: CRNString.cpp:38
String(const String &s)
Copy constructor.
Definition: CRNString.h:79
String & operator=(String &&)=default
void ShrinkToFit()
Optimizes the memory usage.
Definition: CRNString.cpp:788
void Swap(String &str) noexcept
Swaps two strings.
Definition: CRNString.h:254
String & ReplaceSuffix(const String &old_suffix, const String &new_suffix)
Replaces suffix by another pattern if present.
Definition: CRNString.cpp:304
virtual ~String() override=default
String SubString(size_t pos, size_t n=0) const
Extracts a part of the string.
Definition: CRNString.cpp:220
char32_t & operator[](size_t index)
Access to a character.
Definition: CRNString.cpp:137
std::vector< String > WhichSuffixes(const std::vector< String > &suffixes) const
Returns suffixes found within a collection.
Definition: CRNString.cpp:380
String(float f)
Constructor from a float.
Definition: CRNString.h:103
String(const std::complex< T > &c)
Constructor from a complex.
Definition: CRNString.h:113
String & FirstCharacterToUpper()
Converts the first character of string to uppercase.
Definition: CRNString.cpp:481
BoolNotBoolDummy operator+(const BoolNotBoolDummy &, const BoolNotBoolDummy &)
Definition: CRNImage.h:123
static String CreateUniqueId(size_t len=8)
Generates an almost unique id.
Definition: CRNString.cpp:799
bool operator!=(const String &s1, const String &s2)
Tests inequality of two strings.
Definition: CRNString.h:289
String & operator=(const String &s)
Copies from another string.
Definition: CRNString.h:176
size_t Length() const noexcept
Returns the length of the string.
Definition: CRNString.h:162
size_t operator()(const crn::String &s) const
Definition: CRNString.h:330
int ToInt() const
Conversion to int.
Definition: CRNString.h:134
Prop3 ToProp3() const
Conversion to Prop3.
Definition: CRNString.cpp:176
String(const std::u32string &s)
Constructor from a std wide string.
Definition: CRNString.h:71
double Distance(const Int &i1, const Int &i2) noexcept
Definition: CRNInt.h:78
String(unsigned long i)
Constructor from an unsigned long.
Definition: CRNString.h:101
unsigned long long ToULongLong() const
Conversion to unsigned long long.
Definition: CRNString.h:150
size_t BackwardFindAnyOf(const String &s, size_t from_pos=NPos()) const
Finds the last occurrence of character in a list.
Definition: CRNString.cpp:674
String(char32_t *s)
Constructor from a wide cstring.
Definition: CRNString.h:75
String(long double d)
Constructor from a long double.
Definition: CRNString.h:107
bool operator!() const noexcept
Checks if the string is empty.
Definition: CRNString.h:164
std::vector< String > WhichPrefixes(const std::vector< String > &prefixes) const
Returns prefixes found within a collection.
Definition: CRNString.cpp:405
long long ToLongLong() const
Conversion to long long.
Definition: CRNString.h:148
size_t FindAnyOf(const String &s, size_t from_pos=0) const
Finds the first occurrence of character in a list.
Definition: CRNString.cpp:611
String & ToLower()
Converts the string to lowercase.
Definition: CRNString.cpp:493
bool EndsWith(const String &s) const
Check if string has a given suffix.
Definition: CRNString.cpp:562
String(std::u32string &&s) noexcept
Constructor from a std wide string.
Definition: CRNString.h:73
std::vector< String > WhichSubstrings(const std::vector< String > &substrings) const
Returns substring found within a collection.
Definition: CRNString.cpp:430
xml::Element Serialize(xml::Element &parent) const
Dumps the object to an XML element. Unsafe.
Definition: CRNString.cpp:759
const char32_t * CWStr() const noexcept
Conversion to wide cstring.
Definition: CRNString.h:128
String & Replace(const String &s, size_t pos, size_t n=0)
Replaces a part of the string.
Definition: CRNString.cpp:286
long ToLong() const
Conversion to long.
Definition: CRNString.h:138
#define CRN_DECLARE_CLASS_CONSTRUCTOR(classname)
Declares a class constructor.
Definition: CRNObject.h:173
String & operator+=(const String &s)
Appends a string.
Definition: CRNString.h:179
A character string class.
Definition: CRNStringUTF8.h:49
bool operator==(const String &s1, const String &s2)
Tests equality of two strings.
Definition: CRNString.h:287
unsigned long ToULong() const
Conversion to unsigned long.
Definition: CRNString.h:140
A ternary proposition.
Definition: CRNProp3.h:40
int EditDistance(const String &s) const
Edit distance.
Definition: CRNString.cpp:714
String & Erase(size_t pos, size_t n=0)
Erases a part of the string.
Definition: CRNString.cpp:262
uint64_t ToUInt64() const
Conversion to uint64_t.
Definition: CRNString.h:154
bool operator<(const String &s1, const String &s2)
Compares two strings.
Definition: CRNString.h:291
String & ToUpper()
Converts the string to uppercase.
Definition: CRNString.cpp:469
bool IsNotEmpty() const noexcept
Checks if the string is not empty.
Definition: CRNString.h:168
std::u32string & Std()&noexcept
Conversion to std u32string.
Definition: CRNString.h:122
String & Insert(size_t pos, const String &s)
Inserts a string.
Definition: CRNString.cpp:195
static size_t NPos() noexcept
Last position in a string.
Definition: CRNString.cpp:47
String & DeleteSuffix(const String &suffix)
Delete suffix if found.
Definition: CRNString.cpp:354
size_t FindNotOf(const String &s, size_t from_pos=0) const
Finds the first occurrence of character not in a list.
Definition: CRNString.cpp:631
String & Crop(size_t pos, size_t n=0)
Crops the string.
Definition: CRNString.cpp:247
String(double d)
Constructor from a double.
Definition: CRNString.h:105