14fee23f9Smrg // Versatile string utility -*- C++ -*-
24fee23f9Smrg
3*b1e83836Smrg // Copyright (C) 2005-2022 Free Software Foundation, Inc.
44fee23f9Smrg //
54fee23f9Smrg // This file is part of the GNU ISO C++ Library. This library is free
64fee23f9Smrg // software; you can redistribute it and/or modify it under the
74fee23f9Smrg // terms of the GNU General Public License as published by the
84fee23f9Smrg // Free Software Foundation; either version 3, or (at your option)
94fee23f9Smrg // any later version.
104fee23f9Smrg
114fee23f9Smrg // This library is distributed in the hope that it will be useful,
124fee23f9Smrg // but WITHOUT ANY WARRANTY; without even the implied warranty of
134fee23f9Smrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
144fee23f9Smrg // GNU General Public License for more details.
154fee23f9Smrg
164fee23f9Smrg // Under Section 7 of GPL version 3, you are granted additional
174fee23f9Smrg // permissions described in the GCC Runtime Library Exception, version
184fee23f9Smrg // 3.1, as published by the Free Software Foundation.
194fee23f9Smrg
204fee23f9Smrg // You should have received a copy of the GNU General Public License and
214fee23f9Smrg // a copy of the GCC Runtime Library Exception along with this program;
224fee23f9Smrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
234fee23f9Smrg // <http://www.gnu.org/licenses/>.
244fee23f9Smrg
254fee23f9Smrg /** @file ext/vstring_util.h
264fee23f9Smrg * This is an internal header file, included by other library headers.
2748fb7bfaSmrg * Do not attempt to use it directly. @headername{ext/vstring.h}
284fee23f9Smrg */
294fee23f9Smrg
304fee23f9Smrg #ifndef _VSTRING_UTIL_H
314fee23f9Smrg #define _VSTRING_UTIL_H 1
324fee23f9Smrg
334fee23f9Smrg #pragma GCC system_header
344fee23f9Smrg
354fee23f9Smrg #include <ext/vstring_fwd.h>
364fee23f9Smrg #include <debug/debug.h>
374fee23f9Smrg #include <bits/stl_function.h> // For less
384fee23f9Smrg #include <bits/functexcept.h>
394fee23f9Smrg #include <bits/localefwd.h>
404fee23f9Smrg #include <bits/ostream_insert.h>
414fee23f9Smrg #include <bits/stl_iterator.h>
424fee23f9Smrg #include <ext/numeric_traits.h>
43fb8a8121Smrg #include <ext/alloc_traits.h>
444fee23f9Smrg #include <bits/move.h>
4548fb7bfaSmrg #include <bits/range_access.h>
464fee23f9Smrg
_GLIBCXX_VISIBILITY(default)4748fb7bfaSmrg namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
4848fb7bfaSmrg {
4948fb7bfaSmrg _GLIBCXX_BEGIN_NAMESPACE_VERSION
504fee23f9Smrg
514fee23f9Smrg template<typename _CharT, typename _Traits, typename _Alloc>
524fee23f9Smrg struct __vstring_utility
534fee23f9Smrg {
54fb8a8121Smrg typedef typename __alloc_traits<_Alloc>::template rebind<_CharT>::other
55fb8a8121Smrg _CharT_alloc_type;
56fb8a8121Smrg typedef __alloc_traits<_CharT_alloc_type> _CharT_alloc_traits;
574fee23f9Smrg
584fee23f9Smrg typedef _Traits traits_type;
594fee23f9Smrg typedef typename _Traits::char_type value_type;
604fee23f9Smrg typedef typename _CharT_alloc_type::size_type size_type;
614fee23f9Smrg typedef typename _CharT_alloc_type::difference_type difference_type;
62fb8a8121Smrg typedef typename _CharT_alloc_traits::pointer pointer;
63fb8a8121Smrg typedef typename _CharT_alloc_traits::const_pointer const_pointer;
644fee23f9Smrg
654fee23f9Smrg // For __sso_string.
664fee23f9Smrg typedef __gnu_cxx::
674fee23f9Smrg __normal_iterator<pointer, __gnu_cxx::
684fee23f9Smrg __versa_string<_CharT, _Traits, _Alloc,
694fee23f9Smrg __sso_string_base> >
704fee23f9Smrg __sso_iterator;
714fee23f9Smrg typedef __gnu_cxx::
724fee23f9Smrg __normal_iterator<const_pointer, __gnu_cxx::
734fee23f9Smrg __versa_string<_CharT, _Traits, _Alloc,
744fee23f9Smrg __sso_string_base> >
754fee23f9Smrg __const_sso_iterator;
764fee23f9Smrg
774fee23f9Smrg // For __rc_string.
784fee23f9Smrg typedef __gnu_cxx::
794fee23f9Smrg __normal_iterator<pointer, __gnu_cxx::
804fee23f9Smrg __versa_string<_CharT, _Traits, _Alloc,
814fee23f9Smrg __rc_string_base> >
824fee23f9Smrg __rc_iterator;
834fee23f9Smrg typedef __gnu_cxx::
844fee23f9Smrg __normal_iterator<const_pointer, __gnu_cxx::
854fee23f9Smrg __versa_string<_CharT, _Traits, _Alloc,
864fee23f9Smrg __rc_string_base> >
874fee23f9Smrg __const_rc_iterator;
884fee23f9Smrg
894fee23f9Smrg // NB: When the allocator is empty, deriving from it saves space
904fee23f9Smrg // (http://www.cantrip.org/emptyopt.html).
914fee23f9Smrg template<typename _Alloc1>
924fee23f9Smrg struct _Alloc_hider
934fee23f9Smrg : public _Alloc1
944fee23f9Smrg {
954fee23f9Smrg _Alloc_hider(_CharT* __ptr)
964fee23f9Smrg : _Alloc1(), _M_p(__ptr) { }
974fee23f9Smrg
984fee23f9Smrg _Alloc_hider(const _Alloc1& __a, _CharT* __ptr)
994fee23f9Smrg : _Alloc1(__a), _M_p(__ptr) { }
1004fee23f9Smrg
1014fee23f9Smrg _CharT* _M_p; // The actual data.
1024fee23f9Smrg };
1034fee23f9Smrg
1044fee23f9Smrg // When __n = 1 way faster than the general multichar
1054fee23f9Smrg // traits_type::copy/move/assign.
1064fee23f9Smrg static void
1074fee23f9Smrg _S_copy(_CharT* __d, const _CharT* __s, size_type __n)
1084fee23f9Smrg {
1094fee23f9Smrg if (__n == 1)
1104fee23f9Smrg traits_type::assign(*__d, *__s);
1114fee23f9Smrg else
1124fee23f9Smrg traits_type::copy(__d, __s, __n);
1134fee23f9Smrg }
1144fee23f9Smrg
1154fee23f9Smrg static void
1164fee23f9Smrg _S_move(_CharT* __d, const _CharT* __s, size_type __n)
1174fee23f9Smrg {
1184fee23f9Smrg if (__n == 1)
1194fee23f9Smrg traits_type::assign(*__d, *__s);
1204fee23f9Smrg else
1214fee23f9Smrg traits_type::move(__d, __s, __n);
1224fee23f9Smrg }
1234fee23f9Smrg
1244fee23f9Smrg static void
1254fee23f9Smrg _S_assign(_CharT* __d, size_type __n, _CharT __c)
1264fee23f9Smrg {
1274fee23f9Smrg if (__n == 1)
1284fee23f9Smrg traits_type::assign(*__d, __c);
1294fee23f9Smrg else
1304fee23f9Smrg traits_type::assign(__d, __n, __c);
1314fee23f9Smrg }
1324fee23f9Smrg
1334fee23f9Smrg // _S_copy_chars is a separate template to permit specialization
1344fee23f9Smrg // to optimize for the common case of pointers as iterators.
1354fee23f9Smrg template<typename _Iterator>
1364fee23f9Smrg static void
1374fee23f9Smrg _S_copy_chars(_CharT* __p, _Iterator __k1, _Iterator __k2)
1384fee23f9Smrg {
1394fee23f9Smrg for (; __k1 != __k2; ++__k1, ++__p)
1404fee23f9Smrg traits_type::assign(*__p, *__k1); // These types are off.
1414fee23f9Smrg }
1424fee23f9Smrg
1434fee23f9Smrg static void
1444fee23f9Smrg _S_copy_chars(_CharT* __p, __sso_iterator __k1, __sso_iterator __k2)
1454fee23f9Smrg { _S_copy_chars(__p, __k1.base(), __k2.base()); }
1464fee23f9Smrg
1474fee23f9Smrg static void
1484fee23f9Smrg _S_copy_chars(_CharT* __p, __const_sso_iterator __k1,
1494fee23f9Smrg __const_sso_iterator __k2)
1504fee23f9Smrg { _S_copy_chars(__p, __k1.base(), __k2.base()); }
1514fee23f9Smrg
1524fee23f9Smrg static void
1534fee23f9Smrg _S_copy_chars(_CharT* __p, __rc_iterator __k1, __rc_iterator __k2)
1544fee23f9Smrg { _S_copy_chars(__p, __k1.base(), __k2.base()); }
1554fee23f9Smrg
1564fee23f9Smrg static void
1574fee23f9Smrg _S_copy_chars(_CharT* __p, __const_rc_iterator __k1,
1584fee23f9Smrg __const_rc_iterator __k2)
1594fee23f9Smrg { _S_copy_chars(__p, __k1.base(), __k2.base()); }
1604fee23f9Smrg
1614fee23f9Smrg static void
1624fee23f9Smrg _S_copy_chars(_CharT* __p, _CharT* __k1, _CharT* __k2)
1634fee23f9Smrg { _S_copy(__p, __k1, __k2 - __k1); }
1644fee23f9Smrg
1654fee23f9Smrg static void
1664fee23f9Smrg _S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
1674fee23f9Smrg { _S_copy(__p, __k1, __k2 - __k1); }
1684fee23f9Smrg
1694fee23f9Smrg static int
1704fee23f9Smrg _S_compare(size_type __n1, size_type __n2)
1714fee23f9Smrg {
1724fee23f9Smrg const difference_type __d = difference_type(__n1 - __n2);
1734fee23f9Smrg
1744fee23f9Smrg if (__d > __numeric_traits_integer<int>::__max)
1754fee23f9Smrg return __numeric_traits_integer<int>::__max;
1764fee23f9Smrg else if (__d < __numeric_traits_integer<int>::__min)
1774fee23f9Smrg return __numeric_traits_integer<int>::__min;
1784fee23f9Smrg else
1794fee23f9Smrg return int(__d);
1804fee23f9Smrg }
1814fee23f9Smrg };
1824fee23f9Smrg
18348fb7bfaSmrg _GLIBCXX_END_NAMESPACE_VERSION
18448fb7bfaSmrg } // namespace
1854fee23f9Smrg
1864fee23f9Smrg #endif /* _VSTRING_UTIL_H */
187