/*ident "@(#) @(#)wstr_imp.h 1.1.1.2" */ /****************************************************************************** * * C++ Standard Library * * Copyright (c) 1996 Lucent Technologies. All Rights Reserved. * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Lucent Technologies. * The copyright notice above does not evidence any actual or * intended publication of such source code. * ******************************************************************************/ #ifndef STDWSTRINGH #define STDWSTRINGH #include "compiler_type.h" #include #if !defined(COMPILER_IS_PC_LUCENT) #include #endif #include #include #include #if defined(CFRONT_COMPATIBLE_LUCENT) //typedef wchar_t *iterator; //typedef wchar_t *reverse_iterator; //typedef const wchar_t *const_iterator; //typedef const wchar_t *const_reverse_iterator; //typedef int bool; #else #include #include #endif class ostream; class istream; #ifdef NAMESPACES_LUCENT namespace std { #endif class Pool_std; inline void assign_wchar_t(wchar_t& c1, const wchar_t &c2) { c1 = c2; } inline bool eq_wchar_t(const wchar_t &c1, const wchar_t &c2) { return (c1 == c2); } inline bool ne_wchar_t(const wchar_t &c1, const wchar_t &c2) { return !(c1 == c2); } inline bool lt_wchar_t(const wchar_t &c1, const wchar_t &c2) { return (c1 < c2); } inline wchar_t eos_wchar_t() { return (wchar_t)0; } extern int compare_wchar_t(const wchar_t *s1, const wchar_t *s2, size_t n); extern size_t length_wchar_t(const wchar_t *s); extern istream &char_in_wchar_t(istream &is, wchar_t &a); extern ostream &char_out_wchar_t(ostream &os, wchar_t a); inline bool is_del_wchar_t(wchar_t a) { int first, second; first = a & 0177400; second = a & 0377; return (first == 0 && isspace(second)); } inline wchar_t *copy_wchar_t(wchar_t *s1, const wchar_t *s2, size_t n) { return ((wchar_t *)memcpy(s1, s2, n*sizeof(wchar_t))); } inline wchar_t *move_wchar_t(wchar_t *s1, const wchar_t *s2, int n) { return ((wchar_t *)memcpy(s1, s2, n*sizeof(wchar_t))); } struct string_wchar_traits_LUCENT { typedef wchar_t char_type; typedef istream istream_type; typedef ostream ostream_type; static void assign(wchar_t& c1, const wchar_t &c2) { c1 = c2; } static bool eq(const wchar_t &c1, const wchar_t &c2) { return (c1 == c2); } static bool ne(const wchar_t &c1, const wchar_t &c2) { return (c1 != c2); } static bool lt(const wchar_t &c1, const wchar_t &c2) { return (c1 < c2); } static wchar_t eos() { return (wchar_t)0; } static istream &char_in(istream &is, wchar_t &a) { return (char_in_wchar_t(is, a)); } static ostream &char_out(ostream &os, wchar_t a) { return (char_out_wchar_t(os, a)); } static bool is_del(wchar_t a) { return (is_del_wchar_t(a)); } static int compare(const wchar_t *s1, const wchar_t *s2, size_t n) { return (compare_wchar_t(s1, s2, n)); } static size_t length(const wchar_t *s) { return (length_wchar_t(s)); } static wchar_t *copy(wchar_t *s1, const wchar_t *s2, size_t n) { return (copy_wchar_t(s1, s2, n)); } static wchar_t *move(wchar_t *s1, const wchar_t *s2, int n) { return (move_wchar_t(s1, s2, n)); } }; class wstring { // the string public: class Srep_LUCENT { // String Representation public: enum { MAXS = 8, MAXL = 64 }; static Srep_LUCENT* nullrep_; // nullrep always has refc == 0 and max_size == 0 static Pool_std* Reelp; // Pool for "reel" small strings static Pool_std* SPoolp; // Pool for smallish strings static void initialize() { if (Reelp == 0) doinitialize(); } static void doinitialize(); static Srep_LUCENT* nullrep() { initialize(); return nullrep_; } static Srep_LUCENT *new_srep(size_t); static Srep_LUCENT *get_long(size_t); size_t len; size_t max_size; size_t refc; wchar_t str[MAXS]; Srep_LUCENT() { len = 0; max_size = 0; refc = 0; } void rcdec() { if(refc && --refc==0) delete_srep(); } void rcinc() { if(refc) refc++; } void delete_srep(); }; public: typedef string_wchar_traits_LUCENT traits_type; typedef string_wchar_traits_LUCENT::char_type value_type; typedef size_t size_type; typedef ptrdiff_t difference_type; typedef wchar_t &reference; typedef const wchar_t &const_reference; typedef wchar_t *pointer; typedef const wchar_t *const_pointer; typedef wchar_t *iterator; typedef const wchar_t *const_iterator; #if !defined(CFRONT_COMPATIBLE_LUCENT) typedef reverse_iterator const_reverse_iterator; typedef reverse_iterator reverse_iterator; #else typedef const wchar_t *const_reverse_iterator; typedef wchar_t *reverse_iterator; #endif static const size_t npos; /* constructors and destructor */ wstring() { d = Srep_LUCENT::nullrep(); } wstring(const wstring& s, size_t = 0, size_t = npos); wstring(const wchar_t*, size_t); wstring(const wchar_t*); wstring(size_t, wchar_t); ~wstring() { d->rcdec(); } /* assignment */ inline wstring& operator=(const wstring&); wstring& operator=(const wchar_t*); inline wstring& operator=(wchar_t); /* iterators */ iterator begin(); const_iterator begin() const; iterator end(); const_iterator end() const; reverse_iterator rbegin(); const_reverse_iterator rbegin() const; reverse_iterator rend(); const_reverse_iterator rend() const; size_t length() const { return d->len; } size_t size() const { return d->len; } size_t max_size() const { return d->max_size; } void resize(size_t, wchar_t = eos_wchar_t()); size_t capacity() const { return d->max_size; } void reserve(size_t n) { if (n >= d->max_size) reserve_grow(n); } bool empty() const { return d->len ? 0 : 1; } inline wchar_t operator[](size_t) const; reference operator[](size_t); inline const_reference at(size_t) const; reference at(size_t); /* concatenation */ wstring& operator+=(const wstring&); wstring& operator+=(const wchar_t*); inline wstring& operator+=(wchar_t); wstring& append(const wstring &, size_t pos = 0, size_t n = npos); wstring& append(const wchar_t*, size_t len); wstring& append(const wchar_t*); wstring& append(size_t, wchar_t = eos_wchar_t()); wstring& assign(const wstring &, size_t pos = 0, size_t n = npos); wstring& assign(const wchar_t *, size_t); wstring& assign(const wchar_t *); wstring& assign(size_t, wchar_t = eos_wchar_t()); wstring& insert(size_t, const wstring &, size_t = 0, size_t = npos); wstring& insert(size_t, const wchar_t *, size_t); wstring& insert(size_t, const wchar_t *); wstring& insert(size_t, size_t, wchar_t = eos_wchar_t()); iterator insert(iterator, wchar_t = eos_wchar_t()); iterator insert(iterator, size_t, wchar_t = eos_wchar_t()); wstring& remove(size_t pos = 0, size_t n = npos); wstring& remove(iterator); wstring& remove(iterator, iterator); wstring& replace(size_t, size_t, const wstring &, size_t = 0, size_t = npos); wstring& replace(size_t, size_t, const wchar_t *, size_t); wstring& replace(size_t, size_t, const wchar_t *); wstring& replace(size_t, size_t, wchar_t); wstring& replace(iterator, iterator, const wstring &); wstring& replace(iterator, iterator, const wchar_t *, size_t); wstring& replace(iterator, iterator, const wchar_t *); wstring& replace(iterator, iterator, wchar_t); size_t copy(wchar_t *, size_t, size_t = 0); void swap(wstring &); inline const wchar_t *c_str() const; inline const wchar_t *data() const; /* find functions */ size_t find(const wstring &, size_t = 0) const; size_t find(const wchar_t *, size_t, size_t) const; size_t find(const wchar_t *, size_t = 0) const; size_t find(wchar_t, size_t = 0) const; size_t rfind(const wstring &, size_t = npos) const; size_t rfind(const wchar_t *, size_t, size_t) const; size_t rfind(const wchar_t *, size_t = npos) const; size_t rfind(wchar_t, size_t = npos) const; size_t find_first_of(const wstring &, size_t = 0) const; size_t find_first_of(const wchar_t *, size_t, size_t) const; size_t find_first_of(const wchar_t *, size_t = 0) const; size_t find_first_of(wchar_t, size_t = 0) const; size_t find_last_of(const wstring &, size_t = npos) const; size_t find_last_of(const wchar_t *, size_t, size_t) const; size_t find_last_of(const wchar_t *, size_t = npos) const; size_t find_last_of(wchar_t, size_t = npos) const; size_t find_first_not_of(const wstring &, size_t = 0) const; size_t find_first_not_of(const wchar_t *, size_t, size_t) const; size_t find_first_not_of(const wchar_t *, size_t = 0) const; size_t find_first_not_of(wchar_t, size_t = 0) const; size_t find_last_not_of(const wstring &, size_t = npos) const; size_t find_last_not_of(const wchar_t *, size_t, size_t) const; size_t find_last_not_of(const wchar_t *, size_t = npos) const; size_t find_last_not_of(wchar_t, size_t = npos) const; wstring substr(size_t = 0, size_t = npos) const; int compare(const wstring &, size_t = 0, size_t = npos) const; int compare(const wchar_t *, size_t, size_t) const; int compare(const wchar_t *, size_t = 0) const; private: Srep_LUCENT *d; wstring(Srep_LUCENT* r) { d = r; } wstring& newcopy(wchar_t); void reserve_grow(int); inline void uniq(); public: /* ADDITION */ friend wstring operator+(const wstring&, const wstring&); friend wstring operator+(const wstring&, const wchar_t*); friend wstring operator+(const wstring&, wchar_t); friend wstring operator+(const wchar_t*, const wstring&); friend wstring operator+(wchar_t, const wstring&); //int nrefs() const { return d->refc; } //const Srep_LUCENT *rep() const { return d; } /* COMPARISON OPERATORS */ friend inline bool operator==(const wstring&, const wstring&); friend inline bool operator==(const wstring&, const wchar_t*); friend inline bool operator!=(const wstring&, const wstring&); friend inline bool operator!=(const wstring&, const wchar_t*); /* INPUT/OUTPUT */ friend /*inline*/ ostream& operator<<(ostream&, const wstring&); friend istream& operator>>(istream&, wstring&); /* special function just for basic_string at present */ friend istream& getline(istream&, wstring&, wchar_t delim = 012); #if defined(COMPILER_IS_PC_LUCENT) #if !defined(_MSC_VER) || _MSC_VER < 1000 private: static ostream &char_out(ostream &os, wchar_t a) { return char_out_wchar_t(os, a); } static bool is_del(wchar_t a) { return is_del_wchar_t(a); } static wchar_t *copy(wchar_t *s1, const wchar_t *s2, size_t n) { return copy_wchar_t(s1, s2, n); } static size_t length(const wchar_t *s) { return length_wchar_t(s); } #endif #endif }; // inline functions inline const wchar_t *wstring::data() const { if (d->len == 0) return 0; else { if (d->len >= d->max_size && d->len) ((wstring *) this)->reserve_grow(d->len + 1); *(d->str + d->len) = eos_wchar_t(); return (d->str); } } inline const wchar_t *wstring::c_str() const { if (d->len >= d->max_size && d->len) ((wstring *) this)->reserve_grow(d->len + 1); *(d->str + d->len) = eos_wchar_t(); return (d->str); } inline wstring& wstring::operator=(const wstring& r) { r.d->rcinc(); d->rcdec(); d = r.d; return *this; } inline wstring& wstring::operator=(wchar_t c) { if(d->refc!=1) { d->rcdec(); d = Srep_LUCENT::new_srep(1); } d->str[0] = c; d->len = 1; return *this; } inline bool operator==(const wstring& t, const wstring& s) { register int dlen = t.d->len; register bool retval; if ((dlen != s.d->len) || (dlen && t.d->str[0] != s.d->str[0]) || (dlen>1 && t.d->str[1] != s.d->str[1])) retval = 0; else retval = !compare_wchar_t(t.d->str, s.d->str, dlen); return retval; } inline bool operator==(const wstring& t, const wchar_t* s) { register int dlen = t.d->len; register bool retval; if (!s || (dlen && t.d->str[0] != s[0]) || (dlen>1 && s[0] != eos_wchar_t() && t.d->str[1] != s[1])) retval = 0; else retval = (dlen != length_wchar_t(s)) ? 0 : !compare_wchar_t(t.d->str, s, dlen); return retval; } inline bool operator==(const wchar_t* s, const wstring& t) { return t==s; } inline bool operator!=(const wstring& t, const wstring& s) { register int dlen = t.d->len; register bool retval; if ((dlen != s.d->len) || (dlen && t.d->str[0] != s.d->str[0]) || (dlen>1 && t.d->str[1] != s.d->str[1])) retval = 1; else retval = compare_wchar_t(t.d->str, s.d->str, dlen); return retval; } inline bool operator!=(const wstring& t, const wchar_t* s) { register int dlen = t.d->len; register bool retval; if (!s || (dlen && t.d->str[0] != s[0]) || (dlen>1 && s[0] != eos_wchar_t() && t.d->str[1] != s[1])) retval = 1; else retval = (dlen != length_wchar_t(s)) ? 1 : compare_wchar_t(t.d->str, s, dlen); return retval; } inline bool operator!=(const wchar_t* s, const wstring& t) { return t!=s; } inline bool operator>=(const wstring& s, const wstring& t) { return s.compare(t)>=0; } inline bool operator>=(const wstring& t, const wchar_t* s) { return t.compare(s)>=0; } inline bool operator>=(const wchar_t* s, const wstring& t) { return t.compare(s)<=0; } inline bool operator>(const wstring& s, const wstring& t) { return s.compare(t)>0; } inline bool operator>(const wstring& t, const wchar_t* s) { return t.compare(s)>0; } inline bool operator>(const wchar_t* s, const wstring& t) { return t.compare(s)<0; } inline bool operator<=(const wstring& s, const wstring& t) { return s.compare(t)<=0; } inline bool operator<=(const wstring& t, const wchar_t* s) { return t.compare(s)<=0; } inline bool operator<=(const wchar_t* s, const wstring& t) { return t.compare(s)>=0; } inline bool operator<(const wstring& s, const wstring& t) { return s.compare(t)<0; } inline bool operator<(const wstring& t, const wchar_t* s) { return t.compare(s)<0; } inline bool operator<(const wchar_t* s, const wstring& t) { return t.compare(s)>0; } inline wchar_t wstring::operator[](size_t i) const { return d->str[i]; } inline wstring::const_reference wstring::at(size_t i) const { return d->str[i]; } inline wstring& wstring::operator+=(wchar_t c) { int append_to_current = 1; if (d->refc != 1 || d->len == d->max_size - 1) append_to_current = 0; else assign_wchar_t(d->str[d->len++], c); wstring &s = append_to_current ? *this : newcopy(c); return s; } inline void wstring::uniq() { register Srep_LUCENT* x; if(d->refc > 1) { x = Srep_LUCENT::new_srep(d->len); copy_wchar_t(x->str, d->str, d->len); d->rcdec(); d = x; } } inline wstring::iterator wstring::begin() { uniq(); return d->str; } inline wstring::const_iterator wstring::begin() const { return d->str; } inline wstring::iterator wstring::end() { uniq(); return d->str + d->len; } inline wstring::const_iterator wstring::end() const { return d->str + d->len; } inline wstring::reverse_iterator wstring::rbegin() { uniq(); return d->str + d->len; } inline wstring::const_reverse_iterator wstring::rbegin() const { return d->str + d->len; } inline wstring::reverse_iterator wstring::rend() { uniq(); return d->str; } inline wstring::const_reverse_iterator wstring::rend() const { return d->str; } #ifdef NAMESPACES_LUCENT } #endif #endif