1*e4b17023SJohn Marino // Versatile string utility -*- C++ -*- 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 4*e4b17023SJohn Marino // Free Software Foundation, Inc. 5*e4b17023SJohn Marino // 6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino // any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino // GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino /** @file ext/vstring_util.h 27*e4b17023SJohn Marino * This is an internal header file, included by other library headers. 28*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{ext/vstring.h} 29*e4b17023SJohn Marino */ 30*e4b17023SJohn Marino 31*e4b17023SJohn Marino #ifndef _VSTRING_UTIL_H 32*e4b17023SJohn Marino #define _VSTRING_UTIL_H 1 33*e4b17023SJohn Marino 34*e4b17023SJohn Marino #pragma GCC system_header 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino #include <ext/vstring_fwd.h> 37*e4b17023SJohn Marino #include <debug/debug.h> 38*e4b17023SJohn Marino #include <bits/stl_function.h> // For less 39*e4b17023SJohn Marino #include <bits/functexcept.h> 40*e4b17023SJohn Marino #include <bits/localefwd.h> 41*e4b17023SJohn Marino #include <bits/ostream_insert.h> 42*e4b17023SJohn Marino #include <bits/stl_iterator.h> 43*e4b17023SJohn Marino #include <ext/numeric_traits.h> 44*e4b17023SJohn Marino #include <bits/move.h> 45*e4b17023SJohn Marino #include <bits/range_access.h> 46*e4b17023SJohn Marino 47*e4b17023SJohn Marino namespace __gnu_cxx _GLIBCXX_VISIBILITY(default) 48*e4b17023SJohn Marino { 49*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 50*e4b17023SJohn Marino 51*e4b17023SJohn Marino template<typename _CharT, typename _Traits, typename _Alloc> 52*e4b17023SJohn Marino struct __vstring_utility 53*e4b17023SJohn Marino { 54*e4b17023SJohn Marino typedef typename _Alloc::template rebind<_CharT>::other _CharT_alloc_type; 55*e4b17023SJohn Marino 56*e4b17023SJohn Marino typedef _Traits traits_type; 57*e4b17023SJohn Marino typedef typename _Traits::char_type value_type; 58*e4b17023SJohn Marino typedef typename _CharT_alloc_type::size_type size_type; 59*e4b17023SJohn Marino typedef typename _CharT_alloc_type::difference_type difference_type; 60*e4b17023SJohn Marino typedef typename _CharT_alloc_type::pointer pointer; 61*e4b17023SJohn Marino typedef typename _CharT_alloc_type::const_pointer const_pointer; 62*e4b17023SJohn Marino 63*e4b17023SJohn Marino // For __sso_string. 64*e4b17023SJohn Marino typedef __gnu_cxx:: 65*e4b17023SJohn Marino __normal_iterator<pointer, __gnu_cxx:: 66*e4b17023SJohn Marino __versa_string<_CharT, _Traits, _Alloc, 67*e4b17023SJohn Marino __sso_string_base> > 68*e4b17023SJohn Marino __sso_iterator; 69*e4b17023SJohn Marino typedef __gnu_cxx:: 70*e4b17023SJohn Marino __normal_iterator<const_pointer, __gnu_cxx:: 71*e4b17023SJohn Marino __versa_string<_CharT, _Traits, _Alloc, 72*e4b17023SJohn Marino __sso_string_base> > 73*e4b17023SJohn Marino __const_sso_iterator; 74*e4b17023SJohn Marino 75*e4b17023SJohn Marino // For __rc_string. 76*e4b17023SJohn Marino typedef __gnu_cxx:: 77*e4b17023SJohn Marino __normal_iterator<pointer, __gnu_cxx:: 78*e4b17023SJohn Marino __versa_string<_CharT, _Traits, _Alloc, 79*e4b17023SJohn Marino __rc_string_base> > 80*e4b17023SJohn Marino __rc_iterator; 81*e4b17023SJohn Marino typedef __gnu_cxx:: 82*e4b17023SJohn Marino __normal_iterator<const_pointer, __gnu_cxx:: 83*e4b17023SJohn Marino __versa_string<_CharT, _Traits, _Alloc, 84*e4b17023SJohn Marino __rc_string_base> > 85*e4b17023SJohn Marino __const_rc_iterator; 86*e4b17023SJohn Marino 87*e4b17023SJohn Marino // NB: When the allocator is empty, deriving from it saves space 88*e4b17023SJohn Marino // (http://www.cantrip.org/emptyopt.html). 89*e4b17023SJohn Marino template<typename _Alloc1> 90*e4b17023SJohn Marino struct _Alloc_hider 91*e4b17023SJohn Marino : public _Alloc1 92*e4b17023SJohn Marino { 93*e4b17023SJohn Marino _Alloc_hider(_CharT* __ptr) 94*e4b17023SJohn Marino : _Alloc1(), _M_p(__ptr) { } 95*e4b17023SJohn Marino 96*e4b17023SJohn Marino _Alloc_hider(const _Alloc1& __a, _CharT* __ptr) 97*e4b17023SJohn Marino : _Alloc1(__a), _M_p(__ptr) { } 98*e4b17023SJohn Marino 99*e4b17023SJohn Marino _CharT* _M_p; // The actual data. 100*e4b17023SJohn Marino }; 101*e4b17023SJohn Marino 102*e4b17023SJohn Marino // When __n = 1 way faster than the general multichar 103*e4b17023SJohn Marino // traits_type::copy/move/assign. 104*e4b17023SJohn Marino static void 105*e4b17023SJohn Marino _S_copy(_CharT* __d, const _CharT* __s, size_type __n) 106*e4b17023SJohn Marino { 107*e4b17023SJohn Marino if (__n == 1) 108*e4b17023SJohn Marino traits_type::assign(*__d, *__s); 109*e4b17023SJohn Marino else 110*e4b17023SJohn Marino traits_type::copy(__d, __s, __n); 111*e4b17023SJohn Marino } 112*e4b17023SJohn Marino 113*e4b17023SJohn Marino static void 114*e4b17023SJohn Marino _S_move(_CharT* __d, const _CharT* __s, size_type __n) 115*e4b17023SJohn Marino { 116*e4b17023SJohn Marino if (__n == 1) 117*e4b17023SJohn Marino traits_type::assign(*__d, *__s); 118*e4b17023SJohn Marino else 119*e4b17023SJohn Marino traits_type::move(__d, __s, __n); 120*e4b17023SJohn Marino } 121*e4b17023SJohn Marino 122*e4b17023SJohn Marino static void 123*e4b17023SJohn Marino _S_assign(_CharT* __d, size_type __n, _CharT __c) 124*e4b17023SJohn Marino { 125*e4b17023SJohn Marino if (__n == 1) 126*e4b17023SJohn Marino traits_type::assign(*__d, __c); 127*e4b17023SJohn Marino else 128*e4b17023SJohn Marino traits_type::assign(__d, __n, __c); 129*e4b17023SJohn Marino } 130*e4b17023SJohn Marino 131*e4b17023SJohn Marino // _S_copy_chars is a separate template to permit specialization 132*e4b17023SJohn Marino // to optimize for the common case of pointers as iterators. 133*e4b17023SJohn Marino template<typename _Iterator> 134*e4b17023SJohn Marino static void 135*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2) 136*e4b17023SJohn Marino { 137*e4b17023SJohn Marino for (; __k1 != __k2; ++__k1, ++__p) 138*e4b17023SJohn Marino traits_type::assign(*__p, *__k1); // These types are off. 139*e4b17023SJohn Marino } 140*e4b17023SJohn Marino 141*e4b17023SJohn Marino static void 142*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, __sso_iterator __k1, __sso_iterator __k2) 143*e4b17023SJohn Marino { _S_copy_chars(__p, __k1.base(), __k2.base()); } 144*e4b17023SJohn Marino 145*e4b17023SJohn Marino static void 146*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, __const_sso_iterator __k1, 147*e4b17023SJohn Marino __const_sso_iterator __k2) 148*e4b17023SJohn Marino { _S_copy_chars(__p, __k1.base(), __k2.base()); } 149*e4b17023SJohn Marino 150*e4b17023SJohn Marino static void 151*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, __rc_iterator __k1, __rc_iterator __k2) 152*e4b17023SJohn Marino { _S_copy_chars(__p, __k1.base(), __k2.base()); } 153*e4b17023SJohn Marino 154*e4b17023SJohn Marino static void 155*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, __const_rc_iterator __k1, 156*e4b17023SJohn Marino __const_rc_iterator __k2) 157*e4b17023SJohn Marino { _S_copy_chars(__p, __k1.base(), __k2.base()); } 158*e4b17023SJohn Marino 159*e4b17023SJohn Marino static void 160*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2) 161*e4b17023SJohn Marino { _S_copy(__p, __k1, __k2 - __k1); } 162*e4b17023SJohn Marino 163*e4b17023SJohn Marino static void 164*e4b17023SJohn Marino _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2) 165*e4b17023SJohn Marino { _S_copy(__p, __k1, __k2 - __k1); } 166*e4b17023SJohn Marino 167*e4b17023SJohn Marino static int 168*e4b17023SJohn Marino _S_compare(size_type __n1, size_type __n2) 169*e4b17023SJohn Marino { 170*e4b17023SJohn Marino const difference_type __d = difference_type(__n1 - __n2); 171*e4b17023SJohn Marino 172*e4b17023SJohn Marino if (__d > __numeric_traits_integer<int>::__max) 173*e4b17023SJohn Marino return __numeric_traits_integer<int>::__max; 174*e4b17023SJohn Marino else if (__d < __numeric_traits_integer<int>::__min) 175*e4b17023SJohn Marino return __numeric_traits_integer<int>::__min; 176*e4b17023SJohn Marino else 177*e4b17023SJohn Marino return int(__d); 178*e4b17023SJohn Marino } 179*e4b17023SJohn Marino }; 180*e4b17023SJohn Marino 181*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 182*e4b17023SJohn Marino } // namespace 183*e4b17023SJohn Marino 184*e4b17023SJohn Marino #endif /* _VSTRING_UTIL_H */ 185