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

Generated by: LCOV version 2.1