1*f8a1b7d9SAlexander Kabaev // Versatile string utility -*- C++ -*- 2*f8a1b7d9SAlexander Kabaev 3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. 4*f8a1b7d9SAlexander Kabaev // 5*f8a1b7d9SAlexander Kabaev // This file is part of the GNU ISO C++ Library. This library is free 6*f8a1b7d9SAlexander Kabaev // software; you can redistribute it and/or modify it under the 7*f8a1b7d9SAlexander Kabaev // terms of the GNU General Public License as published by the 8*f8a1b7d9SAlexander Kabaev // Free Software Foundation; either version 2, or (at your option) 9*f8a1b7d9SAlexander Kabaev // any later version. 10*f8a1b7d9SAlexander Kabaev 11*f8a1b7d9SAlexander Kabaev // This library is distributed in the hope that it will be useful, 12*f8a1b7d9SAlexander Kabaev // but WITHOUT ANY WARRANTY; without even the implied warranty of 13*f8a1b7d9SAlexander Kabaev // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*f8a1b7d9SAlexander Kabaev // GNU General Public License for more details. 15*f8a1b7d9SAlexander Kabaev 16*f8a1b7d9SAlexander Kabaev // You should have received a copy of the GNU General Public License along 17*f8a1b7d9SAlexander Kabaev // with this library; see the file COPYING. If not, write to the Free 18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19*f8a1b7d9SAlexander Kabaev // USA. 20*f8a1b7d9SAlexander Kabaev 21*f8a1b7d9SAlexander Kabaev // As a special exception, you may use this file as part of a free software 22*f8a1b7d9SAlexander Kabaev // library without restriction. Specifically, if other files instantiate 23*f8a1b7d9SAlexander Kabaev // templates or use macros or inline functions from this file, or you compile 24*f8a1b7d9SAlexander Kabaev // this file and link it with other files to produce an executable, this 25*f8a1b7d9SAlexander Kabaev // file does not by itself cause the resulting executable to be covered by 26*f8a1b7d9SAlexander Kabaev // the GNU General Public License. This exception does not however 27*f8a1b7d9SAlexander Kabaev // invalidate any other reasons why the executable file might be covered by 28*f8a1b7d9SAlexander Kabaev // the GNU General Public License. 29*f8a1b7d9SAlexander Kabaev 30*f8a1b7d9SAlexander Kabaev /** @file ext/vstring_util.h 31*f8a1b7d9SAlexander Kabaev * This file is a GNU extension to the Standard C++ Library. 32*f8a1b7d9SAlexander Kabaev * This is an internal header file, included by other library headers. 33*f8a1b7d9SAlexander Kabaev * You should not attempt to use it directly. 34*f8a1b7d9SAlexander Kabaev */ 35*f8a1b7d9SAlexander Kabaev 36*f8a1b7d9SAlexander Kabaev #ifndef _VSTRING_UTIL_H 37*f8a1b7d9SAlexander Kabaev #define _VSTRING_UTIL_H 1 38*f8a1b7d9SAlexander Kabaev 39*f8a1b7d9SAlexander Kabaev #pragma GCC system_header 40*f8a1b7d9SAlexander Kabaev 41*f8a1b7d9SAlexander Kabaev #include <ext/vstring_fwd.h> 42*f8a1b7d9SAlexander Kabaev #include <debug/debug.h> 43*f8a1b7d9SAlexander Kabaev #include <bits/stl_function.h> // For less 44*f8a1b7d9SAlexander Kabaev #include <bits/functexcept.h> 45*f8a1b7d9SAlexander Kabaev #include <locale> 46*f8a1b7d9SAlexander Kabaev #include <algorithm> // For std::distance, srd::search. 47*f8a1b7d9SAlexander Kabaev #include <bits/ostream_insert.h> 48*f8a1b7d9SAlexander Kabaev 49*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) 50*f8a1b7d9SAlexander Kabaev 51*f8a1b7d9SAlexander Kabaev template<typename _CharT, typename _Traits, typename _Alloc> 52*f8a1b7d9SAlexander Kabaev struct __vstring_utility 53*f8a1b7d9SAlexander Kabaev { 54*f8a1b7d9SAlexander Kabaev typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type; 55*f8a1b7d9SAlexander Kabaev 56*f8a1b7d9SAlexander Kabaev typedef _Traits traits_type; 57*f8a1b7d9SAlexander Kabaev typedef typename _Traits::char_type value_type; 58*f8a1b7d9SAlexander Kabaev typedef typename _CharT_alloc_type::size_type size_type; 59*f8a1b7d9SAlexander Kabaev typedef typename _CharT_alloc_type::pointer pointer; 60*f8a1b7d9SAlexander Kabaev typedef typename _CharT_alloc_type::const_pointer const_pointer; 61*f8a1b7d9SAlexander Kabaev 62*f8a1b7d9SAlexander Kabaev // For __sso_string. 63*f8a1b7d9SAlexander Kabaev typedef __gnu_cxx:: 64*f8a1b7d9SAlexander Kabaev __normal_iterator<pointer, __gnu_cxx:: 65*f8a1b7d9SAlexander Kabaev __versa_string<_CharT, _Traits, _Alloc, 66*f8a1b7d9SAlexander Kabaev __sso_string_base> > 67*f8a1b7d9SAlexander Kabaev __sso_iterator; 68*f8a1b7d9SAlexander Kabaev typedef __gnu_cxx:: 69*f8a1b7d9SAlexander Kabaev __normal_iterator<const_pointer, __gnu_cxx:: 70*f8a1b7d9SAlexander Kabaev __versa_string<_CharT, _Traits, _Alloc, 71*f8a1b7d9SAlexander Kabaev __sso_string_base> > 72*f8a1b7d9SAlexander Kabaev __const_sso_iterator; 73*f8a1b7d9SAlexander Kabaev 74*f8a1b7d9SAlexander Kabaev // For __rc_string. 75*f8a1b7d9SAlexander Kabaev typedef __gnu_cxx:: 76*f8a1b7d9SAlexander Kabaev __normal_iterator<pointer, __gnu_cxx:: 77*f8a1b7d9SAlexander Kabaev __versa_string<_CharT, _Traits, _Alloc, 78*f8a1b7d9SAlexander Kabaev __rc_string_base> > 79*f8a1b7d9SAlexander Kabaev __rc_iterator; 80*f8a1b7d9SAlexander Kabaev typedef __gnu_cxx:: 81*f8a1b7d9SAlexander Kabaev __normal_iterator<const_pointer, __gnu_cxx:: 82*f8a1b7d9SAlexander Kabaev __versa_string<_CharT, _Traits, _Alloc, 83*f8a1b7d9SAlexander Kabaev __rc_string_base> > 84*f8a1b7d9SAlexander Kabaev __const_rc_iterator; 85*f8a1b7d9SAlexander Kabaev 86*f8a1b7d9SAlexander Kabaev // NB: When the allocator is empty, deriving from it saves space 87*f8a1b7d9SAlexander Kabaev // (http://www.cantrip.org/emptyopt.html). 88*f8a1b7d9SAlexander Kabaev template<typename _Alloc1> 89*f8a1b7d9SAlexander Kabaev struct _Alloc_hider 90*f8a1b7d9SAlexander Kabaev : public _Alloc1 91*f8a1b7d9SAlexander Kabaev { _Alloc_hider__vstring_utility::_Alloc_hider92*f8a1b7d9SAlexander Kabaev _Alloc_hider(const _Alloc1& __a, _CharT* __ptr) 93*f8a1b7d9SAlexander Kabaev : _Alloc1(__a), _M_p(__ptr) { } 94*f8a1b7d9SAlexander Kabaev 95*f8a1b7d9SAlexander Kabaev _CharT* _M_p; // The actual data. 96*f8a1b7d9SAlexander Kabaev }; 97*f8a1b7d9SAlexander Kabaev 98*f8a1b7d9SAlexander Kabaev // For use in _M_construct (_S_construct) forward_iterator_tag. 99*f8a1b7d9SAlexander Kabaev template<typename _Type> 100*f8a1b7d9SAlexander Kabaev static bool _S_is_null_pointer__vstring_utility101*f8a1b7d9SAlexander Kabaev _S_is_null_pointer(_Type* __ptr) 102*f8a1b7d9SAlexander Kabaev { return __ptr == 0; } 103*f8a1b7d9SAlexander Kabaev 104*f8a1b7d9SAlexander Kabaev template<typename _Type> 105*f8a1b7d9SAlexander Kabaev static bool _S_is_null_pointer__vstring_utility106*f8a1b7d9SAlexander Kabaev _S_is_null_pointer(_Type) 107*f8a1b7d9SAlexander Kabaev { return false; } 108*f8a1b7d9SAlexander Kabaev 109*f8a1b7d9SAlexander Kabaev // When __n = 1 way faster than the general multichar 110*f8a1b7d9SAlexander Kabaev // traits_type::copy/move/assign. 111*f8a1b7d9SAlexander Kabaev static void _S_copy__vstring_utility112*f8a1b7d9SAlexander Kabaev _S_copy(_CharT* __d, const _CharT* __s, size_type __n) 113*f8a1b7d9SAlexander Kabaev { 114*f8a1b7d9SAlexander Kabaev if (__n == 1) 115*f8a1b7d9SAlexander Kabaev traits_type::assign(*__d, *__s); 116*f8a1b7d9SAlexander Kabaev else 117*f8a1b7d9SAlexander Kabaev traits_type::copy(__d, __s, __n); 118*f8a1b7d9SAlexander Kabaev } 119*f8a1b7d9SAlexander Kabaev 120*f8a1b7d9SAlexander Kabaev static void _S_move__vstring_utility121*f8a1b7d9SAlexander Kabaev _S_move(_CharT* __d, const _CharT* __s, size_type __n) 122*f8a1b7d9SAlexander Kabaev { 123*f8a1b7d9SAlexander Kabaev if (__n == 1) 124*f8a1b7d9SAlexander Kabaev traits_type::assign(*__d, *__s); 125*f8a1b7d9SAlexander Kabaev else 126*f8a1b7d9SAlexander Kabaev traits_type::move(__d, __s, __n); 127*f8a1b7d9SAlexander Kabaev } 128*f8a1b7d9SAlexander Kabaev 129*f8a1b7d9SAlexander Kabaev static void _S_assign__vstring_utility130*f8a1b7d9SAlexander Kabaev _S_assign(_CharT* __d, size_type __n, _CharT __c) 131*f8a1b7d9SAlexander Kabaev { 132*f8a1b7d9SAlexander Kabaev if (__n == 1) 133*f8a1b7d9SAlexander Kabaev traits_type::assign(*__d, __c); 134*f8a1b7d9SAlexander Kabaev else 135*f8a1b7d9SAlexander Kabaev traits_type::assign(__d, __n, __c); 136*f8a1b7d9SAlexander Kabaev } 137*f8a1b7d9SAlexander Kabaev 138*f8a1b7d9SAlexander Kabaev // _S_copy_chars is a separate template to permit specialization 139*f8a1b7d9SAlexander Kabaev // to optimize for the common case of pointers as iterators. 140*f8a1b7d9SAlexander Kabaev template<typename _Iterator> 141*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility142*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2) 143*f8a1b7d9SAlexander Kabaev { 144*f8a1b7d9SAlexander Kabaev for (; __k1 != __k2; ++__k1, ++__p) 145*f8a1b7d9SAlexander Kabaev traits_type::assign(*__p, *__k1); // These types are off. 146*f8a1b7d9SAlexander Kabaev } 147*f8a1b7d9SAlexander Kabaev 148*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility149*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, __sso_iterator __k1, __sso_iterator __k2) 150*f8a1b7d9SAlexander Kabaev { _S_copy_chars(__p, __k1.base(), __k2.base()); } 151*f8a1b7d9SAlexander Kabaev 152*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility153*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, __const_sso_iterator __k1, 154*f8a1b7d9SAlexander Kabaev __const_sso_iterator __k2) 155*f8a1b7d9SAlexander Kabaev { _S_copy_chars(__p, __k1.base(), __k2.base()); } 156*f8a1b7d9SAlexander Kabaev 157*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility158*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, __rc_iterator __k1, __rc_iterator __k2) 159*f8a1b7d9SAlexander Kabaev { _S_copy_chars(__p, __k1.base(), __k2.base()); } 160*f8a1b7d9SAlexander Kabaev 161*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility162*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, __const_rc_iterator __k1, 163*f8a1b7d9SAlexander Kabaev __const_rc_iterator __k2) 164*f8a1b7d9SAlexander Kabaev { _S_copy_chars(__p, __k1.base(), __k2.base()); } 165*f8a1b7d9SAlexander Kabaev 166*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility167*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) 168*f8a1b7d9SAlexander Kabaev { _S_copy(__p, __k1, __k2 - __k1); } 169*f8a1b7d9SAlexander Kabaev 170*f8a1b7d9SAlexander Kabaev static void _S_copy_chars__vstring_utility171*f8a1b7d9SAlexander Kabaev _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2) 172*f8a1b7d9SAlexander Kabaev { _S_copy(__p, __k1, __k2 - __k1); } 173*f8a1b7d9SAlexander Kabaev }; 174*f8a1b7d9SAlexander Kabaev 175*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE 176*f8a1b7d9SAlexander Kabaev 177*f8a1b7d9SAlexander Kabaev #endif /* _VSTRING_UTIL_H */ 178