1
 
/*      Copyright (C) 2004 Garrett A. Kajmowicz
 
3
 
        This file is part of the uClibc++ Library.
 
5
 
        This library is free software; you can redistribute it and/or
 
6
 
        modify it under the terms of the GNU Lesser General Public
 
7
 
        License as published by the Free Software Foundation; either
 
8
 
        version 2.1 of the License, or (at your option) any later version.
 
10
 
        This library 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 GNU
 
13
 
        Lesser General Public License for more details.
 
15
 
        You should have received a copy of the GNU Lesser General Public
 
16
 
        License along with this library; if not, write to the Free Software
 
17
 
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
20
 
#include <basic_definitions>
 
21
 
#include <char_traits>
 
23
 
#include <func_exception>
 
28
 
#ifdef __UCLIBCXX_HAS_WCHAR__
 
33
 
#ifndef __HEADER_STD_STRING
 
34
 
#define __HEADER_STD_STRING 1
 
36
 
#pragma GCC visibility push(default)
 
42
 
        template<class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> > class basic_string;
 
44
 
        typedef basic_string<char> string;
 
45
 
        #ifdef __UCLIBCXX_HAS_WCHAR__
 
46
 
        typedef basic_string<wchar_t> wstring;
 
51
 
//template<class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> > class _UCXXEXPORT basic_string
 
52
 
template<class Ch, class Tr, class A> class basic_string
 
53
 
        : public std::vector<Ch, A>
 
56
 
        typedef Tr traits_type;
 
57
 
        typedef typename Tr::char_type value_type;
 
58
 
        typedef A allocator_type;
 
59
 
        typedef typename A::size_type size_type;
 
60
 
        typedef typename A::difference_type difference_type;
 
62
 
        typedef typename A::reference reference;
 
63
 
        typedef typename A::const_reference const_reference;
 
64
 
        typedef typename A::pointer pointer;
 
65
 
        typedef typename A::const_pointer const_pointer;
 
67
 
        typedef typename vector<Ch, A>::iterator iterator;
 
68
 
        typedef typename vector<Ch, A>::const_iterator const_iterator;
 
70
 
        typedef typename vector<Ch, A>::reverse_iterator reverse_iterator;
 
71
 
        typedef typename vector<Ch, A>::const_reverse_iterator const_reverse_iterator;
 
73
 
        static const size_type npos = (size_type)-1;
 
75
 
        explicit _UCXXEXPORT basic_string(const A& al = A()) : vector<Ch, A>(al){ return; }
 
77
 
        _UCXXEXPORT basic_string(const basic_string& str, size_type pos = 0, size_type n = npos, const A& al = A());    //Below
 
79
 
        _UCXXEXPORT basic_string(const Ch* s, size_type n, const A& al = A())
 
83
 
                        __throw_out_of_range();
 
87
 
                        Tr::copy(vector<Ch, A>::data, s, vector<Ch, A>::elements);
 
91
 
        _UCXXEXPORT basic_string(const Ch* s, const A& al = A());               //Below
 
93
 
        _UCXXEXPORT basic_string(size_type n, Ch c, const A& al = A())
 
94
 
                : vector<Ch, A>(n, c, al)
 
98
 
        template<class InputIterator> _UCXXEXPORT basic_string(InputIterator begin, InputIterator end, const A& a = A())
 
99
 
                :vector<Ch, A>(begin, end)
 
104
 
        _UCXXEXPORT ~basic_string() {
 
108
 
        _UCXXEXPORT basic_string& operator=(const basic_string& str);   //Below
 
110
 
        _UCXXEXPORT basic_string& operator=(const Ch* s){
 
111
 
                vector<Ch, A>::clear();
 
113
 
                        size_type len = Tr::length(s);
 
115
 
                        Tr::copy( vector<Ch, A>::data, s, len);
 
120
 
        _UCXXEXPORT basic_string& operator=(Ch c){
 
121
 
                vector<Ch, A>::clear();
 
122
 
                vector<Ch, A>::push_back(c);
 
126
 
        inline _UCXXEXPORT size_type length() const { return vector<Ch, A>::size(); }
 
128
 
        void _UCXXEXPORT resize(size_type n, Ch c = Ch()){
 
129
 
                vector<Ch, A>::resize(n, c);
 
132
 
        _UCXXEXPORT basic_string& operator+=(const basic_string& str){
 
136
 
        _UCXXEXPORT basic_string& operator+=(const Ch * s){
 
140
 
        _UCXXEXPORT basic_string& operator+=(Ch c){
 
141
 
                vector<Ch, A>::push_back(c);
 
145
 
        _UCXXEXPORT basic_string& append(const basic_string& str){
 
146
 
                size_t temp = vector<Ch, A>::elements;
 
147
 
                resize(vector<Ch, A>::elements + str.elements);
 
148
 
                Tr::copy( vector<Ch, A>::data + temp, str.vector<Ch, A>::data, str.elements);
 
153
 
        _UCXXEXPORT basic_string& append(const basic_string& str, size_type pos, size_type n){
 
154
 
                if(pos > str.size()){
 
155
 
                        __throw_out_of_range();
 
158
 
                size_type rlen = str.elements - pos;
 
162
 
                if(vector<Ch, A>::elements > npos - rlen){
 
163
 
                        __throw_length_error();
 
165
 
                size_t temp = vector<Ch, A>::elements;
 
166
 
                resize(vector<Ch, A>::elements + rlen);
 
167
 
                Tr::copy( vector<Ch, A>::data + temp, str.vector<Ch, A>::data + pos, rlen);
 
171
 
        _UCXXEXPORT basic_string& append(const Ch* s, size_type n){
 
172
 
                size_t temp = vector<Ch, A>::elements;
 
173
 
                resize(vector<Ch, A>::elements + n);
 
174
 
                Tr::copy( vector<Ch, A>::data + temp, s, n);
 
178
 
        _UCXXEXPORT basic_string& append(const Ch* s){
 
179
 
                size_type strLen = Tr::length(s);
 
180
 
                size_t temp = vector<Ch, A>::elements;
 
181
 
                resize(vector<Ch, A>::elements + strLen);
 
182
 
                Tr::copy( vector<Ch, A>::data + temp, s, strLen);
 
186
 
        _UCXXEXPORT basic_string& append(size_type n, Ch c){
 
187
 
                vector<Ch, A>::resize(vector<Ch, A>::elements + n, c);
 
191
 
        _UCXXEXPORT basic_string& assign(const basic_string& str){
 
196
 
        _UCXXEXPORT basic_string& assign(const basic_string& str, size_type pos, size_type n){
 
197
 
                if(pos > str.elements){
 
198
 
                        __throw_out_of_range();
 
200
 
                size_type r = str.elements - pos;
 
205
 
                Tr::copy(vector<Ch, A>::data, str.vector<Ch, A>::data + pos, r);
 
209
 
        _UCXXEXPORT basic_string& assign(const Ch* s, size_type n){
 
211
 
                Tr::copy(vector<Ch, A>::data, s, n);
 
215
 
        _UCXXEXPORT basic_string& assign(const Ch* s){
 
216
 
                size_type len = Tr::length(s);
 
217
 
                return assign(s, len);
 
220
 
        _UCXXEXPORT basic_string& assign(size_type n, Ch c){
 
221
 
                vector<Ch, A>::clear();
 
222
 
                vector<Ch, A>::resize(n, Ch() );
 
226
 
        template<class InputIterator> _UCXXEXPORT basic_string& assign(InputIterator first, InputIterator last){
 
227
 
                vector<Ch, A>::resize(0, Ch());
 
228
 
                while (first != last){
 
235
 
        _UCXXEXPORT basic_string& insert(size_type pos1, const basic_string& str, size_type pos2=0, size_type n=npos){
 
236
 
                if(pos1 > vector<Ch, A>::elements || pos2 > str.elements){
 
237
 
                        __throw_out_of_range();
 
239
 
                size_type r = str.elements - pos2;
 
243
 
                if(vector<Ch, A>::elements > npos - r){
 
244
 
                        __throw_length_error();
 
246
 
                size_type temp = vector<Ch, A>::elements;
 
247
 
                resize(vector<Ch, A>::elements + r);
 
248
 
                Tr::move(vector<Ch, A>::data + pos1 + r, vector<Ch, A>::data + pos1, temp - pos1);
 
249
 
                Tr::copy(vector<Ch, A>::data + pos1, str.vector<Ch, A>::data + pos2, r);
 
253
 
        _UCXXEXPORT basic_string& insert(size_type pos, const Ch* s, size_type n){
 
254
 
                if(pos > vector<Ch, A>::elements){
 
255
 
                        __throw_out_of_range();
 
257
 
                if(vector<Ch, A>::elements > npos - n){
 
258
 
                        __throw_length_error();
 
260
 
                size_type temp = vector<Ch, A>::elements;
 
261
 
                resize(vector<Ch, A>::elements + n);
 
262
 
                Tr::move(vector<Ch, A>::data + pos + n, vector<Ch, A>::data + pos, temp - pos);
 
263
 
                Tr::copy(vector<Ch, A>::data + pos, s, n);
 
267
 
        inline _UCXXEXPORT basic_string& insert(size_type pos, const Ch* s){
 
268
 
                size_type len = Tr::length(s);
 
269
 
                return insert(pos, s, len);
 
272
 
        _UCXXEXPORT basic_string& insert(size_type pos, size_type n, Ch c){
 
273
 
                if(pos > vector<Ch, A>::elements){
 
274
 
                        __throw_out_of_range();
 
276
 
                if(vector<Ch, A>::elements > npos - n){
 
277
 
                        __throw_length_error();
 
279
 
                size_type temp = vector<Ch, A>::elements;
 
280
 
                resize(vector<Ch, A>::elements + n);
 
281
 
                Tr::move(vector<Ch, A>::data + pos + n, vector<Ch, A>::data + pos, temp - pos);
 
282
 
                Tr::assign(vector<Ch, A>::data + pos, n, c);
 
286
 
        using vector<Ch, A>::insert;
 
287
 
//      void insert(iterator p, size_type n, charT c);
 
288
 
//      template<class InputIterator> void insert(iterator p, InputIterator first, InputIterator last);
 
290
 
        _UCXXEXPORT basic_string& erase(size_type pos = 0, size_type n = npos){
 
291
 
                size_type xlen = vector<Ch, A>::elements - pos;
 
296
 
                size_type temp = vector<Ch, A>::elements;
 
298
 
                Tr::move(vector<Ch, A>::data + pos, vector<Ch, A>::data + pos + xlen, temp - pos - xlen);
 
303
 
        _UCXXEXPORT iterator erase(iterator position){
 
304
 
                if(position == vector<Ch, A>::end()){
 
310
 
                iterator temp = position;
 
312
 
                while(position != vector<Ch, A>::end()){
 
313
 
                        *(position-1) = *position;
 
316
 
                vector<Ch, A>::pop_back();
 
320
 
        _UCXXEXPORT iterator erase(iterator first, iterator last){
 
321
 
                size_t count = last - first;
 
323
 
                iterator temp = last;
 
325
 
                while(last != vector<Ch, A>::end()){
 
326
 
                        *(last - count) = *last;
 
330
 
                resize( vector<Ch, A>::elements-count);
 
335
 
        _UCXXEXPORT basic_string&
 
336
 
                replace(size_type pos1, size_type n1, const basic_string& str, size_type pos2=0, size_type n2=npos)
 
338
 
                if(pos1 > vector<Ch, A>::elements){
 
339
 
                        __throw_out_of_range();
 
341
 
                size_type xlen = vector<Ch, A>::elements - pos1;
 
345
 
                size_type rlen = str.elements - pos2;
 
349
 
                if((vector<Ch, A>::elements - xlen) >= (npos - rlen)){
 
350
 
                        __throw_length_error();
 
353
 
                size_t temp = vector<Ch, A>::elements;
 
355
 
                if(rlen > xlen){                //Only if making larger
 
356
 
                        resize(temp - xlen + rlen);
 
359
 
                //Final length = vector<Ch, A>::elements - xlen + rlen
 
360
 
                //Initial block is of size pos1
 
361
 
                //Block 2 is of size len
 
363
 
                Tr::move(vector<Ch, A>::data + pos1 + rlen, vector<Ch, A>::data + pos1 + xlen, temp - pos1 - xlen);
 
364
 
                Tr::copy(vector<Ch, A>::data + pos1, str.vector<Ch, A>::data + pos2, rlen);
 
365
 
                resize(temp - xlen + rlen);
 
369
 
        _UCXXEXPORT basic_string& replace(size_type pos, size_type n1, const Ch* s, size_type n2){
 
370
 
                return replace(pos,n1,basic_string<Ch,Tr,A>(s,n2));
 
374
 
        inline _UCXXEXPORT basic_string& replace(size_type pos, size_type n1, const Ch* s){
 
375
 
                return replace(pos,n1,basic_string<Ch,Tr,A>(s));
 
378
 
        _UCXXEXPORT basic_string& replace(size_type pos, size_type n1, size_type n2, Ch c){
 
379
 
                return replace(pos,n1,basic_string<Ch, Tr, A>(n2,c));
 
381
 
//      _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, const basic_string& str);
 
382
 
//      _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, const Ch* s, size_type n);
 
383
 
//      _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, const Ch* s);
 
384
 
//      _UCXXEXPORT basic_string& replace(iterator i1, iterator i2, size_type n, Ch c);
 
385
 
/*      template<class InputIterator> _UCXXEXPORT basic_string& replace(iterator i1, iterator i2,
 
386
 
                InputIterator j1, InputIterator j2);*/
 
388
 
        size_type _UCXXEXPORT copy(Ch* s, size_type n, size_type pos = 0) const{
 
389
 
                if(pos > vector<Ch, A>::elements){
 
390
 
                        __throw_out_of_range();
 
392
 
                size_type r = vector<Ch, A>::elements - pos;
 
396
 
                Tr::copy(s, vector<Ch, A>::data + pos, r);
 
400
 
        _UCXXEXPORT void swap(basic_string<Ch,Tr,A>& s){
 
403
 
                vector<Ch, A>::swap(s);
 
406
 
        _UCXXEXPORT const Ch* c_str() const{
 
407
 
                const_cast<basic_string<Ch,Tr,A> *>(this)->reserve(vector<Ch, A>::elements+1);
 
408
 
                vector<Ch, A>::data[vector<Ch, A>::elements] = 0;       //Add 0 at the end
 
409
 
                return vector<Ch, A>::data;
 
412
 
        _UCXXEXPORT const Ch* data() const{
 
413
 
                return vector<Ch, A>::data;
 
415
 
        _UCXXEXPORT allocator_type get_allocator() const{
 
416
 
                return vector<Ch, A>::a;
 
419
 
        _UCXXEXPORT size_type find (const basic_string& str, size_type pos = 0) const;  //Below
 
421
 
        _UCXXEXPORT size_type find (const Ch* s, size_type pos, size_type n) const{
 
422
 
                return find(basic_string<Ch, Tr, A>(s,n), pos);
 
424
 
        _UCXXEXPORT size_type find (const Ch* s, size_type pos = 0) const{
 
425
 
                return find(basic_string<Ch, Tr, A>(s), pos);
 
427
 
        _UCXXEXPORT size_type find (Ch c, size_type pos = 0) const{
 
428
 
                for(size_type i = pos; i < length(); ++i){
 
429
 
                        if(operator[](i) == c){
 
435
 
        _UCXXEXPORT size_type rfind(const basic_string& str, size_type pos = npos) const{
 
439
 
                for(size_type i = pos; i > 0; --i){
 
440
 
                        if(str == substr(i-1, str.length())){
 
446
 
        _UCXXEXPORT size_type rfind(const Ch* s, size_type pos, size_type n) const{
 
447
 
                return rfind(basic_string<Ch, Tr, A>(s,n),pos);
 
449
 
        _UCXXEXPORT size_type rfind(const Ch* s, size_type pos = npos) const{
 
450
 
                return rfind(basic_string<Ch, Tr, A>(s),pos);
 
452
 
        _UCXXEXPORT size_type rfind(Ch c, size_type pos = npos) const{
 
453
 
                return rfind(basic_string<Ch, Tr, A>(1,c),pos);
 
456
 
        _UCXXEXPORT size_type find_first_of(const basic_string& str, size_type pos = 0) const{
 
457
 
                for(size_type i = pos; i < length(); ++i){
 
458
 
                        for(size_type j = 0; j < str.length() ; ++j){
 
459
 
                                if( Tr::eq(str[j], operator[](i)) ){
 
467
 
        _UCXXEXPORT size_type find_first_of(const Ch* s, size_type pos, size_type n) const{
 
468
 
                return find_first_of(basic_string<Ch, Tr, A>(s,n),pos);
 
470
 
        _UCXXEXPORT size_type find_first_of(const Ch* s, size_type pos = 0) const{
 
471
 
                return find_first_of(basic_string<Ch, Tr, A>(s),pos);
 
473
 
        _UCXXEXPORT size_type find_first_of(Ch c, size_type pos = 0) const{
 
474
 
                for(size_type i = pos; i< length(); ++i){
 
475
 
                        if( Tr::eq(operator[](i), c) ){
 
482
 
        _UCXXEXPORT size_type find_last_of (const basic_string& str, size_type pos = npos) const{
 
486
 
                for(size_type i = pos; i >0 ; --i){
 
487
 
                        for(size_type j = 0 ; j < str.length(); ++j){
 
488
 
                                if( Tr::eq(operator[](i-1), str[j]) ){
 
495
 
        _UCXXEXPORT size_type find_last_of (const Ch* s, size_type pos, size_type n) const{
 
496
 
                return find_last_of(basic_string<Ch, Tr, A>(s,n),pos);
 
498
 
        _UCXXEXPORT size_type find_last_of (const Ch* s, size_type pos = npos) const{
 
499
 
                return find_last_of(basic_string<Ch, Tr, A>(s),pos);
 
501
 
        _UCXXEXPORT size_type find_last_of (Ch c, size_type pos = npos) const{
 
505
 
                for(size_type i = pos; i >0 ; --i){
 
506
 
                        if( Tr::eq(operator[](i-1), c) ){
 
513
 
        _UCXXEXPORT size_type find_first_not_of(const basic_string& str, size_type pos = 0) const{
 
515
 
                for(size_type i = pos; i < length(); ++i){
 
516
 
                        foundCharacter = false;
 
517
 
                        for(size_type j = 0; j < str.length() ; ++j){
 
518
 
                                if( Tr::eq(str[j], operator[](i)) ){
 
519
 
                                        foundCharacter = true;
 
522
 
                        if(foundCharacter == false){
 
529
 
        _UCXXEXPORT size_type find_first_not_of(const Ch* s, size_type pos, size_type n) const{
 
530
 
                return find_first_not_of(basic_string<Ch, Tr, A>(s,n),pos);
 
532
 
        _UCXXEXPORT size_type find_first_not_of(const Ch* s, size_type pos = 0) const{
 
533
 
                return find_first_not_of(basic_string<Ch, Tr, A>(s),pos);
 
535
 
        _UCXXEXPORT size_type find_first_not_of(Ch c, size_type pos = 0) const{
 
536
 
                for(size_type i = pos; i < length() ; ++i){
 
537
 
                        if(operator[](i) != c){
 
543
 
        _UCXXEXPORT size_type find_last_not_of (const basic_string& str, size_type pos = npos) const{
 
544
 
                size_type xpos(length() - 1);
 
549
 
                while(xpos != npos && npos != str.find_first_of(at(xpos))){
 
556
 
        _UCXXEXPORT size_type find_last_not_of (const Ch* s, size_type pos, size_type n) const{
 
557
 
                return find_last_not_of(basic_string<Ch, Tr, A>(s,n),pos);
 
559
 
        _UCXXEXPORT size_type find_last_not_of (const Ch* s, size_type pos = npos) const{
 
560
 
                return find_last_not_of(basic_string<Ch, Tr, A>(s),pos);
 
562
 
        _UCXXEXPORT size_type find_last_not_of (Ch c, size_type pos = npos) const{
 
563
 
                size_type xpos(length() - 1);
 
567
 
                while(xpos != npos && Tr::eq(at(xpos), c)){
 
574
 
        _UCXXEXPORT basic_string substr(size_type pos = 0, size_type n = npos) const;
 
576
 
        _UCXXEXPORT int compare(const basic_string& str) const{
 
577
 
                size_type rlen = vector<Ch, A>::elements;
 
578
 
                if(rlen >  str.elements){
 
581
 
                int retval = Tr::compare(vector<Ch, A>::data, str.vector<Ch, A>::data, rlen);
 
583
 
                        if(vector<Ch, A>::elements < str.elements){
 
586
 
                        if(vector<Ch, A>::elements > str.elements){
 
593
 
        _UCXXEXPORT int compare(size_type pos1, size_type n1, const basic_string& str,
 
594
 
                size_type pos2=0, size_type n2=npos) const{
 
595
 
                size_type len1 = vector<Ch, A>::elements - pos1;
 
599
 
                size_type len2 = str.vector<Ch, A>::elements - pos2;
 
603
 
                size_type rlen = len1;
 
607
 
                int retval = Tr::compare(vector<Ch, A>::data + pos1, str.vector<Ch, A>::data + pos2, rlen);
 
619
 
        _UCXXEXPORT int compare(const Ch* s) const{
 
620
 
                size_type slen = Tr::length(s);
 
621
 
                size_type rlen = slen;
 
622
 
                if(rlen > vector<Ch, A>::elements){
 
623
 
                        rlen=vector<Ch, A>::elements;
 
625
 
                int retval = Tr::compare(vector<Ch, A>::data, s, rlen);
 
627
 
                        if(vector<Ch, A>::elements < slen){
 
630
 
                        if(vector<Ch, A>::elements > slen){
 
637
 
        _UCXXEXPORT int compare(size_type pos1, size_type n1, const Ch* s, size_type n2 = npos) const{
 
638
 
                size_type len1 = vector<Ch, A>::elements - pos1;
 
642
 
                size_type slen = Tr::length(s);
 
643
 
                size_type len2 = slen;
 
647
 
                size_type rlen = len1;
 
651
 
                int retval  = Tr::compare(vector<Ch, A>::data + pos1, s, rlen);
 
668
 
template<class Ch,class Tr,class A> _UCXXEXPORT basic_string<Ch,Tr,A>::basic_string(const Ch* s, const A& al)
 
672
 
                size_type temp = Tr::length(s);
 
677
 
template<class Ch,class Tr,class A> _UCXXEXPORT basic_string<Ch,Tr,A>::
 
678
 
        basic_string(const basic_string& str, size_type pos, size_type n, const A& al) 
 
682
 
                __throw_out_of_range();
 
684
 
        size_type rlen = str.size() - pos;
 
689
 
        Tr::copy(vector<Ch, A>::data, str.vector<Ch, A>::data + pos, vector<Ch, A>::elements);
 
692
 
template<class Ch,class Tr,class A> _UCXXEXPORT basic_string<Ch,Tr,A>&
 
693
 
        basic_string<Ch,Tr,A>::operator=(const basic_string<Ch,Tr,A> & str)
 
695
 
        if(&str == this){       //Check if we are doing a=a 
 
698
 
        vector<Ch, A>::clear();
 
699
 
        resize(str.elements);
 
700
 
        Tr::copy( vector<Ch, A>::data, str.vector<Ch, A>::data, str.elements);
 
705
 
template<class Ch,class Tr,class A> _UCXXEXPORT typename basic_string<Ch,Tr,A>::size_type
 
706
 
        basic_string<Ch,Tr,A>::find (const basic_string<Ch,Tr,A>& str, size_type pos) const
 
708
 
        if(str.length() > length()){
 
711
 
        size_type max_string_start = 1 + length() - str.length();
 
712
 
        for(size_type i = pos; i < max_string_start; ++i){
 
713
 
                if(str == substr(i, str.length())){
 
721
 
template<class Ch,class Tr,class A>
 
722
 
        _UCXXEXPORT basic_string<Ch, Tr, A> basic_string<Ch,Tr,A>::substr(size_type pos, size_type n) const
 
724
 
        if(pos > vector<Ch, A>::elements){
 
725
 
                __throw_out_of_range();
 
727
 
        size_type rlen = vector<Ch, A>::elements - pos;
 
731
 
        return basic_string<Ch,Tr,A>(vector<Ch, A>::data + pos,rlen);
 
737
 
#ifdef __UCLIBCXX_EXPAND_STRING_CHAR__
 
738
 
#ifndef __UCLIBCXX_COMPILE_STRING__
 
740
 
#ifdef __UCLIBCXX_EXPAND_CONSTRUCTORS_DESTRUCTORS__
 
742
 
        template <> _UCXXEXPORT string::basic_string(const allocator<char> &);
 
743
 
        template <> _UCXXEXPORT string::basic_string(size_type n, char c, const allocator<char> & );
 
744
 
        template <> _UCXXEXPORT string::basic_string(const char* s, const allocator<char>& al);
 
745
 
        template <> _UCXXEXPORT string::basic_string(const basic_string& str, size_type pos, size_type n, const allocator<char>& al);
 
746
 
        template <> _UCXXEXPORT string::~basic_string();
 
750
 
        template <> _UCXXEXPORT string & string::append(const char * s, size_type n);
 
753
 
        template <> _UCXXEXPORT string::size_type string::find(const string & str, size_type pos) const;
 
754
 
        template <> _UCXXEXPORT string::size_type string::find(const char* s, size_type pos) const;
 
755
 
        template <> _UCXXEXPORT string::size_type string::find (char c, size_type pos) const;
 
757
 
        template <> _UCXXEXPORT string::size_type string::rfind(const string & str, size_type pos) const;
 
758
 
        template <> _UCXXEXPORT string::size_type string::rfind(char c, size_type pos) const;
 
759
 
        template <> _UCXXEXPORT string::size_type string::rfind(const char* s, size_type pos) const;
 
761
 
        template <> _UCXXEXPORT string::size_type string::find_first_of(const string &, size_type) const;
 
762
 
        template <> _UCXXEXPORT string::size_type string::find_first_of(const char *, size_type pos, size_type n) const;
 
763
 
        template <> _UCXXEXPORT string::size_type string::find_first_of(const char*, size_type pos) const;
 
764
 
        template <> _UCXXEXPORT string::size_type string::find_first_of(char c, size_type pos) const;
 
766
 
        template <> _UCXXEXPORT string::size_type string::find_last_of (const string & , size_type pos) const;
 
767
 
        template <> _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos, size_type n) const;
 
768
 
        template <> _UCXXEXPORT string::size_type string::find_last_of (const char* s, size_type pos) const;
 
769
 
        template <> _UCXXEXPORT string::size_type string::find_last_of (char c, size_type pos) const;
 
771
 
        template <> _UCXXEXPORT string::size_type string::find_first_not_of(const string &, size_type) const;
 
772
 
        template <> _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type, size_type) const;
 
773
 
        template <> _UCXXEXPORT string::size_type string::find_first_not_of(const char*, size_type) const;
 
774
 
        template <> _UCXXEXPORT string::size_type string::find_first_not_of(char c, size_type) const;
 
776
 
        template <> _UCXXEXPORT int string::compare(const string & str) const;
 
777
 
        template <> _UCXXEXPORT int string::compare(
 
778
 
                size_type pos1, size_type n1, const string & str, size_type pos2, size_type n2) const;
 
780
 
        template <> _UCXXEXPORT string string::substr(size_type pos, size_type n) const;
 
782
 
        template <> _UCXXEXPORT string & string::operator=(const string & str);
 
783
 
        template <> _UCXXEXPORT string & string::operator=(const char * s);
 
791
 
//typedef basic_string<char> string;
 
793
 
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_string<charT,traits,Allocator> 
 
794
 
        operator+(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
796
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
801
 
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_string<charT,traits,Allocator>
 
802
 
        operator+(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
804
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
810
 
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_string<charT,traits,Allocator>
 
811
 
        operator+(charT lhs, const basic_string<charT,traits,Allocator>& rhs)
 
813
 
        basic_string<charT,traits,Allocator> temp(1, lhs);
 
818
 
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_string<charT,traits,Allocator>
 
819
 
        operator+(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
821
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
826
 
template<class charT, class traits, class Allocator> _UCXXEXPORT basic_string<charT,traits,Allocator>
 
827
 
        operator+(const basic_string<charT,traits,Allocator>& lhs, charT rhs)
 
829
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
834
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
835
 
        operator==(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
837
 
        if(lhs.compare(rhs) == 0){
 
843
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
844
 
        operator==(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
846
 
        if(rhs.compare(lhs) == 0){
 
852
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
853
 
        operator==(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
855
 
        if(lhs.compare(rhs)==0){
 
861
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
862
 
        operator!=(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
864
 
        if(lhs.compare(rhs) !=0){
 
870
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
871
 
        operator!=(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
873
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
874
 
        return (temp != rhs);
 
877
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
878
 
        operator!=(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
880
 
        basic_string<charT,traits,Allocator> temp(rhs);
 
881
 
        return (lhs != temp);
 
884
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
885
 
        operator< (const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
887
 
        if(lhs.compare(rhs) < 0){
 
893
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
894
 
        operator< (const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
896
 
        basic_string<charT,traits,Allocator> temp(rhs);
 
897
 
        if(lhs.compare(rhs) < 0){
 
903
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
904
 
        operator< (const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
906
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
907
 
        if(temp.compare(rhs) < 0){
 
914
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
915
 
        operator> (const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
917
 
        if(lhs.compare(rhs) > 0){
 
923
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
924
 
        operator> (const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
926
 
        basic_string<charT,traits,Allocator> temp(rhs);
 
927
 
        if(lhs.compare(rhs) > 0){
 
933
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
934
 
        operator> (const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
936
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
937
 
        if(temp.compare(rhs) > 0){
 
943
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
944
 
        operator<=(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
946
 
        if(lhs.compare(rhs) <=0){
 
952
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
953
 
        operator<=(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
955
 
        basic_string<charT,traits,Allocator> temp(rhs);
 
956
 
        if(lhs.compare(temp) <=0 ){
 
962
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
963
 
        operator<=(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
965
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
966
 
        if(temp.compare(rhs) <= 0){
 
972
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
973
 
        operator>=(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs)
 
975
 
        if(lhs.compare(rhs) >=0){
 
981
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
982
 
        operator>=(const basic_string<charT,traits,Allocator>& lhs, const charT* rhs)
 
984
 
        basic_string<charT,traits,Allocator> temp(rhs);
 
985
 
        if(lhs.compare(temp) >=0 ){
 
991
 
template<class charT, class traits, class Allocator> _UCXXEXPORT bool 
 
992
 
        operator>=(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs)
 
994
 
        basic_string<charT,traits,Allocator> temp(lhs);
 
995
 
        if(temp.compare(rhs) >=0 ){
 
1001
 
template<class charT, class traits, class Allocator> _UCXXEXPORT void 
 
1002
 
        swap(basic_string<charT,traits,Allocator>& lhs, basic_string<charT,traits,Allocator>& rhs)
 
1007
 
/*template<class charT, class traits, class Allocator> _UCXXEXPORT basic_ostream<charT, traits>&
 
1008
 
        operator<<(basic_ostream<charT, traits>& os, const basic_string<charT,traits,Allocator>& str)
 
1010
 
        return os.write(str.data(), str.length());
 
1013
 
#ifdef __UCLIBCXX_EXPAND_STRING_CHAR__
 
1014
 
#ifndef __UCLIBCXX_COMPILE_STRING__
 
1016
 
//Operators we can avoid duplication of
 
1018
 
template <> _UCXXEXPORT bool operator==(const string & lhs, const string & rhs);
 
1019
 
template <> _UCXXEXPORT bool operator==(const char * lhs, const string & rhs);
 
1020
 
template <> _UCXXEXPORT bool operator==(const string & lhs, const char * rhs);
 
1022
 
template <> _UCXXEXPORT bool operator!=(const string & lhs, const string & rhs);
 
1023
 
template <> _UCXXEXPORT bool operator!=(const char * lhs, const string & rhs);
 
1024
 
template <> _UCXXEXPORT bool operator!=(const string & lhs, const char * rhs);
 
1026
 
template <> _UCXXEXPORT string operator+(const string & lhs, const char* rhs);
 
1027
 
template <> _UCXXEXPORT string operator+(const char* lhs, const string & rhs);
 
1028
 
template <> _UCXXEXPORT string operator+(const string & lhs, const string & rhs);
 
1030
 
template <> _UCXXEXPORT bool operator> (const string & lhs, const string & rhs);
 
1031
 
template <> _UCXXEXPORT bool operator< (const string & lhs, const string & rhs);
 
1040
 
#pragma GCC visibility pop