LCOV - code coverage report
Current view: top level - json - string.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 151 151
Test Date: 2025-12-23 17:21:58 Functions: 100.0 % 100 100

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3              : // Copyright (c) 2020 Krystian Stasiowski (sdkrystian@gmail.com)
       4              : //
       5              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       6              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       7              : //
       8              : // Official repository: https://github.com/boostorg/json
       9              : //
      10              : 
      11              : #ifndef BOOST_JSON_STRING_HPP
      12              : #define BOOST_JSON_STRING_HPP
      13              : 
      14              : #include <boost/json/detail/config.hpp>
      15              : #include <boost/json/pilfer.hpp>
      16              : #include <boost/json/storage_ptr.hpp>
      17              : #include <boost/json/string_view.hpp>
      18              : #include <boost/json/detail/digest.hpp>
      19              : #include <boost/json/detail/except.hpp>
      20              : #include <boost/json/detail/string_impl.hpp>
      21              : #include <boost/json/detail/value.hpp>
      22              : #include <algorithm>
      23              : #include <cstring>
      24              : #include <initializer_list>
      25              : #include <iosfwd>
      26              : #include <iterator>
      27              : #include <limits>
      28              : #include <new>
      29              : #include <type_traits>
      30              : #include <utility>
      31              : 
      32              : namespace boost {
      33              : namespace json {
      34              : 
      35              : class value;
      36              : 
      37              : /** The native type of string values.
      38              : 
      39              :     Instances of string store and manipulate sequences
      40              :     of `char` using the UTF-8 encoding. The elements of
      41              :     a string are stored contiguously. A pointer to any
      42              :     character in a string may be passed to functions
      43              :     that expect a pointer to the first element of a
      44              :     null-terminated `char` array. The type uses small
      45              :     buffer optimisation to avoid allocations for small
      46              :     strings.
      47              : 
      48              :     String iterators are regular `char` pointers.
      49              : 
      50              :     @note `string` member functions do not validate
      51              :     any UTF-8 byte sequences passed to them.
      52              : 
      53              :     @par Thread Safety
      54              : 
      55              :     Non-const member functions may not be called
      56              :     concurrently with any other member functions.
      57              : 
      58              :     @par Satisfies
      59              :         <a href="https://en.cppreference.com/w/cpp/named_req/ContiguousContainer"><em>ContiguousContainer</em></a>,
      60              :         <a href="https://en.cppreference.com/w/cpp/named_req/ReversibleContainer"><em>ReversibleContainer</em></a>, and
      61              :         <a href="https://en.cppreference.com/w/cpp/named_req/SequenceContainer"><em>SequenceContainer</em></a>.
      62              : */
      63              : class string
      64              : {
      65              :     friend class value;
      66              : #ifndef BOOST_JSON_DOCS
      67              :     // VFALCO doc toolchain shouldn't show this but does
      68              :     friend struct detail::access;
      69              : #endif
      70              : 
      71              :     using string_impl = detail::string_impl;
      72              : 
      73              :     inline
      74              :     string(
      75              :         detail::key_t const&,
      76              :         string_view s,
      77              :         storage_ptr sp);
      78              : 
      79              :     inline
      80              :     string(
      81              :         detail::key_t const&,
      82              :         string_view s1,
      83              :         string_view s2,
      84              :         storage_ptr sp);
      85              : 
      86              : public:
      87              :     /// Associated [Allocator](https://en.cppreference.com/w/cpp/named_req/Allocator)
      88              :     using allocator_type = container::pmr::polymorphic_allocator<value>;
      89              : 
      90              :     /// The type of a character
      91              :     using value_type        = char;
      92              : 
      93              :     /// The type used to represent unsigned integers
      94              :     using size_type         = std::size_t;
      95              : 
      96              :     /// The type used to represent signed integers
      97              :     using difference_type   = std::ptrdiff_t;
      98              : 
      99              :     /// A pointer to an element
     100              :     using pointer           = char*;
     101              : 
     102              :     /// A const pointer to an element
     103              :     using const_pointer     = char const*;
     104              : 
     105              :     /// A reference to an element
     106              :     using reference         = char&;
     107              : 
     108              :     /// A const reference to an element
     109              :     using const_reference   = const char&;
     110              : 
     111              :     /// A random access iterator to an element
     112              :     using iterator          = char*;
     113              : 
     114              :     /// A random access const iterator to an element
     115              :     using const_iterator    = char const*;
     116              : 
     117              :     /// A reverse random access iterator to an element
     118              :     using reverse_iterator =
     119              :         std::reverse_iterator<iterator>;
     120              : 
     121              :     /// A reverse random access const iterator to an element
     122              :     using const_reverse_iterator =
     123              :         std::reverse_iterator<const_iterator>;
     124              : 
     125              :     /// A special index
     126              :     static constexpr std::size_t npos =
     127              :         string_view::npos;
     128              : 
     129              : private:
     130              :     template<class T>
     131              :     using is_inputit = typename std::enable_if<
     132              :         std::is_convertible<typename
     133              :             std::iterator_traits<T>::reference,
     134              :             char>::value>::type;
     135              : 
     136              :     storage_ptr sp_; // must come first
     137              :     string_impl impl_;
     138              : 
     139              : public:
     140              :     /** Destructor.
     141              : 
     142              :         Any dynamically allocated internal storage
     143              :         is freed.
     144              : 
     145              :         @par Complexity
     146              :         Constant.
     147              : 
     148              :         @par Exception Safety
     149              :         No-throw guarantee.
     150              :     */
     151        30230 :     ~string() noexcept
     152              :     {
     153        30230 :         impl_.destroy(sp_);
     154        30230 :     }
     155              : 
     156              :     //------------------------------------------------------
     157              :     //
     158              :     // Construction
     159              :     //
     160              :     //------------------------------------------------------
     161              : 
     162              :     /** Default constructor.
     163              : 
     164              :         The string will have a zero size and a non-zero,
     165              :         unspecified capacity, using the [default memory resource].
     166              : 
     167              :         @par Complexity
     168              : 
     169              :         Constant.
     170              : 
     171              :         [default memory resource]: json/allocators/storage_ptr.html#json.allocators.storage_ptr.default_memory_resource
     172              :     */
     173         2023 :     string() = default;
     174              : 
     175              :     /** Pilfer constructor.
     176              : 
     177              :         The string is constructed by acquiring ownership
     178              :         of the contents of `other` using pilfer semantics.
     179              :         This is more efficient than move construction, when
     180              :         it is known that the moved-from object will be
     181              :         immediately destroyed afterwards.
     182              : 
     183              :         @par Complexity
     184              :         Constant.
     185              : 
     186              :         @par Exception Safety
     187              :         No-throw guarantee.
     188              : 
     189              :         @param other The value to pilfer. After pilfer
     190              :         construction, `other` is not in a usable state
     191              :         and may only be destroyed.
     192              : 
     193              :         @see @ref pilfer,
     194              :             <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html">
     195              :                 Valueless Variants Considered Harmful</a>
     196              :     */
     197            5 :     string(pilfered<string> other) noexcept
     198            5 :         : sp_(std::move(other.get().sp_))
     199            5 :         , impl_(other.get().impl_)
     200              :     {
     201            5 :         ::new(&other.get().impl_) string_impl();
     202            5 :     }
     203              : 
     204              :     /** Constructor.
     205              : 
     206              :         The string will have zero size and a non-zero,
     207              :         unspecified capacity, obtained from the specified
     208              :         memory resource.
     209              : 
     210              :         @par Complexity
     211              : 
     212              :         Constant.
     213              : 
     214              :         @param sp A pointer to the `boost::container::pmr::memory_resource` to
     215              :         use. The container will acquire shared ownership of the memory
     216              :         resource.
     217              :     */
     218              :     explicit
     219         9103 :     string(storage_ptr sp)
     220         9103 :         : sp_(std::move(sp))
     221              :     {
     222         9103 :     }
     223              : 
     224              :     /** Constructor.
     225              : 
     226              :         Construct the contents with `count` copies of
     227              :         character `ch`.
     228              : 
     229              :         @par Complexity
     230              : 
     231              :         Linear in `count`.
     232              : 
     233              :         @par Exception Safety
     234              : 
     235              :         Strong guarantee.
     236              :         Calls to `memory_resource::allocate` may throw.
     237              : 
     238              :         @param count The size of the resulting string.
     239              : 
     240              :         @param ch The value to initialize characters
     241              :         of the string with.
     242              : 
     243              :         @param sp An optional pointer to the
     244              :         `boost::container::pmr::memory_resource` to use. The container will
     245              :         acquire shared ownership of the memory resource. The default argument
     246              :         for this parameter is `{}`.
     247              : 
     248              :         @throw `boost::system::system_error` `count > max_size()`.
     249              :     */
     250              :     BOOST_JSON_DECL
     251              :     explicit
     252              :     string(
     253              :         std::size_t count,
     254              :         char ch,
     255              :         storage_ptr sp = {});
     256              : 
     257              :     /** Constructor.
     258              : 
     259              :         Construct the contents with those of the null
     260              :         terminated string pointed to by `s`. The length
     261              :         of the string is determined by the first null
     262              :         character.
     263              : 
     264              :         @par Complexity
     265              : 
     266              :         Linear in `strlen(s)`.
     267              : 
     268              :         @par Exception Safety
     269              : 
     270              :         Strong guarantee.
     271              :         Calls to `memory_resource::allocate` may throw.
     272              : 
     273              :         @param s A pointer to a character string used to
     274              :         copy from.
     275              : 
     276              :         @param sp An optional pointer to the
     277              :         `boost::container::pmr::memory_resource` to use. The container will
     278              :         acquire shared ownership of the memory resource. The default argument
     279              :         for this parameter is `{}`.
     280              : 
     281              :         @throw `boost::system::system_error` `strlen(s) > max_size()`.
     282              :     */
     283              :     BOOST_JSON_DECL
     284              :     string(
     285              :         char const* s,
     286              :         storage_ptr sp = {});
     287              : 
     288              :     /** Constructor.
     289              : 
     290              :         Construct the contents with copies of the
     291              :         characters in the range `{s, s+count)`.
     292              :         This range can contain null characters.
     293              : 
     294              :         @par Complexity
     295              : 
     296              :         Linear in `count`.
     297              : 
     298              :         @par Exception Safety
     299              : 
     300              :         Strong guarantee.
     301              :         Calls to `memory_resource::allocate` may throw.
     302              : 
     303              :         @param count The number of characters to copy.
     304              : 
     305              :         @param s A pointer to a character string used to
     306              :         copy from.
     307              : 
     308              :         @param sp An optional pointer to the
     309              :         `boost::container::pmr::memory_resource` to use. The container will
     310              :         acquire shared ownership of the memory resource. The default argument
     311              :         for this parameter is `{}`.
     312              : 
     313              :         @throw `boost::system::system_error` `count > max_size()`.
     314              :     */
     315              :     BOOST_JSON_DECL
     316              :     explicit
     317              :     string(
     318              :         char const* s,
     319              :         std::size_t count,
     320              :         storage_ptr sp = {});
     321              : 
     322              :     /** Constructor.
     323              : 
     324              :         Construct the contents with copies of characters
     325              :         in the range `{first, last)`.
     326              : 
     327              :         @par Complexity
     328              : 
     329              :         Linear in `std::distance(first, last)`.
     330              : 
     331              :         @par Exception Safety
     332              : 
     333              :         Strong guarantee.
     334              :         Calls to `memory_resource::allocate` may throw.
     335              : 
     336              :         @tparam InputIt The type of the iterators.
     337              : 
     338              :         @par Constraints
     339              : 
     340              :         `InputIt` satisfies __InputIterator__.
     341              : 
     342              :         @param first An input iterator pointing to the
     343              :         first character to insert, or pointing to the
     344              :         end of the range.
     345              : 
     346              :         @param last An input iterator pointing to the end
     347              :         of the range.
     348              : 
     349              :         @param sp An optional pointer to the
     350              :         `boost::container::pmr::memory_resource` to use. The container will
     351              :         acquire shared ownership of the memory resource. The default argument
     352              :         for this parameter is `{}`.
     353              : 
     354              :         @throw `boost::system::system_error` `std::distance(first, last) > max_size()`.
     355              :     */
     356              :     template<class InputIt
     357              :     #ifndef BOOST_JSON_DOCS
     358              :         ,class = is_inputit<InputIt>
     359              :     #endif
     360              :     >
     361              :     explicit
     362              :     string(
     363              :         InputIt first,
     364              :         InputIt last,
     365              :         storage_ptr sp = {});
     366              : 
     367              :     /** Copy constructor.
     368              : 
     369              :         Construct the contents with a copy of `other`.
     370              : 
     371              :         @par Complexity
     372              : 
     373              :         Linear in `other.size()`.
     374              : 
     375              :         @par Exception Safety
     376              : 
     377              :         Strong guarantee.
     378              :         Calls to `memory_resource::allocate` may throw.
     379              : 
     380              :         @param other The string to use as a source
     381              :         to copy from.
     382              :     */
     383              :     BOOST_JSON_DECL
     384              :     string(string const& other);
     385              : 
     386              :     /** Constructor.
     387              : 
     388              :         Construct the contents with a copy of `other`.
     389              : 
     390              :         @par Complexity
     391              : 
     392              :         Linear in `other.size()`.
     393              : 
     394              :         @par Exception Safety
     395              : 
     396              :         Strong guarantee.
     397              :         Calls to `memory_resource::allocate` may throw.
     398              : 
     399              :         @param other The string to use as a source
     400              :         to copy from.
     401              : 
     402              :         @param sp An optional pointer to the
     403              :         `boost::container::pmr::memory_resource` to use. The container will
     404              :         acquire shared ownership of the memory resource. The default argument
     405              :         for this parameter is `{}`.
     406              :     */
     407              :     BOOST_JSON_DECL
     408              :     explicit
     409              :     string(
     410              :         string const& other,
     411              :         storage_ptr sp);
     412              : 
     413              :     /** Move constructor.
     414              : 
     415              :         Constructs the string with the contents of `other` using move
     416              :         semantics. Ownership of the underlying memory is transferred. The
     417              :         container acquires shared ownership of the
     418              :         `boost::container::pmr::memory_resource` used by `other`. After
     419              :         construction, the moved-from string behaves as if newly constructed
     420              :         with its current memory resource.
     421              : 
     422              :         @par Complexity
     423              : 
     424              :         Constant.
     425              : 
     426              :         @param other The string to move
     427              :     */
     428          415 :     string(string&& other) noexcept
     429          415 :         : sp_(other.sp_)
     430          415 :         , impl_(other.impl_)
     431              :     {
     432          415 :         ::new(&other.impl_) string_impl();
     433          415 :     }
     434              : 
     435              :     /** Constructor.
     436              : 
     437              :         Construct the contents with those of `other`
     438              :         using move semantics.
     439              : 
     440              :         @li If `*other.storage() == *sp`, ownership of the underlying memory is
     441              :         transferred in constant time, with no possibility of exceptions. After
     442              :         construction, the moved-from string behaves as if newly constructed
     443              :         with its current `boost::container::pmr::memory_resource`. Otherwise,
     444              : 
     445              :         @li If `*other.storage() != *sp`,
     446              :         a copy of the characters in `other` is made. In
     447              :         this case, the moved-from string is not changed.
     448              : 
     449              :         @par Complexity
     450              : 
     451              :         Constant or linear in `other.size()`.
     452              : 
     453              :         @par Exception Safety
     454              : 
     455              :         Strong guarantee.
     456              :         Calls to `memory_resource::allocate` may throw.
     457              : 
     458              :         @param other The string to assign from.
     459              : 
     460              :         @param sp An optional pointer to the
     461              :         `boost::container::pmr::memory_resource` to use. The container will
     462              :         acquire shared ownership of the memory resource. The default argument
     463              :         for this parameter is `{}`.
     464              :     */
     465              :     BOOST_JSON_DECL
     466              :     explicit
     467              :     string(
     468              :         string&& other,
     469              :         storage_ptr sp);
     470              : 
     471              :     /** Constructor.
     472              : 
     473              :         Construct the contents with those of a
     474              :         string view. This view can contain
     475              :         null characters.
     476              : 
     477              :         @par Complexity
     478              : 
     479              :         Linear in `s.size()`.
     480              : 
     481              :         @par Exception Safety
     482              : 
     483              :         Strong guarantee.
     484              :         Calls to `memory_resource::allocate` may throw.
     485              : 
     486              :         @param s The string view to copy from.
     487              : 
     488              :         @param sp An optional pointer to the
     489              :         `boost::container::pmr::memory_resource` to use. The container will
     490              :         acquire shared ownership of the memory resource. The default argument
     491              :         for this parameter is `{}`.
     492              : 
     493              :         @throw `boost::system::system_error` `std::distance(first, last) > max_size()`.
     494              :     */
     495              :     BOOST_JSON_DECL
     496              :     string(
     497              :         string_view s,
     498              :         storage_ptr sp = {});
     499              : 
     500              :     //------------------------------------------------------
     501              :     //
     502              :     // Assignment
     503              :     //
     504              :     //------------------------------------------------------
     505              : 
     506              :     /** Copy assignment.
     507              : 
     508              :         Replace the contents with a copy of `other`.
     509              : 
     510              :         @par Complexity
     511              : 
     512              :         Linear in `other.size()`.
     513              : 
     514              :         @par Exception Safety
     515              : 
     516              :         Strong guarantee.
     517              :         Calls to `memory_resource::allocate` may throw.
     518              : 
     519              :         @return `*this`
     520              : 
     521              :         @param other The string to use as a source
     522              :         to copy from.
     523              :     */
     524              :     BOOST_JSON_DECL
     525              :     string&
     526              :     operator=(string const& other);
     527              : 
     528              :     /** Move assignment.
     529              : 
     530              :         Replace the contents with those of `other`
     531              :         using move semantics.
     532              : 
     533              :         @li If `&other == this`, do nothing. Otherwise,
     534              : 
     535              :         @li If `*other.storage() == *this->storage()`, ownership of the
     536              :         underlying memory is transferred in constant time, with no possibility
     537              :         of exceptions. After construction, the moved-from string behaves as if
     538              :         newly constructed with its current
     539              :         `boost::container::pmr::memory_resource`. Otherwise,
     540              : 
     541              :         @li a copy of the characters in `other` is made. In
     542              :         this case, the moved-from container is not changed.
     543              : 
     544              :         @par Complexity
     545              : 
     546              :         Constant or linear in `other.size()`.
     547              : 
     548              :         @par Exception Safety
     549              : 
     550              :         Strong guarantee.
     551              :         Calls to `memory_resource::allocate` may throw.
     552              : 
     553              :         @return `*this`
     554              : 
     555              :         @param other The string to use as a source
     556              :         to move from.
     557              :     */
     558              :     BOOST_JSON_DECL
     559              :     string&
     560              :     operator=(string&& other);
     561              : 
     562              :     /** Assign a value to the string.
     563              : 
     564              :         Replaces the contents with those of the null
     565              :         terminated string pointed to by `s`. The length
     566              :         of the string is determined by the first null
     567              :         character.
     568              : 
     569              :         @par Complexity
     570              : 
     571              :         Linear in `std::strlen(s)`.
     572              : 
     573              :         @par Exception Safety
     574              : 
     575              :         Strong guarantee.
     576              :         Calls to `memory_resource::allocate` may throw.
     577              : 
     578              :         @return `*this`
     579              : 
     580              :         @param s The null-terminated character string.
     581              : 
     582              :         @throw `boost::system::system_error` `std::strlen(s) > max_size()`.
     583              :     */
     584              :     BOOST_JSON_DECL
     585              :     string&
     586              :     operator=(char const* s);
     587              : 
     588              :     /** Assign a value to the string.
     589              : 
     590              :         Replaces the contents with those of a
     591              :         string view. This view can contain
     592              :         null characters.
     593              : 
     594              :         @par Complexity
     595              : 
     596              :         Linear in `s.size()`.
     597              : 
     598              :         @par Exception Safety
     599              : 
     600              :         Strong guarantee.
     601              :         Calls to `memory_resource::allocate` may throw.
     602              : 
     603              :         @return `*this`
     604              : 
     605              :         @param s The string view to copy from.
     606              : 
     607              :         @throw `boost::system::system_error` `s.size() > max_size()`.
     608              :     */
     609              :     BOOST_JSON_DECL
     610              :     string&
     611              :     operator=(string_view s);
     612              : 
     613              :     //------------------------------------------------------
     614              : 
     615              :     /** Assign characters to a string.
     616              : 
     617              :         Replace the contents with `count` copies of
     618              :         character `ch`.
     619              : 
     620              :         @par Complexity
     621              : 
     622              :         Linear in `count`.
     623              : 
     624              :         @par Exception Safety
     625              : 
     626              :         Strong guarantee.
     627              :         Calls to `memory_resource::allocate` may throw.
     628              : 
     629              :         @return `*this`
     630              : 
     631              :         @param count The size of the resulting string.
     632              : 
     633              :         @param ch The value to initialize characters
     634              :         of the string with.
     635              : 
     636              :         @throw `boost::system::system_error` `count > max_size()`.
     637              :     */
     638              :     BOOST_JSON_DECL
     639              :     string&
     640              :     assign(
     641              :         std::size_t count,
     642              :         char ch);
     643              : 
     644              :     /** Assign characters to a string.
     645              : 
     646              :         Replace the contents with a copy of `other`.
     647              : 
     648              :         @par Complexity
     649              : 
     650              :         Linear in `other.size()`.
     651              : 
     652              :         @par Exception Safety
     653              : 
     654              :         Strong guarantee.
     655              :         Calls to `memory_resource::allocate` may throw.
     656              : 
     657              :         @return `*this`
     658              : 
     659              :         @param other The string to use as a source
     660              :         to copy from.
     661              :     */
     662              :     BOOST_JSON_DECL
     663              :     string&
     664              :     assign(
     665              :         string const& other);
     666              : 
     667              :     /** Assign characters to a string.
     668              : 
     669              :         Replace the contents with those of `other`
     670              :         using move semantics.
     671              : 
     672              :         @li If `&other == this`, do nothing. Otherwise,
     673              : 
     674              :         @li If `*other.storage() == *this->storage()`, ownership of the
     675              :         underlying memory is transferred in constant time, with no possibility
     676              :         of exceptions. After construction, the moved-from string behaves as if
     677              :         newly constructed with its current
     678              :         `boost::container::pmr::memory_resource`, otherwise
     679              : 
     680              :         @li If `*other.storage() != *this->storage()`,
     681              :         a copy of the characters in `other` is made.
     682              :         In this case, the moved-from container
     683              :         is not changed.
     684              : 
     685              :         @par Complexity
     686              : 
     687              :         Constant or linear in `other.size()`.
     688              : 
     689              :         @par Exception Safety
     690              : 
     691              :         Strong guarantee.
     692              :         Calls to `memory_resource::allocate` may throw.
     693              : 
     694              :         @return `*this`
     695              : 
     696              :         @param other The string to assign from.
     697              :     */
     698              :     BOOST_JSON_DECL
     699              :     string&
     700              :     assign(string&& other);
     701              : 
     702              :     /** Assign characters to a string.
     703              : 
     704              :         Replaces the contents with copies of the
     705              :         characters in the range `{s, s+count)`. This
     706              :         range can contain null characters.
     707              : 
     708              :         @par Complexity
     709              : 
     710              :         Linear in `count`.
     711              : 
     712              :         @par Exception Safety
     713              : 
     714              :         Strong guarantee.
     715              :         Calls to `memory_resource::allocate` may throw.
     716              : 
     717              :         @return `*this`
     718              : 
     719              :         @param count The number of characters to copy.
     720              : 
     721              :         @param s A pointer to a character string used to
     722              :         copy from.
     723              : 
     724              :         @throw `boost::system::system_error` `count > max_size()`.
     725              :     */
     726              :     BOOST_JSON_DECL
     727              :     string&
     728              :     assign(
     729              :         char const* s,
     730              :         std::size_t count);
     731              : 
     732              :     /** Assign characters to a string.
     733              : 
     734              :         Replaces the contents with those of the null
     735              :         terminated string pointed to by `s`. The length
     736              :         of the string is determined by the first null
     737              :         character.
     738              : 
     739              :         @par Complexity
     740              : 
     741              :         Linear in `strlen(s)`.
     742              : 
     743              :         @par Exception Safety
     744              : 
     745              :         Strong guarantee.
     746              : 
     747              :         @note
     748              : 
     749              :         Calls to `memory_resource::allocate` may throw.
     750              : 
     751              :         @return `*this`
     752              : 
     753              :         @param s A pointer to a character string used to
     754              :         copy from.
     755              : 
     756              :         @throw `boost::system::system_error` `strlen(s) > max_size()`.
     757              :     */
     758              :     BOOST_JSON_DECL
     759              :     string&
     760              :     assign(
     761              :         char const* s);
     762              : 
     763              :     /** Assign characters to a string.
     764              : 
     765              :         Replaces the contents with copies of characters
     766              :         in the range `{first, last)`.
     767              : 
     768              :         @par Complexity
     769              : 
     770              :         Linear in `std::distance(first, last)`.
     771              : 
     772              :         @par Exception Safety
     773              : 
     774              :         Strong guarantee.
     775              :         Calls to `memory_resource::allocate` may throw.
     776              : 
     777              :         @tparam InputIt The type of the iterators.
     778              : 
     779              :         @par Constraints
     780              : 
     781              :         `InputIt` satisfies __InputIterator__.
     782              : 
     783              :         @return `*this`
     784              : 
     785              :         @param first An input iterator pointing to the
     786              :         first character to insert, or pointing to the
     787              :         end of the range.
     788              : 
     789              :         @param last An input iterator pointing to the end
     790              :         of the range.
     791              : 
     792              :         @throw `boost::system::system_error` `std::distance(first, last) > max_size()`.
     793              :     */
     794              :     template<class InputIt
     795              :     #ifndef BOOST_JSON_DOCS
     796              :         ,class = is_inputit<InputIt>
     797              :     #endif
     798              :     >
     799              :     string&
     800              :     assign(
     801              :         InputIt first,
     802              :         InputIt last);
     803              : 
     804              :     /** Assign characters to a string.
     805              : 
     806              :         Replaces the contents with those of a
     807              :         string view. This view can contain
     808              :         null characters.
     809              : 
     810              :         @par Complexity
     811              : 
     812              :         Linear in `s.size()`.
     813              : 
     814              :         @par Exception Safety
     815              : 
     816              :         Strong guarantee.
     817              :         Calls to `memory_resource::allocate` may throw.
     818              : 
     819              :         @return `*this`
     820              : 
     821              :         @param s The string view to copy from.
     822              : 
     823              :         @throw `boost::system::system_error` `s.size() > max_size()`.
     824              :     */
     825              :     string&
     826        17970 :     assign(string_view s)
     827              :     {
     828        17970 :         return assign(s.data(), s.size());
     829              :     }
     830              : 
     831              :     //------------------------------------------------------
     832              : 
     833              :     /** Return the associated memory resource.
     834              : 
     835              :         This returns the `boost::container::pmr::memory_resource` used by
     836              :         the container.
     837              : 
     838              :         @par Complexity
     839              : 
     840              :         Constant.
     841              : 
     842              :         @par Exception Safety
     843              : 
     844              :         No-throw guarantee.
     845              :     */
     846              :     storage_ptr const&
     847          116 :     storage() const noexcept
     848              :     {
     849          116 :         return sp_;
     850              :     }
     851              : 
     852              :     /** Return the associated allocator.
     853              : 
     854              :         This function returns an instance of @ref allocator_type constructed
     855              :         from the associated `boost::container::pmr::memory_resource`.
     856              : 
     857              :         @par Complexity
     858              : 
     859              :         Constant.
     860              : 
     861              :         @par Exception Safety
     862              : 
     863              :         No-throw guarantee.
     864              :     */
     865              :     allocator_type
     866            1 :     get_allocator() const noexcept
     867              :     {
     868            1 :         return sp_.get();
     869              :     }
     870              : 
     871              :     //------------------------------------------------------
     872              :     //
     873              :     // Element Access
     874              :     //
     875              :     //------------------------------------------------------
     876              : 
     877              :     /** Return a character with bounds checking.
     878              : 
     879              :         Returns `boost::system::result` containing a reference to the character
     880              :         specified at location `pos`, if `pos` is within the range of the
     881              :         string. Otherwise the result contains an `error_code`.
     882              : 
     883              :         @par Exception Safety
     884              :         Strong guarantee.
     885              : 
     886              :         @param pos A zero-based index to access.
     887              : 
     888              :         @par Complexity
     889              :         Constant.
     890              :     */
     891              :     /** @{ */
     892              :     BOOST_JSON_DECL
     893              :     system::result<char&>
     894              :     try_at(std::size_t pos) noexcept;
     895              : 
     896              :     BOOST_JSON_DECL
     897              :     system::result<char const&>
     898              :     try_at(std::size_t pos) const noexcept;
     899              :     /** @} */
     900              : 
     901              :     /** Return a character with bounds checking.
     902              : 
     903              :         Returns a reference to the character specified at
     904              :         location `pos`.
     905              : 
     906              :         @par Complexity
     907              : 
     908              :         Constant.
     909              : 
     910              :         @par Exception Safety
     911              : 
     912              :         Strong guarantee.
     913              : 
     914              :         @param pos A zero-based index to access.
     915              : 
     916              :         @param loc `source_location` to use in thrown exception; the source
     917              :             location of the call site by default.
     918              : 
     919              :         @throw `boost::system::system_error` `pos >= size()`.
     920              :     */
     921              :     /** @{ */
     922              :     inline
     923              :     char&
     924              :     at(
     925              :         std::size_t pos,
     926              :         source_location const& loc = BOOST_CURRENT_LOCATION);
     927              : 
     928              :     BOOST_JSON_DECL
     929              :     char const&
     930              :     at(
     931              :         std::size_t pos,
     932              :         source_location const& loc = BOOST_CURRENT_LOCATION) const;
     933              :     /** @} */
     934              : 
     935              :     /** Return a character without bounds checking.
     936              : 
     937              :         Returns a reference to the character specified at
     938              :         location `pos`.
     939              : 
     940              :         @par Complexity
     941              : 
     942              :         Constant.
     943              : 
     944              :         @par Precondition
     945              : 
     946              :         @code
     947              :         pos >= size
     948              :         @endcode
     949              : 
     950              :         @param pos A zero-based index to access.
     951              :     */
     952              :     char&
     953           18 :     operator[](std::size_t pos)
     954              :     {
     955           18 :         return impl_.data()[pos];
     956              :     }
     957              : 
     958              :    /**  Return a character without bounds checking.
     959              : 
     960              :         Returns a reference to the character specified at
     961              :         location `pos`.
     962              : 
     963              :         @par Complexity
     964              : 
     965              :         Constant.
     966              : 
     967              :         @par Precondition
     968              : 
     969              :         @code
     970              :         pos >= size
     971              :         @endcode
     972              : 
     973              :         @param pos A zero-based index to access.
     974              :     */
     975              :     const char&
     976            2 :     operator[](std::size_t pos) const
     977              :     {
     978            2 :         return impl_.data()[pos];
     979              :     }
     980              : 
     981              :     /** Return the first character.
     982              : 
     983              :         Returns a reference to the first character.
     984              : 
     985              :         @par Complexity
     986              : 
     987              :         Constant.
     988              : 
     989              :         @par Precondition
     990              : 
     991              :         @code
     992              :         not empty()
     993              :         @endcode
     994              :     */
     995              :     char&
     996           10 :     front()
     997              :     {
     998           10 :         return impl_.data()[0];
     999              :     }
    1000              : 
    1001              :     /** Return the first character.
    1002              : 
    1003              :         Returns a reference to the first character.
    1004              : 
    1005              :         @par Complexity
    1006              : 
    1007              :         Constant.
    1008              : 
    1009              :         @par Precondition
    1010              : 
    1011              :         @code
    1012              :         not empty()
    1013              :         @endcode
    1014              :     */
    1015              :     char const&
    1016            6 :     front() const
    1017              :     {
    1018            6 :         return impl_.data()[0];
    1019              :     }
    1020              : 
    1021              :     /** Return the last character.
    1022              : 
    1023              :         Returns a reference to the last character.
    1024              : 
    1025              :         @par Complexity
    1026              : 
    1027              :         Constant.
    1028              : 
    1029              :         @par Precondition
    1030              : 
    1031              :         @code
    1032              :         not empty()
    1033              :         @endcode
    1034              :     */
    1035              :     char&
    1036           39 :     back()
    1037              :     {
    1038           39 :         return impl_.data()[impl_.size() - 1];
    1039              :     }
    1040              : 
    1041              :     /** Return the last character.
    1042              : 
    1043              :         Returns a reference to the last character.
    1044              : 
    1045              :         @par Complexity
    1046              : 
    1047              :         Constant.
    1048              : 
    1049              :         @par Precondition
    1050              : 
    1051              :         @code
    1052              :         not empty()
    1053              :         @endcode
    1054              :     */
    1055              :     char const&
    1056            6 :     back() const
    1057              :     {
    1058            6 :         return impl_.data()[impl_.size() - 1];
    1059              :     }
    1060              : 
    1061              :     /** Return the underlying character array directly.
    1062              : 
    1063              :         Returns a pointer to the underlying array
    1064              :         serving as storage. The value returned is such that
    1065              :         the range `{data(), data()+size())` is always a
    1066              :         valid range, even if the container is empty.
    1067              : 
    1068              :         @par Complexity
    1069              : 
    1070              :         Constant.
    1071              : 
    1072              :         @note The value returned from
    1073              :         this function is never equal to `nullptr`.
    1074              :     */
    1075              :     char*
    1076        21588 :     data() noexcept
    1077              :     {
    1078        21588 :         return impl_.data();
    1079              :     }
    1080              : 
    1081              :     /** Return the underlying character array directly.
    1082              : 
    1083              :         Returns a pointer to the underlying array
    1084              :         serving as storage.
    1085              : 
    1086              :         @note The value returned is such that
    1087              :         the range `{data(), data() + size())` is always a
    1088              :         valid range, even if the container is empty.
    1089              :         The value returned from
    1090              :         this function is never equal to `nullptr`.
    1091              : 
    1092              :         @par Complexity
    1093              : 
    1094              :         Constant.
    1095              :     */
    1096              :     char const*
    1097        43448 :     data() const noexcept
    1098              :     {
    1099        43448 :         return impl_.data();
    1100              :     }
    1101              : 
    1102              :     /** Return the underlying character array directly.
    1103              : 
    1104              :         Returns a pointer to the underlying array
    1105              :         serving as storage. The value returned is such that
    1106              :         the range `{c_str(), c_str() + size()}` is always a
    1107              :         valid range, even if the container is empty.
    1108              : 
    1109              :         @par Complexity
    1110              : 
    1111              :         Constant.
    1112              : 
    1113              :         @note The value returned from
    1114              :         this function is never equal to `nullptr`.
    1115              :     */
    1116              :     char const*
    1117            4 :     c_str() const noexcept
    1118              :     {
    1119            4 :         return impl_.data();
    1120              :     }
    1121              : 
    1122              :     /** Convert to a @ref string_view referring to the string.
    1123              : 
    1124              :         Returns a string view to the
    1125              :         underlying character string. The size of the view
    1126              :         does not include the null terminator.
    1127              : 
    1128              :         @par Complexity
    1129              : 
    1130              :         Constant.
    1131              :     */
    1132           57 :     operator string_view() const noexcept
    1133              :     {
    1134           57 :         return {data(), size()};
    1135              :     }
    1136              : 
    1137              : #if ! defined(BOOST_NO_CXX17_HDR_STRING_VIEW)
    1138              :     /** Convert to a `std::string_view` referring to the string.
    1139              : 
    1140              :         Returns a string view to the underlying character string. The size of
    1141              :         the view does not include the null terminator.
    1142              : 
    1143              :         This overload is not defined when `BOOST_NO_CXX17_HDR_STRING_VIEW`
    1144              :         is defined.
    1145              : 
    1146              :         @par Complexity
    1147              : 
    1148              :         Constant.
    1149              :     */
    1150              :     operator std::string_view() const noexcept
    1151              :     {
    1152              :         return {data(), size()};
    1153              :     }
    1154              : #endif
    1155              : 
    1156              :     //------------------------------------------------------
    1157              :     //
    1158              :     // Iterators
    1159              :     //
    1160              :     //------------------------------------------------------
    1161              : 
    1162              :     /** Return an iterator to the beginning.
    1163              : 
    1164              :         If the container is empty, @ref end() is returned.
    1165              : 
    1166              :         @par Complexity
    1167              :         Constant.
    1168              : 
    1169              :         @par Exception Safety
    1170              :         No-throw guarantee.
    1171              :     */
    1172              :     iterator
    1173           34 :     begin() noexcept
    1174              :     {
    1175           34 :         return impl_.data();
    1176              :     }
    1177              : 
    1178              :     /** Return an iterator to the beginning.
    1179              : 
    1180              :         If the container is empty, @ref end() is returned.
    1181              : 
    1182              :         @par Complexity
    1183              :         Constant.
    1184              : 
    1185              :         @par Exception Safety
    1186              :         No-throw guarantee.
    1187              :     */
    1188              :     const_iterator
    1189            8 :     begin() const noexcept
    1190              :     {
    1191            8 :         return impl_.data();
    1192              :     }
    1193              : 
    1194              :     /** Return an iterator to the beginning.
    1195              : 
    1196              :         If the container is empty, @ref cend() is returned.
    1197              : 
    1198              :         @par Complexity
    1199              :         Constant.
    1200              : 
    1201              :         @par Exception Safety
    1202              :         No-throw guarantee.
    1203              :     */
    1204              :     const_iterator
    1205            2 :     cbegin() const noexcept
    1206              :     {
    1207            2 :         return impl_.data();
    1208              :     }
    1209              : 
    1210              :     /** Return an iterator to the end.
    1211              : 
    1212              :         Returns an iterator to the character
    1213              :         following the last character of the string.
    1214              :         This character acts as a placeholder, attempting
    1215              :         to access it results in undefined behavior.
    1216              : 
    1217              :         @par Complexity
    1218              :         Constant.
    1219              : 
    1220              :         @par Exception Safety
    1221              :         No-throw guarantee.
    1222              :     */
    1223              :     iterator
    1224            3 :     end() noexcept
    1225              :     {
    1226            3 :         return impl_.end();
    1227              :     }
    1228              : 
    1229              :     /** Return an iterator to the end.
    1230              : 
    1231              :         Returns an iterator to the character following
    1232              :         the last character of the string.
    1233              :         This character acts as a placeholder, attempting
    1234              :         to access it results in undefined behavior.
    1235              : 
    1236              :         @par Complexity
    1237              :         Constant.
    1238              : 
    1239              :         @par Exception Safety
    1240              :         No-throw guarantee.
    1241              :     */
    1242              :     const_iterator
    1243            3 :     end() const noexcept
    1244              :     {
    1245            3 :         return impl_.end();
    1246              :     }
    1247              : 
    1248              :     /** Return an iterator to the end.
    1249              : 
    1250              :         Returns an iterator to the character following
    1251              :         the last character of the string.
    1252              :         This character acts as a placeholder, attempting
    1253              :         to access it results in undefined behavior.
    1254              : 
    1255              :         @par Complexity
    1256              :         Constant.
    1257              : 
    1258              :         @par Exception Safety
    1259              :         No-throw guarantee.
    1260              :     */
    1261              :     const_iterator
    1262            2 :     cend() const noexcept
    1263              :     {
    1264            2 :         return impl_.end();
    1265              :     }
    1266              : 
    1267              :     /** Return a reverse iterator to the first character of the reversed container.
    1268              : 
    1269              :         Returns the pointed-to character that
    1270              :         corresponds to the last character of the
    1271              :         non-reversed container.
    1272              :         If the container is empty, @ref rend() is returned.
    1273              : 
    1274              :         @par Complexity
    1275              :         Constant.
    1276              : 
    1277              :         @par Exception Safety
    1278              :         No-throw guarantee.
    1279              :     */
    1280              :     reverse_iterator
    1281            3 :     rbegin() noexcept
    1282              :     {
    1283            3 :         return reverse_iterator(impl_.end());
    1284              :     }
    1285              : 
    1286              :     /** Return a reverse iterator to the first character of the reversed container.
    1287              : 
    1288              :         Returns the pointed-to character that
    1289              :         corresponds to the last character of the
    1290              :         non-reversed container.
    1291              :         If the container is empty, @ref rend() is returned.
    1292              : 
    1293              :         @par Complexity
    1294              :         Constant.
    1295              : 
    1296              :         @par Exception Safety
    1297              :         No-throw guarantee.
    1298              :     */
    1299              :     const_reverse_iterator
    1300            3 :     rbegin() const noexcept
    1301              :     {
    1302            3 :         return const_reverse_iterator(impl_.end());
    1303              :     }
    1304              : 
    1305              :     /** Return a reverse iterator to the first character of the reversed container.
    1306              : 
    1307              :         Returns the pointed-to character that
    1308              :         corresponds to the last character of the
    1309              :         non-reversed container.
    1310              :         If the container is empty, @ref crend() is returned.
    1311              : 
    1312              :         @par Complexity
    1313              :         Constant.
    1314              : 
    1315              :         @par Exception Safety
    1316              :         No-throw guarantee.
    1317              :     */
    1318              :     const_reverse_iterator
    1319            2 :     crbegin() const noexcept
    1320              :     {
    1321            2 :         return const_reverse_iterator(impl_.end());
    1322              :     }
    1323              : 
    1324              :     /** Return a reverse iterator to the character following the last character of the reversed container.
    1325              : 
    1326              :         Returns the pointed-to character that corresponds
    1327              :         to the character preceding the first character of
    1328              :         the non-reversed container.
    1329              :         This character acts as a placeholder, attempting
    1330              :         to access it results in undefined behavior.
    1331              : 
    1332              :         @par Complexity
    1333              :         Constant.
    1334              : 
    1335              :         @par Exception Safety
    1336              :         No-throw guarantee.
    1337              :     */
    1338              :     reverse_iterator
    1339            3 :     rend() noexcept
    1340              :     {
    1341            3 :         return reverse_iterator(begin());
    1342              :     }
    1343              : 
    1344              :     /** Return a reverse iterator to the character following the last character of the reversed container.
    1345              : 
    1346              :         Returns the pointed-to character that corresponds
    1347              :         to the character preceding the first character of
    1348              :         the non-reversed container.
    1349              :         This character acts as a placeholder, attempting
    1350              :         to access it results in undefined behavior.
    1351              : 
    1352              :         @par Complexity
    1353              :         Constant.
    1354              : 
    1355              :         @par Exception Safety
    1356              :         No-throw guarantee.
    1357              :     */
    1358              :     const_reverse_iterator
    1359            3 :     rend() const noexcept
    1360              :     {
    1361            3 :         return const_reverse_iterator(begin());
    1362              :     }
    1363              : 
    1364              :     /** Return a reverse iterator to the character following the last character of the reversed container.
    1365              : 
    1366              :         Returns the pointed-to character that corresponds
    1367              :         to the character preceding the first character of
    1368              :         the non-reversed container.
    1369              :         This character acts as a placeholder, attempting
    1370              :         to access it results in undefined behavior.
    1371              : 
    1372              :         @par Complexity
    1373              :         Constant.
    1374              : 
    1375              :         @par Exception Safety
    1376              :         No-throw guarantee.
    1377              :     */
    1378              :     const_reverse_iterator
    1379            2 :     crend() const noexcept
    1380              :     {
    1381            2 :         return const_reverse_iterator(begin());
    1382              :     }
    1383              : 
    1384              :     //------------------------------------------------------
    1385              :     //
    1386              :     // Capacity
    1387              :     //
    1388              :     //------------------------------------------------------
    1389              : 
    1390              :     /** Check if the string has no characters.
    1391              : 
    1392              :         Returns `true` if there are no characters in
    1393              :         the string, i.e. @ref size() returns 0.
    1394              : 
    1395              :         @par Complexity
    1396              : 
    1397              :         Constant.
    1398              :     */
    1399              :     bool
    1400           69 :     empty() const noexcept
    1401              :     {
    1402           69 :         return impl_.size() == 0;
    1403              :     }
    1404              : 
    1405              :     /** Return the number of characters in the string.
    1406              : 
    1407              :         The value returned does not include the
    1408              :         null terminator, which is always present.
    1409              : 
    1410              :         @par Complexity
    1411              : 
    1412              :         Constant.
    1413              :     */
    1414              :     std::size_t
    1415        46949 :     size() const noexcept
    1416              :     {
    1417        46949 :         return impl_.size();
    1418              :     }
    1419              : 
    1420              :     /** Return the maximum number of characters any string can hold.
    1421              : 
    1422              :         The maximum is an implementation-defined number.
    1423              :         This value is a theoretical limit; at runtime,
    1424              :         the actual maximum size may be less due to
    1425              :         resource limits.
    1426              : 
    1427              :         @par Complexity
    1428              : 
    1429              :         Constant.
    1430              :     */
    1431              :     static
    1432              :     constexpr
    1433              :     std::size_t
    1434         7778 :     max_size() noexcept
    1435              :     {
    1436         7778 :         return string_impl::max_size();
    1437              :     }
    1438              : 
    1439              :     /** Return the number of characters that can be held without a reallocation.
    1440              : 
    1441              :         This number represents the largest number of
    1442              :         characters the currently allocated storage can contain.
    1443              :         This number may be larger than the value returned
    1444              :         by @ref size().
    1445              : 
    1446              :         @par Complexity
    1447              : 
    1448              :         Constant.
    1449              :     */
    1450              :     std::size_t
    1451        11246 :     capacity() const noexcept
    1452              :     {
    1453        11246 :         return impl_.capacity();
    1454              :     }
    1455              : 
    1456              :     /** Increase the capacity to at least a certain amount.
    1457              : 
    1458              :         This increases the capacity of the array to a value
    1459              :         that is greater than or equal to `new_capacity`. If
    1460              :         `new_capacity > capacity()`, new memory is
    1461              :         allocated. Otherwise, the call has no effect.
    1462              :         The number of elements and therefore the
    1463              :         @ref size() of the container is not changed.
    1464              : 
    1465              :         @par Complexity
    1466              : 
    1467              :         At most, linear in @ref size().
    1468              : 
    1469              :         @par Exception Safety
    1470              : 
    1471              :         Strong guarantee.
    1472              :         Calls to `memory_resource::allocate` may throw.
    1473              : 
    1474              :         @note
    1475              : 
    1476              :         If new memory is allocated, all iterators including
    1477              :         any past-the-end iterators, and all references to
    1478              :         the elements are invalidated. Otherwise, no
    1479              :         iterators or references are invalidated.
    1480              : 
    1481              :         @param new_capacity The new capacity of the array.
    1482              : 
    1483              :         @throw `boost::system::system_error` `new_capacity > max_size()`.
    1484              :     */
    1485              :     void
    1486        10949 :     reserve(std::size_t new_capacity)
    1487              :     {
    1488        10949 :         if(new_capacity <= capacity())
    1489         1433 :             return;
    1490         9516 :         reserve_impl(new_capacity);
    1491              :     }
    1492              : 
    1493              :     /** Request the removal of unused capacity.
    1494              : 
    1495              :         This performs a non-binding request to reduce
    1496              :         @ref capacity() to @ref size(). The request may
    1497              :         or may not be fulfilled.
    1498              : 
    1499              :         @par Complexity
    1500              : 
    1501              :         At most, linear in @ref size().
    1502              : 
    1503              :         @note If reallocation occurs, all iterators
    1504              :         including  any past-the-end iterators, and all
    1505              :         references to characters are invalidated.
    1506              :         Otherwise, no iterators or references are
    1507              :         invalidated.
    1508              :     */
    1509              :     BOOST_JSON_DECL
    1510              :     void
    1511              :     shrink_to_fit();
    1512              : 
    1513              :     //------------------------------------------------------
    1514              :     //
    1515              :     // Operations
    1516              :     //
    1517              :     //------------------------------------------------------
    1518              : 
    1519              :     /** Clear the contents.
    1520              : 
    1521              :         Erases all characters from the string. After this
    1522              :         call, @ref size() returns zero but @ref capacity()
    1523              :         is unchanged.
    1524              : 
    1525              :         @par Complexity
    1526              : 
    1527              :         Linear in @ref size().
    1528              : 
    1529              :         @note All references, pointers, or iterators
    1530              :         referring to contained elements are invalidated.
    1531              :         Any past-the-end iterators are also invalidated.
    1532              :     */
    1533              :     BOOST_JSON_DECL
    1534              :     void
    1535              :     clear() noexcept;
    1536              : 
    1537              :     //------------------------------------------------------
    1538              : 
    1539              :     /** Insert a string.
    1540              : 
    1541              :         Inserts the `string_view` `sv` at the position `pos`.
    1542              : 
    1543              :         @par Exception Safety
    1544              : 
    1545              :         Strong guarantee.
    1546              : 
    1547              :         @note All references, pointers, or iterators
    1548              :         referring to contained elements are invalidated.
    1549              :         Any past-the-end iterators are also invalidated.
    1550              : 
    1551              :         @return `*this`
    1552              : 
    1553              :         @param pos The index to insert at.
    1554              : 
    1555              :         @param sv The `string_view` to insert.
    1556              : 
    1557              :         @throw `boost::system::system_error` `size() + s.size() > max_size()`.
    1558              :         @throw `boost::system::system_error` `pos > size()`.
    1559              :     */
    1560              :     BOOST_JSON_DECL
    1561              :     string&
    1562              :     insert(
    1563              :         std::size_t pos,
    1564              :         string_view sv);
    1565              : 
    1566              :     /** Insert a character.
    1567              : 
    1568              :         Inserts `count` copies of `ch` at the position `pos`.
    1569              : 
    1570              :         @par Exception Safety
    1571              : 
    1572              :         Strong guarantee.
    1573              : 
    1574              :         @note All references, pointers, or iterators
    1575              :         referring to contained elements are invalidated.
    1576              :         Any past-the-end iterators are also invalidated.
    1577              : 
    1578              :         @return `*this`
    1579              : 
    1580              :         @param pos The index to insert at.
    1581              : 
    1582              :         @param count The number of characters to insert.
    1583              : 
    1584              :         @param ch The character to insert.
    1585              : 
    1586              :         @throw `boost::system::system_error` `size() + count > max_size()`.
    1587              :         @throw `boost::system::system_error` `pos > size()`.
    1588              :     */
    1589              :     BOOST_JSON_DECL
    1590              :     string&
    1591              :     insert(
    1592              :         std::size_t pos,
    1593              :         std::size_t count,
    1594              :         char ch);
    1595              : 
    1596              :     /** Insert a character.
    1597              : 
    1598              :         Inserts the character `ch` before the character
    1599              :         at index `pos`.
    1600              : 
    1601              :         @par Exception Safety
    1602              : 
    1603              :         Strong guarantee.
    1604              : 
    1605              :         @note All references, pointers, or iterators
    1606              :         referring to contained elements are invalidated.
    1607              :         Any past-the-end iterators are also invalidated.
    1608              : 
    1609              :         @return `*this`
    1610              : 
    1611              :         @param pos The index to insert at.
    1612              : 
    1613              :         @param ch The character to insert.
    1614              : 
    1615              :         @throw `boost::system::system_error` `size() + 1 > max_size()`.
    1616              :         @throw `boost::system::system_error` `pos > size()`.
    1617              :     */
    1618              :     string&
    1619            3 :     insert(
    1620              :         size_type pos,
    1621              :         char ch)
    1622              :     {
    1623            3 :         return insert(pos, 1, ch);
    1624              :     }
    1625              : 
    1626              :     /** Insert a range of characters.
    1627              : 
    1628              :         Inserts characters from the range `{first, last)`
    1629              :         before the character at index `pos`.
    1630              : 
    1631              :         @par Precondition
    1632              : 
    1633              :         `{first, last)` is a valid range.
    1634              : 
    1635              :         @par Exception Safety
    1636              : 
    1637              :         Strong guarantee.
    1638              : 
    1639              :         @note All references, pointers, or iterators
    1640              :         referring to contained elements are invalidated.
    1641              :         Any past-the-end iterators are also invalidated.
    1642              : 
    1643              :         @tparam InputIt The type of the iterators.
    1644              : 
    1645              :         @par Constraints
    1646              : 
    1647              :         `InputIt` satisfies __InputIterator__.
    1648              : 
    1649              :         @return `*this`
    1650              : 
    1651              :         @param pos The index to insert at.
    1652              : 
    1653              :         @param first The beginning of the character range.
    1654              : 
    1655              :         @param last The end of the character range.
    1656              : 
    1657              :         @throw `boost::system::system_error` `size() + insert_count > max_size()`.
    1658              :         @throw `boost::system::system_error` `pos > size()`.
    1659              :     */
    1660              :     template<class InputIt
    1661              :     #ifndef BOOST_JSON_DOCS
    1662              :         ,class = is_inputit<InputIt>
    1663              :     #endif
    1664              :     >
    1665              :     string&
    1666              :     insert(
    1667              :         size_type pos,
    1668              :         InputIt first,
    1669              :         InputIt last);
    1670              : 
    1671              :     //------------------------------------------------------
    1672              : 
    1673              :     /** Erase characters from the string.
    1674              : 
    1675              :         Erases `num` characters from the string, starting
    1676              :         at `pos`.  `num` is determined as the smaller of
    1677              :         `count` and `size() - pos`.
    1678              : 
    1679              :         @par Exception Safety
    1680              : 
    1681              :         Strong guarantee.
    1682              : 
    1683              :         @note All references, pointers, or iterators
    1684              :         referring to contained elements are invalidated.
    1685              :         Any past-the-end iterators are also invalidated.
    1686              : 
    1687              :         @return `*this`
    1688              : 
    1689              :         @param pos The index to erase at.
    1690              :         The default argument for this parameter is `0`.
    1691              : 
    1692              :         @param count The number of characters to erase.
    1693              :         The default argument for this parameter
    1694              :         is @ref npos.
    1695              : 
    1696              :         @throw `boost::system::system_error` `pos > size()`.
    1697              :     */
    1698              :     BOOST_JSON_DECL
    1699              :     string&
    1700              :     erase(
    1701              :         std::size_t pos = 0,
    1702              :         std::size_t count = npos);
    1703              : 
    1704              :     /** Erase a character from the string.
    1705              : 
    1706              :         Erases the character at `pos`.
    1707              : 
    1708              :         @par Precondition
    1709              : 
    1710              :         @code
    1711              :         pos >= data() && pos <= data() + size()
    1712              :         @endcode
    1713              : 
    1714              :         @par Exception Safety
    1715              : 
    1716              :         Strong guarantee.
    1717              : 
    1718              :         @note All references, pointers, or iterators
    1719              :         referring to contained elements are invalidated.
    1720              :         Any past-the-end iterators are also invalidated.
    1721              : 
    1722              :         @return An iterator referring to character
    1723              :         immediately following the erased character, or
    1724              :         @ref end() if one does not exist.
    1725              : 
    1726              :         @param pos An iterator referring to the
    1727              :         character to erase.
    1728              :     */
    1729              :     BOOST_JSON_DECL
    1730              :     iterator
    1731              :     erase(const_iterator pos);
    1732              : 
    1733              :     /** Erase a range from the string.
    1734              : 
    1735              :         Erases the characters in the range `{first, last)`.
    1736              : 
    1737              :         @par Precondition
    1738              : 
    1739              :         `{first, last}` shall be valid within
    1740              :         @code
    1741              :         {data(), data() + size()}
    1742              :         @endcode
    1743              : 
    1744              :         @par Exception Safety
    1745              : 
    1746              :         Strong guarantee.
    1747              : 
    1748              :         @note All references, pointers, or iterators
    1749              :         referring to contained elements are invalidated.
    1750              :         Any past-the-end iterators are also invalidated.
    1751              : 
    1752              :         @return An iterator referring to the character
    1753              :         `last` previously referred to, or @ref end()
    1754              :         if one does not exist.
    1755              : 
    1756              :         @param first An iterator representing the first
    1757              :         character to erase.
    1758              : 
    1759              :         @param last An iterator one past the last
    1760              :         character to erase.
    1761              :     */
    1762              :     BOOST_JSON_DECL
    1763              :     iterator
    1764              :     erase(
    1765              :         const_iterator first,
    1766              :         const_iterator last);
    1767              : 
    1768              :     //------------------------------------------------------
    1769              : 
    1770              :     /** Append a character.
    1771              : 
    1772              :         Appends a character to the end of the string.
    1773              : 
    1774              :         @par Exception Safety
    1775              : 
    1776              :         Strong guarantee.
    1777              : 
    1778              :         @param ch The character to append.
    1779              : 
    1780              :         @throw `boost::system::system_error` `size() + 1 > max_size()`.
    1781              :     */
    1782              :     BOOST_JSON_DECL
    1783              :     void
    1784              :     push_back(char ch);
    1785              : 
    1786              :     /** Remove the last character.
    1787              : 
    1788              :         Removes a character from the end of the string.
    1789              : 
    1790              :         @par Precondition
    1791              : 
    1792              :         @code
    1793              :         not empty()
    1794              :         @endcode
    1795              :     */
    1796              :     BOOST_JSON_DECL
    1797              :     void
    1798              :     pop_back();
    1799              : 
    1800              :     //------------------------------------------------------
    1801              : 
    1802              :     /** Append characters to the string.
    1803              : 
    1804              :         Appends `count` copies of `ch` to the end of
    1805              :         the string.
    1806              : 
    1807              :         @par Exception Safety
    1808              : 
    1809              :         Strong guarantee.
    1810              : 
    1811              :         @return `*this`
    1812              : 
    1813              :         @param count The number of characters to append.
    1814              : 
    1815              :         @param ch The character to append.
    1816              : 
    1817              :         @throw `boost::system::system_error` `size() + count > max_size()`.
    1818              :     */
    1819              :     BOOST_JSON_DECL
    1820              :     string&
    1821              :     append(
    1822              :         std::size_t count,
    1823              :         char ch);
    1824              : 
    1825              :     /** Append a string to the string.
    1826              : 
    1827              :         Appends `sv` the end of the string.
    1828              : 
    1829              :         @par Exception Safety
    1830              : 
    1831              :         Strong guarantee.
    1832              : 
    1833              :         @return `*this`
    1834              : 
    1835              :         @param sv The `string_view` to append.
    1836              : 
    1837              :         @throw `boost::system::system_error` `size() + s.size() > max_size()`.
    1838              :     */
    1839              :     BOOST_JSON_DECL
    1840              :     string&
    1841              :     append(string_view sv);
    1842              : 
    1843              :     /** Append a range of characters.
    1844              : 
    1845              :         Appends characters from the range `{first, last)`
    1846              :         to the end of the string.
    1847              : 
    1848              :         @par Precondition
    1849              : 
    1850              :         `{first, last)` shall be a valid range
    1851              : 
    1852              :         @par Exception Safety
    1853              : 
    1854              :         Strong guarantee.
    1855              : 
    1856              :         @tparam InputIt The type of the iterators.
    1857              : 
    1858              :         @par Constraints
    1859              : 
    1860              :         `InputIt` satisfies __InputIterator__.
    1861              : 
    1862              :         @return `*this`
    1863              : 
    1864              :         @param first An iterator representing the
    1865              :         first character to append.
    1866              : 
    1867              :         @param last An iterator one past the
    1868              :         last character to append.
    1869              : 
    1870              :         @throw `boost::system::system_error` `size() + insert_count > max_size()`.
    1871              :     */
    1872              :     template<class InputIt
    1873              :     #ifndef BOOST_JSON_DOCS
    1874              :         ,class = is_inputit<InputIt>
    1875              :     #endif
    1876              :     >
    1877              :     string&
    1878              :     append(InputIt first, InputIt last);
    1879              : 
    1880              :     //------------------------------------------------------
    1881              : 
    1882              :     /** Append characters from a string.
    1883              : 
    1884              :         Appends `{sv.begin(), sv.end())` to the end of
    1885              :         the string.
    1886              : 
    1887              :         @par Exception Safety
    1888              : 
    1889              :         Strong guarantee.
    1890              : 
    1891              :         @return `*this`
    1892              : 
    1893              :         @param sv The `string_view` to append.
    1894              : 
    1895              :         @throw `boost::system::system_error` `size() + sv.size() > max_size()`.
    1896              :     */
    1897              :     string&
    1898           11 :     operator+=(string_view sv)
    1899              :     {
    1900           11 :         return append(sv);
    1901              :     }
    1902              : 
    1903              :     /** Append a character.
    1904              : 
    1905              :         Appends a character to the end of the string.
    1906              : 
    1907              :         @par Exception Safety
    1908              : 
    1909              :         Strong guarantee.
    1910              : 
    1911              :         @param ch The character to append.
    1912              : 
    1913              :         @throw `boost::system::system_error` `size() + 1 > max_size()`.
    1914              :     */
    1915              :     string&
    1916           44 :     operator+=(char ch)
    1917              :     {
    1918           44 :         push_back(ch);
    1919           43 :         return *this;
    1920              :     }
    1921              : 
    1922              :     //------------------------------------------------------
    1923              : 
    1924              :     /** Compare a string with the string.
    1925              : 
    1926              :         Let `comp` be
    1927              :         `std::char_traits<char>::compare(data(), sv.data(), std::min(size(), sv.size())`.
    1928              :         If `comp != 0`, then the result is `comp`. Otherwise,
    1929              :         the result is `0` if `size() == sv.size()`,
    1930              :         `-1` if `size() < sv.size()`, and `1` otherwise.
    1931              : 
    1932              :         @par Complexity
    1933              : 
    1934              :         Linear.
    1935              : 
    1936              :         @return The result of lexicographically comparing
    1937              :         the characters of `sv` and the string.
    1938              : 
    1939              :         @param sv The `string_view` to compare.
    1940              :     */
    1941              :     int
    1942           13 :     compare(string_view sv) const noexcept
    1943              :     {
    1944           13 :         return subview().compare(sv);
    1945              :     }
    1946              : 
    1947              :     //------------------------------------------------------
    1948              : 
    1949              :     /** Return whether the string begins with a string.
    1950              : 
    1951              :         Returns `true` if the string begins with `s`,
    1952              :         and `false` otherwise.
    1953              : 
    1954              :         @par Complexity
    1955              : 
    1956              :         Linear.
    1957              : 
    1958              :         @param s The `string_view` to check for.
    1959              :     */
    1960              :     bool
    1961            8 :     starts_with(string_view s) const noexcept
    1962              :     {
    1963            8 :         return subview(0, s.size()) == s;
    1964              :     }
    1965              : 
    1966              :     /** Return whether the string begins with a character.
    1967              : 
    1968              :         Returns `true` if the string begins with `ch`,
    1969              :         and `false` otherwise.
    1970              : 
    1971              :         @par Complexity
    1972              : 
    1973              :         Constant.
    1974              : 
    1975              :         @param ch The character to check for.
    1976              :     */
    1977              :     bool
    1978            4 :     starts_with(char ch) const noexcept
    1979              :     {
    1980            4 :         return ! empty() && front() == ch;
    1981              :     }
    1982              : 
    1983              :     /** Return whether the string end with a string.
    1984              : 
    1985              :         Returns `true` if the string end with `s`,
    1986              :         and `false` otherwise.
    1987              : 
    1988              :         @par Complexity
    1989              : 
    1990              :         Linear.
    1991              : 
    1992              :         @param s The string to check for.
    1993              :     */
    1994              :     bool
    1995            8 :     ends_with(string_view s) const noexcept
    1996              :     {
    1997           16 :         return size() >= s.size() &&
    1998           16 :             subview(size() - s.size()) == s;
    1999              :     }
    2000              : 
    2001              :     /** Return whether the string ends with a character.
    2002              : 
    2003              :         Returns `true` if the string ends with `ch`,
    2004              :         and `false` otherwise.
    2005              : 
    2006              :         @par Complexity
    2007              : 
    2008              :         Constant.
    2009              : 
    2010              :         @param ch The character to check for.
    2011              :     */
    2012              :     bool
    2013            4 :     ends_with(char ch) const noexcept
    2014              :     {
    2015            4 :         return ! empty() && back() == ch;
    2016              :     }
    2017              : 
    2018              :     //------------------------------------------------------
    2019              : 
    2020              :     /** Replace a substring with a string.
    2021              : 
    2022              :         Replaces `rcount` characters starting at index
    2023              :         `pos` with those of `sv`, where `rcount` is
    2024              :         `std::min(count, size() - pos)`.
    2025              : 
    2026              :         @par Exception Safety
    2027              : 
    2028              :         Strong guarantee.
    2029              : 
    2030              :         @note All references, pointers, or iterators
    2031              :         referring to contained elements are invalidated.
    2032              :         Any past-the-end iterators are also invalidated.
    2033              : 
    2034              :         @return `*this`
    2035              : 
    2036              :         @param pos The index to replace at.
    2037              : 
    2038              :         @param count The number of characters to replace.
    2039              : 
    2040              :         @param sv The `string_view` to replace with.
    2041              : 
    2042              :         @throw `boost::system::system_error` `size() + (sv.size() - rcount) > max_size()`.
    2043              :         @throw `boost::system::system_error` `pos > size()`.
    2044              :     */
    2045              :     BOOST_JSON_DECL
    2046              :     string&
    2047              :     replace(
    2048              :         std::size_t pos,
    2049              :         std::size_t count,
    2050              :         string_view sv);
    2051              : 
    2052              :     /** Replace a range with a string.
    2053              : 
    2054              :         Replaces the characters in the range
    2055              :         `{first, last)` with those of `sv`.
    2056              : 
    2057              :         @par Precondition
    2058              : 
    2059              :         `{first, last)` is a valid range.
    2060              : 
    2061              :         @par Exception Safety
    2062              : 
    2063              :         Strong guarantee.
    2064              : 
    2065              :         @note All references, pointers, or iterators
    2066              :         referring to contained elements are invalidated.
    2067              :         Any past-the-end iterators are also invalidated.
    2068              : 
    2069              :         @return `*this`
    2070              : 
    2071              :         @param first An iterator referring to the first
    2072              :         character to replace.
    2073              : 
    2074              :         @param last An iterator one past the end of
    2075              :         the last character to replace.
    2076              : 
    2077              :         @param sv The `string_view` to replace with.
    2078              : 
    2079              :         @throw `boost::system::system_error` `size() + (sv.size() - std::distance(first, last)) > max_size()`.
    2080              :     */
    2081              :     string&
    2082            6 :     replace(
    2083              :         const_iterator first,
    2084              :         const_iterator last,
    2085              :         string_view sv)
    2086              :     {
    2087            6 :         return replace(first - begin(), last - first, sv);
    2088              :     }
    2089              : 
    2090              :     /** Replace a range with a range.
    2091              : 
    2092              :         Replaces the characters in the range
    2093              :         `{first, last)` with those of `{first2, last2)`.
    2094              : 
    2095              :         @par Precondition
    2096              : 
    2097              :         `{first, last)` is a valid range.
    2098              : 
    2099              :         `{first2, last2)` is a valid range.
    2100              : 
    2101              :         @par Exception Safety
    2102              : 
    2103              :         Strong guarantee.
    2104              : 
    2105              :         @note All references, pointers, or iterators
    2106              :         referring to contained elements are invalidated.
    2107              :         Any past-the-end iterators are also invalidated.
    2108              : 
    2109              :         @tparam InputIt The type of the iterators.
    2110              : 
    2111              :         @par Constraints
    2112              : 
    2113              :         `InputIt` satisfies __InputIterator__.
    2114              : 
    2115              :         @return `*this`
    2116              : 
    2117              :         @param first An iterator referring to the first
    2118              :         character to replace.
    2119              : 
    2120              :         @param last An iterator one past the end of
    2121              :         the last character to replace.
    2122              : 
    2123              :         @param first2 An iterator referring to the first
    2124              :         character to replace with.
    2125              : 
    2126              :         @param last2 An iterator one past the end of
    2127              :         the last character to replace with.
    2128              : 
    2129              :         @throw `boost::system::system_error` `size() + (inserted - std::distance(first, last)) > max_size()`.
    2130              :     */
    2131              :     template<class InputIt
    2132              :     #ifndef BOOST_JSON_DOCS
    2133              :         ,class = is_inputit<InputIt>
    2134              :     #endif
    2135              :     >
    2136              :     string&
    2137              :     replace(
    2138              :         const_iterator first,
    2139              :         const_iterator last,
    2140              :         InputIt first2,
    2141              :         InputIt last2);
    2142              : 
    2143              :     /** Replace a substring with copies of a character.
    2144              : 
    2145              :         Replaces `rcount` characters starting at index
    2146              :         `pos`with `count2` copies of `ch`, where
    2147              :         `rcount` is `std::min(count, size() - pos)`.
    2148              : 
    2149              :         @par Exception Safety
    2150              : 
    2151              :         Strong guarantee.
    2152              : 
    2153              :         @note All references, pointers, or iterators
    2154              :         referring to contained elements are invalidated.
    2155              :         Any past-the-end iterators are also invalidated.
    2156              : 
    2157              :         @return `*this`
    2158              : 
    2159              :         @param pos The index to replace at.
    2160              : 
    2161              :         @param count The number of characters to replace.
    2162              : 
    2163              :         @param count2 The number of characters to
    2164              :         replace with.
    2165              : 
    2166              :         @param ch The character to replace with.
    2167              : 
    2168              :         @throw `boost::system::system_error` `size() + (count2 - rcount) > max_size()`.
    2169              :         @throw `boost::system::system_error` `pos > size()`.
    2170              :     */
    2171              :     BOOST_JSON_DECL
    2172              :     string&
    2173              :     replace(
    2174              :         std::size_t pos,
    2175              :         std::size_t count,
    2176              :         std::size_t count2,
    2177              :         char ch);
    2178              : 
    2179              :     /** Replace a range with copies of a character.
    2180              : 
    2181              :         Replaces the characters in the range
    2182              :         `{first, last)` with `count` copies of `ch`.
    2183              : 
    2184              :         @par Precondition
    2185              : 
    2186              :         `{first, last)` is a valid range.
    2187              : 
    2188              :         @par Exception Safety
    2189              : 
    2190              :         Strong guarantee.
    2191              : 
    2192              :         @note All references, pointers, or iterators
    2193              :         referring to contained elements are invalidated.
    2194              :         Any past-the-end iterators are also invalidated.
    2195              : 
    2196              :         @return `*this`
    2197              : 
    2198              :         @param first An iterator referring to the first
    2199              :         character to replace.
    2200              : 
    2201              :         @param last An iterator one past the end of
    2202              :         the last character to replace.
    2203              : 
    2204              :         @param count The number of characters to
    2205              :         replace with.
    2206              : 
    2207              :         @param ch The character to replace with.
    2208              : 
    2209              :         @throw `boost::system::system_error` `size() + (count - std::distance(first, last)) > max_size()`.
    2210              :     */
    2211              :     string&
    2212            1 :     replace(
    2213              :         const_iterator first,
    2214              :         const_iterator last,
    2215              :         std::size_t count,
    2216              :         char ch)
    2217              :     {
    2218            1 :         return replace(first - begin(), last - first, count, ch);
    2219              :     }
    2220              : 
    2221              :     //------------------------------------------------------
    2222              : 
    2223              :     /** Return a view.
    2224              : 
    2225              :         Returns a view of a substring.
    2226              : 
    2227              :         @par Exception Safety
    2228              : 
    2229              :         Strong guarantee.
    2230              : 
    2231              :         @return `this->subview().substr(pos, count)`
    2232              : 
    2233              :         @param pos The index to being the substring at.
    2234              :         The default argument for this parameter is `0`.
    2235              : 
    2236              :         @param count The length of the substring.
    2237              :         The default argument for this parameter
    2238              :         is @ref npos.
    2239              : 
    2240              :         @throw `boost::system::system_error` `pos > size()`.
    2241              :     */
    2242              :     string_view
    2243           41 :     subview(
    2244              :         std::size_t pos
    2245              :         ,std::size_t count = npos) const
    2246              :     {
    2247           41 :         return subview().substr(pos, count);
    2248              :     }
    2249              : 
    2250              :     /** Return a view.
    2251              : 
    2252              :         Returns a view of the whole string.
    2253              : 
    2254              :         @par Exception Safety
    2255              :         No-throw guarantee.
    2256              : 
    2257              :         @return `string_view(this->data(), this->size())`.
    2258              :     */
    2259              :     string_view
    2260        28556 :     subview() const noexcept
    2261              :     {
    2262        28556 :         return string_view( data(), size() );
    2263              :     }
    2264              : 
    2265              :     //------------------------------------------------------
    2266              : 
    2267              :     /** Copy a substring to another string.
    2268              : 
    2269              :         Copies `std::min(count, size() - pos)` characters
    2270              :         starting at index `pos` to the string pointed
    2271              :         to by `dest`.
    2272              : 
    2273              :         @note The resulting string is not null terminated.
    2274              : 
    2275              :         @return The number of characters copied.
    2276              : 
    2277              :         @param count The number of characters to copy.
    2278              : 
    2279              :         @param dest The string to copy to.
    2280              : 
    2281              :         @param pos The index to begin copying from. The
    2282              :         default argument for this parameter is `0`.
    2283              : 
    2284              :         @throw `boost::system::system_error` `pos > max_size()`.
    2285              :     */
    2286              :     std::size_t
    2287            2 :     copy(
    2288              :         char* dest,
    2289              :         std::size_t count,
    2290              :         std::size_t pos = 0) const
    2291              :     {
    2292            2 :         return subview().copy(dest, count, pos);
    2293              :     }
    2294              : 
    2295              :     //------------------------------------------------------
    2296              : 
    2297              :     /** Change the size of the string.
    2298              : 
    2299              :         Resizes the string to contain `count` characters.
    2300              :         If `count > size()`, characters with the value `0`
    2301              :         are appended. Otherwise, `size()` is reduced
    2302              :         to `count`.
    2303              : 
    2304              :         @param count The size to resize the string to.
    2305              : 
    2306              :         @throw `boost::system::system_error` `count > max_size()`.
    2307              :     */
    2308              :     void
    2309           57 :     resize(std::size_t count)
    2310              :     {
    2311           57 :         resize(count, 0);
    2312           54 :     }
    2313              : 
    2314              :     /** Change the size of the string.
    2315              : 
    2316              :         Resizes the string to contain `count` characters.
    2317              :         If `count > size()`, copies of `ch` are
    2318              :         appended. Otherwise, `size()` is reduced
    2319              :         to `count`.
    2320              : 
    2321              :         @param count The size to resize the string to.
    2322              : 
    2323              :         @param ch The characters to append if the size
    2324              :         increases.
    2325              : 
    2326              :         @throw `boost::system::system_error` `count > max_size()`.
    2327              :     */
    2328              :     BOOST_JSON_DECL
    2329              :     void
    2330              :     resize(std::size_t count, char ch);
    2331              : 
    2332              :     /** Increase size without changing capacity.
    2333              : 
    2334              :         This increases the size of the string by `n`
    2335              :         characters, adjusting the position of the
    2336              :         terminating null for the new size. The new
    2337              :         characters remain uninitialized. This function
    2338              :         may be used to append characters directly into
    2339              :         the storage between `end()` and
    2340              :         `data() + capacity()`.
    2341              : 
    2342              :         @par Precondition
    2343              : 
    2344              :         @code
    2345              :         count <= capacity() - size()
    2346              :         @endcode
    2347              : 
    2348              :         @param n The amount to increase the size by.
    2349              :     */
    2350              :     void
    2351        12638 :     grow(std::size_t n) noexcept
    2352              :     {
    2353        12638 :         BOOST_ASSERT(
    2354              :             n <= impl_.capacity() - impl_.size());
    2355        12638 :         impl_.term(impl_.size() + n);
    2356        12638 :     }
    2357              : 
    2358              :     //------------------------------------------------------
    2359              : 
    2360              :     /** Swap the contents.
    2361              : 
    2362              :         Exchanges the contents of this string with another string. Ownership of
    2363              :         the respective `boost::container::pmr::memory_resource` objects is not
    2364              :         transferred.
    2365              : 
    2366              :         @li If `&other == this`, do nothing. Otherwise,
    2367              : 
    2368              :         @li if `*other.storage() == *this->storage()`,
    2369              :         ownership of the underlying memory is swapped in
    2370              :         constant time, with no possibility of exceptions.
    2371              :         All iterators and references remain valid. Otherwise,
    2372              : 
    2373              :         @li the contents are logically swapped by making copies,
    2374              :         which can throw. In this case all iterators and
    2375              :         references are invalidated.
    2376              : 
    2377              :         @par Complexity
    2378              : 
    2379              :         Constant or linear in @ref size() plus
    2380              :         `other.size()`.
    2381              : 
    2382              :         @par Exception Safety
    2383              : 
    2384              :         Strong guarantee.
    2385              :         Calls to `memory_resource::allocate` may throw.
    2386              :     */
    2387              :     BOOST_JSON_DECL
    2388              :     void
    2389              :     swap(string& other);
    2390              : 
    2391              :     /** Exchange the given values.
    2392              : 
    2393              :         Exchanges the contents of the string `lhs` with another string `rhs`.
    2394              :         Ownership of the respective `boost::container::pmr::memory_resource`
    2395              :         objects is not transferred.
    2396              : 
    2397              :         @li If `&lhs == &rhs`, do nothing. Otherwise,
    2398              : 
    2399              :         @li if `*lhs.storage() == *rhs.storage()`,
    2400              :         ownership of the underlying memory is swapped in
    2401              :         constant time, with no possibility of exceptions.
    2402              :         All iterators and references remain valid. Otherwise,
    2403              : 
    2404              :         @li the contents are logically swapped by making a copy,
    2405              :         which can throw. In this case all iterators and
    2406              :         references are invalidated.
    2407              : 
    2408              :         @par Effects
    2409              :         @code
    2410              :         lhs.swap( rhs );
    2411              :         @endcode
    2412              : 
    2413              :         @par Complexity
    2414              :         Constant or linear in `lhs.size() + rhs.size()`.
    2415              : 
    2416              :         @par Exception Safety
    2417              :         Strong guarantee.
    2418              :         Calls to `memory_resource::allocate` may throw.
    2419              : 
    2420              :         @param lhs The string to exchange.
    2421              : 
    2422              :         @param rhs The string to exchange.
    2423              : 
    2424              :         @see @ref string::swap
    2425              :     */
    2426              :     friend
    2427              :     void
    2428            2 :     swap(string& lhs, string& rhs)
    2429              :     {
    2430            2 :         lhs.swap(rhs);
    2431            2 :     }
    2432              :     //------------------------------------------------------
    2433              :     //
    2434              :     // Search
    2435              :     //
    2436              :     //------------------------------------------------------
    2437              : 
    2438              :     /** Find the first occurrence of a string within the string.
    2439              : 
    2440              :         Returns the lowest index `idx` greater than or equal
    2441              :         to `pos` where each element of `sv`  is equal to
    2442              :         that of `{begin() + idx, begin() + idx + sv.size())`
    2443              :         if one exists, and @ref npos otherwise.
    2444              : 
    2445              :         @par Complexity
    2446              : 
    2447              :         Linear.
    2448              : 
    2449              :         @return The first occurrence of `sv` within the
    2450              :         string starting at the index `pos`, or @ref npos
    2451              :         if none exists.
    2452              : 
    2453              :         @param sv The `string_view` to search for.
    2454              : 
    2455              :         @param pos The index to start searching at.
    2456              :         The default argument for this parameter is `0`.
    2457              :     */
    2458              :     std::size_t
    2459            5 :     find(
    2460              :         string_view sv,
    2461              :         std::size_t pos = 0) const noexcept
    2462              :     {
    2463            5 :         return subview().find(sv, pos);
    2464              :     }
    2465              : 
    2466              :     /** Find the first occurrence of a character within the string.
    2467              : 
    2468              :         Returns the index corrosponding to the first
    2469              :         occurrence of `ch` within `{begin() + pos, end())`
    2470              :         if it exists, and @ref npos otherwise.
    2471              : 
    2472              :         @par Complexity
    2473              : 
    2474              :         Linear.
    2475              : 
    2476              :         @return The first occurrence of `ch` within the
    2477              :         string starting at the index `pos`, or @ref npos
    2478              :         if none exists.
    2479              : 
    2480              :         @param ch The character to search for.
    2481              : 
    2482              :         @param pos The index to start searching at.
    2483              :         The default argument for this parameter is `0`.
    2484              :     */
    2485              :     std::size_t
    2486            3 :     find(
    2487              :         char ch,
    2488              :         std::size_t pos = 0) const noexcept
    2489              :     {
    2490            3 :         return subview().find(ch, pos);
    2491              :     }
    2492              : 
    2493              :     //------------------------------------------------------
    2494              : 
    2495              :     /** Find the last occurrence of a string within the string.
    2496              : 
    2497              :         Returns the highest index `idx` less than or equal
    2498              :         to `pos` where each element of `sv` is equal to that
    2499              :         of `{begin() + idx, begin() + idx + sv.size())`
    2500              :         if one exists, and @ref npos otherwise.
    2501              : 
    2502              :         @par Complexity
    2503              : 
    2504              :         Linear.
    2505              : 
    2506              :         @return The last occurrence of `sv` within the
    2507              :         string starting before or at the index `pos`,
    2508              :         or @ref npos if none exists.
    2509              : 
    2510              :         @param sv The `string_view` to search for.
    2511              : 
    2512              :         @param pos The index to start searching at.
    2513              :         The default argument for this parameter
    2514              :         is @ref npos.
    2515              :     */
    2516              :     std::size_t
    2517            5 :     rfind(
    2518              :         string_view sv,
    2519              :         std::size_t pos = npos) const noexcept
    2520              :     {
    2521            5 :         return subview().rfind(sv, pos);
    2522              :     }
    2523              : 
    2524              :     /** Find the last occurrence of a character within the string.
    2525              : 
    2526              :         Returns index corrosponding to the last occurrence
    2527              :         of `ch` within `{begin(), begin() + pos}` if it
    2528              :         exists, and @ref npos otherwise.
    2529              : 
    2530              :         @par Complexity
    2531              : 
    2532              :         Linear.
    2533              : 
    2534              :         @return The last occurrence of `ch` within the
    2535              :         string starting before or at the index `pos`,
    2536              :         or @ref npos if none exists.
    2537              : 
    2538              :         @param ch The character to search for.
    2539              : 
    2540              :         @param pos The index to stop searching at.
    2541              :         The default argument for this parameter
    2542              :         is @ref npos.
    2543              :     */
    2544              :     std::size_t
    2545            3 :     rfind(
    2546              :         char ch,
    2547              :         std::size_t pos = npos) const noexcept
    2548              :     {
    2549            3 :         return subview().rfind(ch, pos);
    2550              :     }
    2551              : 
    2552              :     //------------------------------------------------------
    2553              : 
    2554              :     /** Find the first occurrence of any of the characters within the string.
    2555              : 
    2556              :         Returns the index corrosponding to the first
    2557              :         occurrence of any of the characters of `sv`
    2558              :         within `{begin() + pos, end())` if it exists,
    2559              :         and @ref npos otherwise.
    2560              : 
    2561              :         @par Complexity
    2562              : 
    2563              :         Linear.
    2564              : 
    2565              :         @return The first occurrence of any of the
    2566              :         characters within `sv` within the string
    2567              :         starting at the index `pos`, or @ref npos
    2568              :         if none exists.
    2569              : 
    2570              :         @param sv The characters to search for.
    2571              : 
    2572              :         @param pos The index to start searching at.
    2573              :         The default argument for this parameter is `0`.
    2574              :     */
    2575              :     std::size_t
    2576            5 :     find_first_of(
    2577              :         string_view sv,
    2578              :         std::size_t pos = 0) const noexcept
    2579              :     {
    2580            5 :         return subview().find_first_of(sv, pos);
    2581              :     }
    2582              : 
    2583              :     //------------------------------------------------------
    2584              : 
    2585              :     /** Find the first occurrence of any of the characters not within the string.
    2586              : 
    2587              :         Returns the index corrosponding to the first
    2588              :         character of `{begin() + pos, end())` that is
    2589              :         not within `sv` if it exists, and @ref npos
    2590              :         otherwise.
    2591              : 
    2592              :         @par Complexity
    2593              : 
    2594              :         Linear.
    2595              : 
    2596              :         @return The first occurrence of a character that
    2597              :         is not within `sv` within the string starting at
    2598              :         the index `pos`, or @ref npos if none exists.
    2599              : 
    2600              :         @param sv The characters to ignore.
    2601              : 
    2602              :         @param pos The index to start searching at.
    2603              :         The default argument for this parameter is `0`.
    2604              :     */
    2605              :     std::size_t
    2606            4 :     find_first_not_of(
    2607              :         string_view sv,
    2608              :         std::size_t pos = 0) const noexcept
    2609              :     {
    2610            4 :         return subview().find_first_not_of(sv, pos);
    2611              :     }
    2612              : 
    2613              :     /** Find the first occurrence of a character not equal to `ch`.
    2614              : 
    2615              :         Returns the index corrosponding to the first
    2616              :         character of `{begin() + pos, end())` that is
    2617              :         not equal to `ch` if it exists, and
    2618              :         @ref npos otherwise.
    2619              : 
    2620              :         @par Complexity
    2621              : 
    2622              :         Linear.
    2623              : 
    2624              :         @return The first occurrence of a character that
    2625              :         is not equal to `ch`, or @ref npos if none exists.
    2626              : 
    2627              :         @param ch The character to ignore.
    2628              : 
    2629              :         @param pos The index to start searching at.
    2630              :         The default argument for this parameter is `0`.
    2631              :     */
    2632              :     std::size_t
    2633            3 :     find_first_not_of(
    2634              :         char ch,
    2635              :         std::size_t pos = 0) const noexcept
    2636              :     {
    2637            3 :         return subview().find_first_not_of(ch, pos);
    2638              :     }
    2639              : 
    2640              :     //------------------------------------------------------
    2641              : 
    2642              :     /** Find the last occurrence of any of the characters within the string.
    2643              : 
    2644              :         Returns the index corrosponding to the last
    2645              :         occurrence of any of the characters of `sv` within
    2646              :         `{begin(), begin() + pos}` if it exists,
    2647              :         and @ref npos otherwise.
    2648              : 
    2649              :         @par Complexity
    2650              : 
    2651              :         Linear.
    2652              : 
    2653              :         @return The last occurrence of any of the
    2654              :         characters within `sv` within the string starting
    2655              :         before or at the index `pos`, or @ref npos if
    2656              :         none exists.
    2657              : 
    2658              :         @param sv The characters to search for.
    2659              : 
    2660              :         @param pos The index to stop searching at.
    2661              :         The default argument for this parameter
    2662              :         is @ref npos.
    2663              :     */
    2664              :     std::size_t
    2665            5 :     find_last_of(
    2666              :         string_view sv,
    2667              :         std::size_t pos = npos) const noexcept
    2668              :     {
    2669            5 :         return subview().find_last_of(sv, pos);
    2670              :     }
    2671              : 
    2672              :     //------------------------------------------------------
    2673              : 
    2674              :     /** Find the last occurrence of a character not within the string.
    2675              : 
    2676              :         Returns the index corrosponding to the last
    2677              :         character of `{begin(), begin() + pos}` that is not
    2678              :         within `sv` if it exists, and @ref npos otherwise.
    2679              : 
    2680              :         @par Complexity
    2681              : 
    2682              :         Linear.
    2683              : 
    2684              :         @return The last occurrence of a character that is
    2685              :         not within `sv` within the string before or at the
    2686              :         index `pos`, or @ref npos if none exists.
    2687              : 
    2688              :         @param sv The characters to ignore.
    2689              : 
    2690              :         @param pos The index to stop searching at.
    2691              :         The default argument for this parameter
    2692              :         is @ref npos.
    2693              :     */
    2694              :     std::size_t
    2695            4 :     find_last_not_of(
    2696              :         string_view sv,
    2697              :         std::size_t pos = npos) const noexcept
    2698              :     {
    2699            4 :         return subview().find_last_not_of(sv, pos);
    2700              :     }
    2701              : 
    2702              :     /** Find the last occurrence of a character not equal to `ch`.
    2703              : 
    2704              :         Returns the index corrosponding to the last
    2705              :         character of `{begin(), begin() + pos}` that is
    2706              :         not equal to `ch` if it exists, and @ref npos
    2707              :         otherwise.
    2708              : 
    2709              :         @par Complexity
    2710              : 
    2711              :         Linear.
    2712              : 
    2713              :         @return The last occurrence of a character that
    2714              :         is not equal to `ch` before or at the index `pos`,
    2715              :         or @ref npos if none exists.
    2716              : 
    2717              :         @param ch The character to ignore.
    2718              : 
    2719              :         @param pos The index to start searching at.
    2720              :         The default argument for this parameter
    2721              :         is @ref npos.
    2722              :     */
    2723              :     std::size_t
    2724            3 :     find_last_not_of(
    2725              :         char ch,
    2726              :         std::size_t pos = npos) const noexcept
    2727              :     {
    2728            3 :         return subview().find_last_not_of(ch, pos);
    2729              :     }
    2730              : 
    2731              :     /** Serialize @ref string to an output stream.
    2732              : 
    2733              :         This function serializes a `string` as JSON into the output stream.
    2734              : 
    2735              :         @return Reference to `os`.
    2736              : 
    2737              :         @par Complexity
    2738              :         Constant or linear in the size of `str`.
    2739              : 
    2740              :         @par Exception Safety
    2741              :         Strong guarantee.
    2742              :         Calls to `memory_resource::allocate` may throw.
    2743              : 
    2744              :         @param os The output stream to serialize to.
    2745              : 
    2746              :         @param str The value to serialize.
    2747              :     */
    2748              :     BOOST_JSON_DECL
    2749              :     friend
    2750              :     std::ostream&
    2751              :     operator<<(
    2752              :         std::ostream& os,
    2753              :         string const& str);
    2754              : 
    2755              : private:
    2756              :     class undo;
    2757              : 
    2758              :     template<class It>
    2759              :     using iter_cat = typename
    2760              :         std::iterator_traits<It>::iterator_category;
    2761              : 
    2762              :     template<class InputIt>
    2763              :     void
    2764              :     assign(InputIt first, InputIt last,
    2765              :         std::random_access_iterator_tag);
    2766              : 
    2767              :     template<class InputIt>
    2768              :     void
    2769              :     assign(InputIt first, InputIt last,
    2770              :         std::input_iterator_tag);
    2771              : 
    2772              :     template<class InputIt>
    2773              :     void
    2774              :     append(InputIt first, InputIt last,
    2775              :         std::random_access_iterator_tag);
    2776              : 
    2777              :     template<class InputIt>
    2778              :     void
    2779              :     append(InputIt first, InputIt last,
    2780              :         std::input_iterator_tag);
    2781              : 
    2782              :     BOOST_JSON_DECL
    2783              :     void
    2784              :     reserve_impl(std::size_t new_capacity);
    2785              : };
    2786              : 
    2787              : //----------------------------------------------------------
    2788              : 
    2789              : namespace detail
    2790              : {
    2791              : 
    2792              : template <>
    2793              : inline
    2794              : string_view
    2795        28401 : to_string_view<string>(string const& s) noexcept
    2796              : {
    2797        28401 :     return s.subview();
    2798              : }
    2799              : 
    2800              : } // namespace detail
    2801              : 
    2802              : 
    2803              : /** Return true if lhs equals rhs.
    2804              : 
    2805              :     A lexicographical comparison is used.
    2806              : */
    2807              : #ifdef BOOST_JSON_DOCS
    2808              : bool
    2809              : operator==(string const& lhs, string const& rhs) noexcept
    2810              : #else
    2811              : template<class T, class U>
    2812              : detail::string_comp_op_requirement<T, U>
    2813        15176 : operator==(T const& lhs, U const& rhs) noexcept
    2814              : #endif
    2815              : {
    2816        15176 :     return detail::to_string_view(lhs) == detail::to_string_view(rhs);
    2817              : }
    2818              : 
    2819              : /** Return true if lhs does not equal rhs.
    2820              : 
    2821              :     A lexicographical comparison is used.
    2822              : */
    2823              : #ifdef BOOST_JSON_DOCS
    2824              : bool
    2825              : operator!=(string const& lhs, string const& rhs) noexcept
    2826              : #else
    2827              : template<class T, class U>
    2828              : detail::string_comp_op_requirement<T, U>
    2829           24 : operator!=(T const& lhs, U const& rhs) noexcept
    2830              : #endif
    2831              : {
    2832           24 :     return detail::to_string_view(lhs) != detail::to_string_view(rhs);
    2833              : }
    2834              : 
    2835              : /** Return true if lhs is less than rhs.
    2836              : 
    2837              :     A lexicographical comparison is used.
    2838              : */
    2839              : #ifdef BOOST_JSON_DOCS
    2840              : bool
    2841              : operator<(string const& lhs, string const& rhs) noexcept
    2842              : #else
    2843              : template<class T, class U>
    2844              : detail::string_comp_op_requirement<T, U>
    2845           12 : operator<(T const& lhs, U const& rhs) noexcept
    2846              : #endif
    2847              : {
    2848           12 :     return detail::to_string_view(lhs) < detail::to_string_view(rhs);
    2849              : }
    2850              : 
    2851              : /** Return true if lhs is less than or equal to rhs.
    2852              : 
    2853              :     A lexicographical comparison is used.
    2854              : */
    2855              : #ifdef BOOST_JSON_DOCS
    2856              : bool
    2857              : operator<=(string const& lhs, string const& rhs) noexcept
    2858              : #else
    2859              : template<class T, class U>
    2860              : detail::string_comp_op_requirement<T, U>
    2861           12 : operator<=(T const& lhs, U const& rhs) noexcept
    2862              : #endif
    2863              : {
    2864           12 :     return detail::to_string_view(lhs) <= detail::to_string_view(rhs);
    2865              : }
    2866              : 
    2867              : #ifdef BOOST_JSON_DOCS
    2868              : bool
    2869              : operator>=(string const& lhs, string const& rhs) noexcept
    2870              : #else
    2871              : template<class T, class U>
    2872              : detail::string_comp_op_requirement<T, U>
    2873           12 : operator>=(T const& lhs, U const& rhs) noexcept
    2874              : #endif
    2875              : {
    2876           12 :     return detail::to_string_view(lhs) >= detail::to_string_view(rhs);
    2877              : }
    2878              : 
    2879              : /** Return true if lhs is greater than rhs.
    2880              : 
    2881              :     A lexicographical comparison is used.
    2882              : */
    2883              : #ifdef BOOST_JSON_DOCS
    2884              : bool
    2885              : operator>(string const& lhs, string const& rhs) noexcept
    2886              : #else
    2887              : template<class T, class U>
    2888              : detail::string_comp_op_requirement<T, U>
    2889           12 : operator>(T const& lhs, U const& rhs) noexcept
    2890              : #endif
    2891              : {
    2892           12 :     return detail::to_string_view(lhs) > detail::to_string_view(rhs);
    2893              : }
    2894              : 
    2895              : } // namespace json
    2896              : } // namespace boost
    2897              : 
    2898              : // std::hash specialization
    2899              : #ifndef BOOST_JSON_DOCS
    2900              : namespace std {
    2901              : template<>
    2902              : struct hash< ::boost::json::string >
    2903              : {
    2904              :     BOOST_JSON_DECL
    2905              :     std::size_t
    2906              :     operator()( ::boost::json::string const& js ) const noexcept;
    2907              : };
    2908              : } // std
    2909              : #endif
    2910              : 
    2911              : #include <boost/json/impl/string.hpp>
    2912              : 
    2913              : #endif
        

Generated by: LCOV version 2.1