00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef COMMON_WSTRING_H
00021 #define COMMON_WSTRING_H
00022
00029 #include <common/wstr.h>
00030
00031 class nstring;
00032
00041 class wstring
00042 {
00043 public:
00049 ~wstring();
00050
00054 wstring() :
00055 ref(get_empty_ref())
00056 {
00057 }
00058
00062 explicit
00063 wstring(const char *arg) :
00064 ref(arg ? wstr_from_c(arg) : get_empty_ref())
00065 {
00066 }
00067
00071 explicit
00072 wstring(const wchar_t *arg) :
00073 ref(arg ? wstr_from_wc(arg) : get_empty_ref())
00074 {
00075 }
00076
00080 wstring(const char *data, size_t len) :
00081 ref(wstr_n_from_c(data, len))
00082 {
00083 }
00084
00088 wstring(const wchar_t *data, size_t len) :
00089 ref(wstr_n_from_wc(data, len))
00090 {
00091 }
00092
00096 wstring(wstring_ty *arg) :
00097 ref(arg ? wstr_copy(arg) : get_empty_ref())
00098 {
00099 }
00100
00106 wstring(string_ty *arg);
00107
00111 wstring(const nstring &arg);
00112
00116 wstring(const wstring &arg) :
00117 ref(wstr_copy(arg.ref))
00118 {
00119 }
00120
00124 wstring &
00125 operator=(const wstring &arg)
00126 {
00127 if (this != &arg)
00128 {
00129 wstr_free(ref);
00130 ref = wstr_copy(arg.ref);
00131 }
00132 return *this;
00133 }
00134
00139 void clear();
00140
00145 const wchar_t *
00146 c_str()
00147 const
00148 {
00149 return ref->wstr_text;
00150 }
00151
00156 nstring to_nstring() const;
00157
00158 bool
00159 empty()
00160 const
00161 {
00162 return (ref->wstr_length == 0);
00163 }
00164
00165 size_t
00166 size()
00167 const
00168 {
00169 return ref->wstr_length;
00170 }
00171
00172 size_t
00173 length()
00174 const
00175 {
00176 return ref->wstr_length;
00177 }
00178
00194 wstring
00195 catenate(const wstring &arg)
00196 const
00197 {
00198 return wstring(wstr_catenate(ref, arg.ref));
00199 }
00200
00201 wstring
00202 operator+(const wstring &arg)
00203 const
00204 {
00205 return wstring(wstr_catenate(ref, arg.ref));
00206 }
00207
00208 wstring &
00209 operator+=(const wstring &arg)
00210 {
00211 if (!arg.empty())
00212 {
00213 wstring_ty *s = wstr_catenate(ref, arg.ref);
00214 wstr_free(ref);
00215 ref = s;
00216 }
00217 return *this;
00218 }
00219
00237 wstring
00238 cat_three(const wstring &str2, const wstring &str3)
00239 const
00240 {
00241 return wstring(wstr_cat_three(ref, str2.ref, str3.ref));
00242 }
00243
00257 wstring
00258 upcase()
00259 const
00260 {
00261 return wstring(wstr_to_upper(ref));
00262 }
00263
00277 wstring
00278 downcase()
00279 const
00280 {
00281 return wstring(wstr_to_lower(ref));
00282 }
00283
00296 wstring
00297 capitalize()
00298 const
00299 {
00300 return wstring(wstr_capitalize(ref));
00301 }
00302
00321 bool
00322 equal(const wstring &arg)
00323 const
00324 {
00325 return (ref == arg.ref);
00326 }
00327
00328 bool
00329 operator==(const wstring &arg)
00330 const
00331 {
00332 return (ref == arg.ref);
00333 }
00334
00335 bool
00336 operator!=(const wstring &arg)
00337 const
00338 {
00339 return (ref != arg.ref);
00340 }
00341
00350 wstring_ty *
00351 get_ref()
00352 const
00353 {
00354 return ref;
00355 }
00356
00362 wstring
00363 identifier()
00364 const
00365 {
00366 return wstr_to_ident(get_ref());
00367 }
00368
00380 char
00381 operator[](size_t n)
00382 const
00383 {
00384 return (n < size() ? ref->wstr_text[n] : L'\0');
00385 }
00386
00393 int
00394 column_width()
00395 const
00396 {
00397 return wstr_column_width(ref);
00398 }
00399
00400 private:
00406 wstring_ty *ref;
00407
00412 static wstring_ty *
00413 get_empty_ref()
00414 {
00415 return wstr_from_c("");
00416 }
00417 };
00418
00419 inline wstring
00420 operator+(const char *lhs, const wstring &rhs)
00421 {
00422 return wstring(lhs).catenate(rhs);
00423 }
00424
00425 inline wstring
00426 operator+(const wstring &lhs, const char *rhs)
00427 {
00428 return lhs.catenate(wstring(rhs));
00429 }
00430
00433 #endif // COMMON_WSTRING_H