From 4ef0de1177b5000d3dd444606b9bdbb736e3c6bf Mon Sep 17 00:00:00 2001 From: Jody Goldberg Date: Sun, 7 Dec 1997 10:41:01 +0000 Subject: [PATCH] bastring.h: Move closer to the draft standard implementation of basic_string by adding 3... Sun Dec 7 02:34:40 1997 Jody Goldberg * libstdc++/std/bastring.h : Move closer to the draft standard implementation of basic_string by adding 3 paramter 'Allocator'. NOTE: this still differs from the standard in not offering per instance allocators. * libstdc++/std/bastring.cc : Likewise. * libstdc++/stlinst.cc : Handle thread safe allocators if they are the default. From-SVN: r16993 --- libstdc++/ChangeLog | 10 ++ libstdc++/std/bastring.cc | 218 +++++++++++++++++++++----------------- libstdc++/std/bastring.h | 159 ++++++++++++++------------- libstdc++/stlinst.cc | 2 +- 4 files changed, 215 insertions(+), 174 deletions(-) diff --git a/libstdc++/ChangeLog b/libstdc++/ChangeLog index 6c82906db13..0d1ddeba948 100644 --- a/libstdc++/ChangeLog +++ b/libstdc++/ChangeLog @@ -1,3 +1,13 @@ +Sun Dec 7 02:34:40 1997 Jody Goldberg + + * libstdc++/std/bastring.h : Move closer to the draft standard + implementation of basic_string by adding 3 paramter 'Allocator'. + NOTE: this still differs from the standard in not offering per + instance allocators. + * libstdc++/std/bastring.cc : Likewise. + * libstdc++/stlinst.cc : Handle thread safe allocators if they are the + default. + Sun Dec 7 02:32:20 1997 Jason Merrill * iosfwd: New header. diff --git a/libstdc++/std/bastring.cc b/libstdc++/std/bastring.cc index 444797096dc..b5be65f3ee3 100644 --- a/libstdc++/std/bastring.cc +++ b/libstdc++/std/bastring.cc @@ -29,15 +29,24 @@ #include extern "C++" { -template -inline void * basic_string ::Rep:: +template +inline void * basic_string ::Rep:: operator new (size_t s, size_t extra) { - return ::operator new (s + extra * sizeof (charT)); + return Allocator::allocate(s + extra * sizeof (charT)); } -template -inline size_t basic_string ::Rep:: +template +inline void basic_string ::Rep:: +operator delete (void * ptr) +{ + return Allocator::deallocate(ptr, sizeof(Rep) + + reinterpret_cast(ptr)->res * + sizeof (charT)); +} + +template +inline size_t basic_string ::Rep:: #if _G_ALLOC_CONTROL default_frob (size_t s) #else @@ -49,8 +58,9 @@ frob_size (size_t s) return i; } -template -inline basic_string ::Rep * basic_string ::Rep:: +template +inline basic_string ::Rep * +basic_string ::Rep:: create (size_t extra) { extra = frob_size (extra + 1); @@ -61,8 +71,8 @@ create (size_t extra) return p; } -template -charT * basic_string ::Rep:: +template +charT * basic_string ::Rep:: clone () { Rep *p = Rep::create (len); @@ -71,8 +81,8 @@ clone () return p->data (); } -template -inline bool basic_string ::Rep:: +template +inline bool basic_string ::Rep:: #ifdef _G_ALLOC_CONTROL default_excess (size_t s, size_t r) #else @@ -82,9 +92,9 @@ excess_slop (size_t s, size_t r) return 2 * (s <= 16 ? 16 : s) < r; } -template -inline bool basic_string :: -check_realloc (size_t s) const +template +inline bool basic_string :: +check_realloc (basic_string::size_type s) const { s += sizeof (charT); rep ()->selfish = false; @@ -93,9 +103,9 @@ check_realloc (size_t s) const || Rep::excess_slop (s, capacity ())); } -template -void basic_string :: -alloc (size_t size, bool save) +template +void basic_string :: +alloc (basic_string::size_type size, bool save) { if (! check_realloc (size)) return; @@ -113,10 +123,11 @@ alloc (size_t size, bool save) repup (p); } -template -basic_string & basic_string :: -replace (size_t pos1, size_t n1, - const basic_string& str, size_t pos2, size_t n2) +template +basic_string & +basic_string :: +replace (size_type pos1, size_type n1, + const basic_string& str, size_type pos2, size_type n2) { const size_t len2 = str.length (); @@ -131,27 +142,28 @@ replace (size_t pos1, size_t n1, return replace (pos1, n1, str.data () + pos2, n2); } -template -inline void basic_string ::Rep:: +template +inline void basic_string ::Rep:: copy (size_t pos, const charT *s, size_t n) { if (n) traits::copy (data () + pos, s, n); } -template -inline void basic_string ::Rep:: +template +inline void basic_string ::Rep:: move (size_t pos, const charT *s, size_t n) { if (n) traits::move (data () + pos, s, n); } -template -basic_string & basic_string :: -replace (size_t pos, size_t n1, const charT* s, size_t n2) +template +basic_string & +basic_string :: +replace (size_type pos, size_type n1, const charT* s, size_type n2) { - const size_t len = length (); + const size_type len = length (); OUTOFRANGE (pos > len); if (n1 > len - pos) n1 = len - pos; @@ -176,16 +188,16 @@ replace (size_t pos, size_t n1, const charT* s, size_t n2) return *this; } -template -inline void basic_string ::Rep:: +template +inline void basic_string ::Rep:: set (size_t pos, const charT c, size_t n) { traits::set (data () + pos, c, n); } -template -basic_string & basic_string :: -replace (size_t pos, size_t n1, size_t n2, charT c) +template +basic_string & basic_string :: +replace (size_type pos, size_type n1, size_type n2, charT c) { const size_t len = length (); OUTOFRANGE (pos > len); @@ -212,9 +224,9 @@ replace (size_t pos, size_t n1, size_t n2, charT c) return *this; } -template -void basic_string :: -resize (size_t n, charT c) +template +void basic_string :: +resize (size_type n, charT c) { LENGTHERROR (n > max_size ()); @@ -224,9 +236,10 @@ resize (size_t n, charT c) erase (n); } -template -size_t basic_string :: -copy (charT* s, size_t n, size_t pos) +template +basic_string ::size_type +basic_string :: +copy (charT* s, size_type n, size_type pos) { OUTOFRANGE (pos > length ()); @@ -237,9 +250,10 @@ copy (charT* s, size_t n, size_t pos) return n; } -template -size_t basic_string :: -find (const charT* s, size_t pos, size_t n) const +template +basic_string ::size_type +basic_string :: +find (const charT* s, size_type pos, size_type n) const { size_t xpos = pos; for (; xpos + n <= length (); ++xpos) @@ -249,9 +263,10 @@ find (const charT* s, size_t pos, size_t n) const return npos; } -template -inline size_t basic_string :: -_find (const charT* ptr, charT c, size_t xpos, size_t len) +template +inline basic_string ::size_type +basic_string :: +_find (const charT* ptr, charT c, size_type xpos, size_type len) { for (; xpos < len; ++xpos) if (traits::eq (ptr [xpos], c)) @@ -259,16 +274,18 @@ _find (const charT* ptr, charT c, size_t xpos, size_t len) return npos; } -template -size_t basic_string :: -find (charT c, size_t pos) const +template +basic_string ::size_type +basic_string :: +find (charT c, size_type pos) const { return _find (data (), c, pos, length ()); } -template -size_t basic_string :: -rfind (const charT* s, size_t pos, size_t n) const +template +basic_string ::size_type +basic_string :: +rfind (const charT* s, size_type pos, size_type n) const { if (n > length ()) return npos; @@ -284,9 +301,10 @@ rfind (const charT* s, size_t pos, size_t n) const return npos; } -template -size_t basic_string :: -rfind (charT c, size_t pos) const +template +basic_string ::size_type +basic_string :: +rfind (charT c, size_type pos) const { if (1 > length ()) return npos; @@ -301,9 +319,10 @@ rfind (charT c, size_t pos) const return npos; } -template -size_t basic_string :: -find_first_of (const charT* s, size_t pos, size_t n) const +template +basic_string ::size_type +basic_string :: +find_first_of (const charT* s, size_type pos, size_type n) const { size_t xpos = pos; for (; xpos < length (); ++xpos) @@ -312,9 +331,10 @@ find_first_of (const charT* s, size_t pos, size_t n) const return npos; } -template -size_t basic_string :: -find_last_of (const charT* s, size_t pos, size_t n) const +template +basic_string ::size_type +basic_string :: +find_last_of (const charT* s, size_type pos, size_type n) const { size_t xpos = length () - 1; if (xpos > pos) @@ -325,9 +345,10 @@ find_last_of (const charT* s, size_t pos, size_t n) const return npos; } -template -size_t basic_string :: -find_first_not_of (const charT* s, size_t pos, size_t n) const +template +basic_string ::size_type +basic_string :: +find_first_not_of (const charT* s, size_type pos, size_type n) const { size_t xpos = pos; for (; xpos < length (); ++xpos) @@ -336,9 +357,10 @@ find_first_not_of (const charT* s, size_t pos, size_t n) const return npos; } -template -size_t basic_string :: -find_first_not_of (charT c, size_t pos) const +template +basic_string ::size_type +basic_string :: +find_first_not_of (charT c, size_type pos) const { size_t xpos = pos; for (; xpos < length (); ++xpos) @@ -347,9 +369,10 @@ find_first_not_of (charT c, size_t pos) const return npos; } -template -size_t basic_string :: -find_last_not_of (const charT* s, size_t pos, size_t n) const +template +basic_string ::size_type +basic_string :: +find_last_not_of (const charT* s, size_type pos, size_type n) const { size_t xpos = length () - 1; if (xpos > pos) @@ -360,9 +383,10 @@ find_last_not_of (const charT* s, size_t pos, size_t n) const return npos; } -template -size_t basic_string :: -find_last_not_of (charT c, size_t pos) const +template +basic_string ::size_type +basic_string :: +find_last_not_of (charT c, size_type pos) const { size_t xpos = length () - 1; if (xpos > pos) @@ -373,9 +397,9 @@ find_last_not_of (charT c, size_t pos) const return npos; } -template -int basic_string :: -compare (const basic_string& str, size_t pos, size_t n) const +template +int basic_string :: +compare (const basic_string& str, size_type pos, size_type n) const { OUTOFRANGE (pos > length ()); @@ -392,9 +416,9 @@ compare (const basic_string& str, size_t pos, size_t n) const return (length () - pos) - str.length (); } -template -int basic_string :: -compare (const charT* s, size_t pos, size_t n) const +template +int basic_string :: +compare (const charT* s, size_type pos, size_type n) const { OUTOFRANGE (pos > length ()); @@ -409,9 +433,9 @@ compare (const charT* s, size_t pos, size_t n) const #include -template +template istream & -operator>> (istream &is, basic_string &s) +operator>> (istream &is, basic_string &s) { int w = is.width (0); if (is.ipfx0 ()) @@ -444,16 +468,16 @@ operator>> (istream &is, basic_string &s) return is; } -template +template ostream & -operator<< (ostream &o, const basic_string & s) +operator<< (ostream &o, const basic_string & s) { return o.write (s.data (), s.length ()); } -template +template istream& -getline (istream &is, basic_string & s, charT delim) +getline (istream &is, basic_string & s, charT delim) { if (is.ipfx1 ()) { @@ -494,22 +518,22 @@ getline (istream &is, basic_string & s, charT delim) return is; } -template -basic_string ::Rep -basic_string::nilRep = { 0, 0, 1 }; +template +basic_string ::Rep +basic_string::nilRep = { 0, 0, 1 }; -template -const basic_string ::size_type -basic_string ::npos; +template +const basic_string ::size_type +basic_string ::npos; #ifdef _G_ALLOC_CONTROL -template -bool (*basic_string ::Rep::excess_slop) (size_t, size_t) - = basic_string ::Rep::default_excess; +template +bool (*basic_string ::Rep::excess_slop) (size_t, size_t) + = basic_string ::Rep::default_excess; -template -size_t (*basic_string ::Rep::frob_size) (size_t) - = basic_string ::Rep::default_frob; +template +size_t (*basic_string ::Rep::frob_size) (size_t) + = basic_string ::Rep::default_frob; #endif } // extern "C++" diff --git a/libstdc++/std/bastring.h b/libstdc++/std/bastring.h index f8fe279b158..5b1d651e00f 100644 --- a/libstdc++/std/bastring.h +++ b/libstdc++/std/bastring.h @@ -35,6 +35,9 @@ #include #include +// NOTE : This does NOT conform to the draft standard and is likely to change +#include + extern "C++" { class istream; class ostream; @@ -58,7 +61,8 @@ extern void __length_error (const char *); #endif -template > +template , + class Allocator = alloc > class basic_string { private: @@ -72,6 +76,7 @@ private: void release () { if (--ref == 0) delete this; } inline static void * operator new (size_t, size_t); + inline static void operator delete (void *); inline static Rep* create (size_t); charT* clone (); @@ -102,8 +107,10 @@ private: public: // types: - typedef traits traits_type; - typedef charT value_type; + typedef traits traits_type; + typedef typename traits::char_type value_type; + typedef Allocator allocator_type; + typedef size_t size_type; typedef ptrdiff_t difference_type; typedef charT& reference; @@ -386,12 +393,12 @@ private: }; #ifdef __STL_MEMBER_TEMPLATES -template template -basic_string & basic_string :: +template template +basic_string & basic_string :: replace (iterator i1, iterator i2, InputIterator j1, InputIterator j2) #else -template -basic_string & basic_string :: +template +basic_string & basic_string :: replace (iterator i1, iterator i2, const_iterator j1, const_iterator j2) #endif { @@ -426,191 +433,191 @@ replace (iterator i1, iterator i2, const_iterator j1, const_iterator j2) return *this; } -template -inline basic_string -operator+ (const basic_string & lhs, - const basic_string & rhs) +template +inline basic_string +operator+ (const basic_string & lhs, + const basic_string & rhs) { - basic_string str (lhs); + basic_string str (lhs); str.append (rhs); return str; } -template -inline basic_string -operator+ (const charT* lhs, const basic_string & rhs) +template +inline basic_string +operator+ (const charT* lhs, const basic_string & rhs) { - basic_string str (lhs); + basic_string str (lhs); str.append (rhs); return str; } -template -inline basic_string -operator+ (charT lhs, const basic_string & rhs) +template +inline basic_string +operator+ (charT lhs, const basic_string & rhs) { - basic_string str (1, lhs); + basic_string str (1, lhs); str.append (rhs); return str; } -template -inline basic_string -operator+ (const basic_string & lhs, const charT* rhs) +template +inline basic_string +operator+ (const basic_string & lhs, const charT* rhs) { - basic_string str (lhs); + basic_string str (lhs); str.append (rhs); return str; } -template -inline basic_string -operator+ (const basic_string & lhs, charT rhs) +template +inline basic_string +operator+ (const basic_string & lhs, charT rhs) { - basic_string str (lhs); + basic_string str (lhs); str.append (1, rhs); return str; } -template +template inline bool -operator== (const basic_string & lhs, - const basic_string & rhs) +operator== (const basic_string & lhs, + const basic_string & rhs) { return (lhs.compare (rhs) == 0); } -template +template inline bool -operator== (const charT* lhs, const basic_string & rhs) +operator== (const charT* lhs, const basic_string & rhs) { return (rhs.compare (lhs) == 0); } -template +template inline bool -operator== (const basic_string & lhs, const charT* rhs) +operator== (const basic_string & lhs, const charT* rhs) { return (lhs.compare (rhs) == 0); } -template +template inline bool -operator!= (const charT* lhs, const basic_string & rhs) +operator!= (const charT* lhs, const basic_string & rhs) { return (rhs.compare (lhs) != 0); } -template +template inline bool -operator!= (const basic_string & lhs, const charT* rhs) +operator!= (const basic_string & lhs, const charT* rhs) { return (lhs.compare (rhs) != 0); } -template +template inline bool -operator< (const basic_string & lhs, - const basic_string & rhs) +operator< (const basic_string & lhs, + const basic_string & rhs) { return (lhs.compare (rhs) < 0); } -template +template inline bool -operator< (const charT* lhs, const basic_string & rhs) +operator< (const charT* lhs, const basic_string & rhs) { return (rhs.compare (lhs) > 0); } -template +template inline bool -operator< (const basic_string & lhs, const charT* rhs) +operator< (const basic_string & lhs, const charT* rhs) { return (lhs.compare (rhs) < 0); } -template +template inline bool -operator> (const charT* lhs, const basic_string & rhs) +operator> (const charT* lhs, const basic_string & rhs) { return (rhs.compare (lhs) < 0); } -template +template inline bool -operator> (const basic_string & lhs, const charT* rhs) +operator> (const basic_string & lhs, const charT* rhs) { return (lhs.compare (rhs) > 0); } -template +template inline bool -operator<= (const charT* lhs, const basic_string & rhs) +operator<= (const charT* lhs, const basic_string & rhs) { return (rhs.compare (lhs) >= 0); } -template +template inline bool -operator<= (const basic_string & lhs, const charT* rhs) +operator<= (const basic_string & lhs, const charT* rhs) { return (lhs.compare (rhs) <= 0); } -template +template inline bool -operator>= (const charT* lhs, const basic_string & rhs) +operator>= (const charT* lhs, const basic_string & rhs) { return (rhs.compare (lhs) <= 0); } -template +template inline bool -operator>= (const basic_string & lhs, const charT* rhs) +operator>= (const basic_string & lhs, const charT* rhs) { return (lhs.compare (rhs) >= 0); } -template +template inline bool -operator!= (const basic_string & lhs, - const basic_string & rhs) +operator!= (const basic_string & lhs, + const basic_string & rhs) { return (lhs.compare (rhs) != 0); } -template +template inline bool -operator> (const basic_string & lhs, - const basic_string & rhs) +operator> (const basic_string & lhs, + const basic_string & rhs) { return (lhs.compare (rhs) > 0); } -template +template inline bool -operator<= (const basic_string & lhs, - const basic_string & rhs) +operator<= (const basic_string & lhs, + const basic_string & rhs) { return (lhs.compare (rhs) <= 0); } -template +template inline bool -operator>= (const basic_string & lhs, - const basic_string & rhs) +operator>= (const basic_string & lhs, + const basic_string & rhs) { return (lhs.compare (rhs) >= 0); } class istream; class ostream; -template istream& -operator>> (istream&, basic_string &); -template ostream& -operator<< (ostream&, const basic_string &); -template istream& -getline (istream&, basic_string &, charT delim = '\n'); +template istream& +operator>> (istream&, basic_string &); +template ostream& +operator<< (ostream&, const basic_string &); +template istream& +getline (istream&, basic_string &, charT delim = '\n'); } // extern "C++" diff --git a/libstdc++/stlinst.cc b/libstdc++/stlinst.cc index dc55ce32274..b71dc7ea09a 100644 --- a/libstdc++/stlinst.cc +++ b/libstdc++/stlinst.cc @@ -3,6 +3,6 @@ #include -template class __default_alloc_template; +template class __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0>; template class __malloc_alloc_template<0>;