LCOV - code coverage report
Current view: top level - json - array.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 29 29
Test Date: 2025-12-23 17:20:51 Functions: 100.0 % 9 9

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
       3              : //
       4              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6              : //
       7              : // Official repository: https://github.com/boostorg/json
       8              : //
       9              : 
      10              : #ifndef BOOST_JSON_ARRAY_HPP
      11              : #define BOOST_JSON_ARRAY_HPP
      12              : 
      13              : #include <boost/json/detail/config.hpp>
      14              : #include <boost/json/detail/array.hpp>
      15              : #include <boost/json/kind.hpp>
      16              : #include <boost/json/pilfer.hpp>
      17              : #include <boost/json/storage_ptr.hpp>
      18              : #include <boost/system/result.hpp>
      19              : #include <cstdlib>
      20              : #include <initializer_list>
      21              : #include <iterator>
      22              : 
      23              : namespace boost {
      24              : namespace json {
      25              : 
      26              : #ifndef BOOST_JSON_DOCS
      27              : class value;
      28              : class value_ref;
      29              : #endif
      30              : 
      31              : /** A dynamically sized array of JSON values
      32              : 
      33              :     This is the type used to represent a JSON array as
      34              :     a modifiable container. The interface and performance
      35              :     characteristics are modeled after `std::vector<value>`.
      36              : \n
      37              :     Elements are stored contiguously, which means that
      38              :     they can be accessed not only through iterators, but
      39              :     also using offsets to regular pointers to elements. A
      40              :     pointer to an element of an @ref array may be passed to
      41              :     any function that expects a pointer to @ref value.
      42              : \n
      43              :     The storage of the array is handled automatically, being
      44              :     expanded and contracted as needed. Arrays usually occupy
      45              :     more space than array language constructs, because more
      46              :     memory is allocated to handle future growth. This way an
      47              :     array does not need to reallocate each time an element
      48              :     is inserted, but only when the additional memory is used
      49              :     up. The total amount of allocated memory can be queried
      50              :     using the @ref capacity function. Extra memory can be
      51              :     relinquished by calling @ref shrink_to_fit.
      52              :     \n
      53              : 
      54              :     Reallocations are usually costly operations in terms of
      55              :     performance. The @ref reserve function can be used to
      56              :     eliminate reallocations if the number of elements is
      57              :     known beforehand.
      58              : \n
      59              :     The complexity (efficiency) of common operations on
      60              :     arrays is as follows:
      61              : 
      62              :     @li Random access - constant *O(1)*.
      63              :     @li Insertion or removal of elements at the
      64              :         end - amortized constant *O(1)*.
      65              :     @li Insertion or removal of elements - linear in
      66              :         the distance to the end of the array *O(n)*.
      67              : 
      68              :     @par Allocators
      69              : 
      70              :     All elements stored in the container, and their
      71              :     children if any, will use the same memory resource
      72              :     that was used to construct the container.
      73              : 
      74              :     @par Thread Safety
      75              : 
      76              :     Non-const member functions may not be called
      77              :     concurrently with any other member functions.
      78              : 
      79              :     @par Satisfies
      80              :         <a href="https://en.cppreference.com/w/cpp/named_req/ContiguousContainer"><em>ContiguousContainer</em></a>,
      81              :         <a href="https://en.cppreference.com/w/cpp/named_req/ReversibleContainer"><em>ReversibleContainer</em></a>, and
      82              :         <a href="https://en.cppreference.com/w/cpp/named_req/SequenceContainer"><em>SequenceContainer</em></a>.
      83              : */
      84              : class array
      85              : {
      86              :     struct table;
      87              :     class revert_construct;
      88              :     class revert_insert;
      89              :     friend class value;
      90              : 
      91              :     storage_ptr sp_;        // must come first
      92              :     kind k_ = kind::array;  // must come second
      93              :     table* t_;
      94              : 
      95              :     BOOST_JSON_DECL
      96              :     static table empty_;
      97              : 
      98              :     inline
      99              :     static
     100              :     void
     101              :     relocate(
     102              :         value* dest,
     103              :         value* src,
     104              :         std::size_t n) noexcept;
     105              : 
     106              :     inline
     107              :     void
     108              :     destroy(
     109              :         value* first,
     110              :         value* last) noexcept;
     111              : 
     112              :     BOOST_JSON_DECL
     113              :     void
     114              :     destroy() noexcept;
     115              : 
     116              :     BOOST_JSON_DECL
     117              :     explicit
     118              :     array(detail::unchecked_array&& ua);
     119              : 
     120              : public:
     121              :     /// Associated [Allocator](https://en.cppreference.com/w/cpp/named_req/Allocator)
     122              :     using allocator_type = container::pmr::polymorphic_allocator<value>;
     123              : 
     124              :     /// The type used to represent unsigned integers
     125              :     using size_type = std::size_t;
     126              : 
     127              :     /// The type of each element
     128              :     using value_type = value;
     129              : 
     130              :     /// The type used to represent signed integers
     131              :     using difference_type = std::ptrdiff_t;
     132              : 
     133              :     /// A reference to an element
     134              :     using reference = value&;
     135              : 
     136              :     /// A const reference to an element
     137              :     using const_reference = value const&;
     138              : 
     139              :     /// A pointer to an element
     140              :     using pointer = value*;
     141              : 
     142              :     /// A const pointer to an element
     143              :     using const_pointer = value const*;
     144              : 
     145              :     /// A random access iterator to an element
     146              :     using iterator = value*;
     147              : 
     148              :     /// A random access const iterator to an element
     149              :     using const_iterator = value const*;
     150              : 
     151              :     /// A reverse random access iterator to an element
     152              :     using reverse_iterator =
     153              :         std::reverse_iterator<iterator>;
     154              : 
     155              :     /// A reverse random access const iterator to an element
     156              :     using const_reverse_iterator =
     157              :         std::reverse_iterator<const_iterator>;
     158              : 
     159              :     //------------------------------------------------------
     160              : 
     161              :     /** Destructor.
     162              : 
     163              :         The destructor for each element is called if needed,
     164              :         any used memory is deallocated, and shared ownership
     165              :         of the `boost::container::pmr::memory_resource` is released.
     166              : 
     167              :         @par Complexity
     168              :         Constant, or linear in @ref size().
     169              : 
     170              :         @par Exception Safety
     171              :         No-throw guarantee.
     172              :     */
     173              :     BOOST_JSON_DECL
     174              :     ~array() noexcept;
     175              : 
     176              :     //------------------------------------------------------
     177              : 
     178              :     /** Constructor.
     179              : 
     180              :         The constructed array is empty with zero
     181              :         capacity, using the [default memory resource].
     182              : 
     183              :         @par Complexity
     184              :         Constant.
     185              : 
     186              :         @par Exception Safety
     187              :         No-throw guarantee.
     188              : 
     189              :         [default memory resource]: json/allocators/storage_ptr.html#json.allocators.storage_ptr.default_memory_resource
     190              :     */
     191           79 :     array() noexcept
     192           79 :         : t_(&empty_)
     193              :     {
     194           79 :     }
     195              : 
     196              :     /** Constructor.
     197              : 
     198              :         The constructed array is empty with zero
     199              :         capacity, using the specified memory resource.
     200              : 
     201              :         @par Complexity
     202              :         Constant.
     203              : 
     204              :         @par Exception Safety
     205              :         No-throw guarantee.
     206              : 
     207              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     208              :         to use. The container will acquire shared
     209              :         ownership of the memory resource.
     210              :     */
     211              :     explicit
     212          682 :     array(storage_ptr sp) noexcept
     213          682 :         : sp_(std::move(sp))
     214          682 :         , k_(kind::array)
     215          682 :         , t_(&empty_)
     216              :     {
     217          682 :     }
     218              : 
     219              :     /** Constructor.
     220              : 
     221              :         The array is constructed with `count`
     222              :         copies of the value `v`, using the
     223              :         specified memory resource.
     224              : 
     225              :         @par Complexity
     226              :         Linear in `count`
     227              : 
     228              :         @par Exception Safety
     229              :         Strong guarantee.
     230              :         Calls to `memory_resource::allocate` may throw.
     231              : 
     232              :         @param count The number of copies to insert.
     233              : 
     234              :         @param v The value to be inserted.
     235              : 
     236              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     237              :         to use. The container will acquire shared
     238              :         ownership of the memory resource.
     239              :     */
     240              :     BOOST_JSON_DECL
     241              :     array(
     242              :         std::size_t count,
     243              :         value const& v,
     244              :         storage_ptr sp = {});
     245              : 
     246              :     /** Constructor.
     247              : 
     248              :         The array is constructed with `count` null values,
     249              :         using the specified memory resource.
     250              : 
     251              :         @par Complexity
     252              :         Linear in `count`
     253              : 
     254              :         @par Exception Safety
     255              :         Strong guarantee.
     256              :         Calls to `memory_resource::allocate` may throw.
     257              : 
     258              :         @param count The number of nulls to insert.
     259              : 
     260              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     261              :         to use. The container will acquire shared
     262              :         ownership of the memory resource.
     263              :     */
     264              :     BOOST_JSON_DECL
     265              :     array(
     266              :         std::size_t count,
     267              :         storage_ptr sp = {});
     268              : 
     269              :     /** Constructor.
     270              : 
     271              :         The array is constructed with the elements
     272              :         in the range `{first, last)`, preserving order,
     273              :         using the specified memory resource.
     274              : 
     275              :         @par Constraints
     276              : 
     277              :         @code
     278              :         std::is_constructible_v<value, std::iterator_traits<InputIt>::reference>
     279              :         @endcode
     280              : 
     281              :         @par Complexity
     282              :         Linear in `std::distance(first, last)`
     283              : 
     284              :         @par Exception Safety
     285              :         Strong guarantee.
     286              :         Calls to `memory_resource::allocate` may throw.
     287              : 
     288              :         @param first An input iterator pointing to the
     289              :         first element to insert, or pointing to the end
     290              :         of the range.
     291              : 
     292              :         @param last An input iterator pointing to the end
     293              :         of the range.
     294              : 
     295              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     296              :         to use. The container will acquire shared
     297              :         ownership of the memory resource.
     298              : 
     299              :         @tparam InputIt a type satisfying the requirements
     300              :         of __InputIterator__.
     301              :     */
     302              :     template<
     303              :         class InputIt
     304              :     #ifndef BOOST_JSON_DOCS
     305              :         ,class = typename std::enable_if<
     306              :             std::is_constructible<value,
     307              :                 typename std::iterator_traits<
     308              :                     InputIt>::reference>::value>::type
     309              :     #endif
     310              :     >
     311              :     array(
     312              :         InputIt first, InputIt last,
     313              :         storage_ptr sp = {});
     314              : 
     315              :     /** Copy constructor.
     316              : 
     317              :         The array is constructed with a copy of the
     318              :         contents of `other`, using `other`'s memory resource.
     319              : 
     320              :         @par Complexity
     321              :         Linear in `other.size()`.
     322              : 
     323              :         @par Exception Safety
     324              :         Strong guarantee.
     325              :         Calls to `memory_resource::allocate` may throw.
     326              : 
     327              :         @param other The array to copy
     328              :     */
     329              :     BOOST_JSON_DECL
     330              :     array(array const& other);
     331              : 
     332              :     /** Copy constructor.
     333              : 
     334              :         The array is constructed with a copy of the
     335              :         contents of `other`, using the specified memory resource.
     336              : 
     337              :         @par Complexity
     338              :         Linear in `other.size()`.
     339              : 
     340              :         @par Exception Safety
     341              :         Strong guarantee.
     342              :         Calls to `memory_resource::allocate` may throw.
     343              : 
     344              :         @param other The array to copy
     345              : 
     346              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     347              :         to use. The container will acquire shared
     348              :         ownership of the memory resource.
     349              :     */
     350              :     BOOST_JSON_DECL
     351              :     array(
     352              :         array const& other,
     353              :         storage_ptr sp);
     354              : 
     355              :     /** Pilfer constructor.
     356              : 
     357              :         The array is constructed by acquiring ownership
     358              :         of the contents of `other` using pilfer semantics.
     359              :         This is more efficient than move construction, when
     360              :         it is known that the moved-from object will be
     361              :         immediately destroyed afterwards.
     362              : 
     363              :         @par Complexity
     364              :         Constant.
     365              : 
     366              :         @par Exception Safety
     367              :         No-throw guarantee.
     368              : 
     369              :         @param other The value to pilfer. After pilfer
     370              :         construction, `other` is not in a usable state
     371              :         and may only be destroyed.
     372              : 
     373              :         @see @ref pilfer,
     374              :             <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0308r0.html">
     375              :                 Valueless Variants Considered Harmful</a>
     376              :     */
     377            6 :     array(pilfered<array> other) noexcept
     378            6 :         : sp_(std::move(other.get().sp_))
     379           12 :         , t_(detail::exchange(
     380            6 :             other.get().t_, &empty_))
     381              :     {
     382            6 :     }
     383              : 
     384              :     /** Move constructor.
     385              : 
     386              :         The array is constructed by acquiring ownership of
     387              :         the contents of `other` and shared ownership of
     388              :         `other`'s memory resource.
     389              : 
     390              :         @note
     391              : 
     392              :         After construction, the moved-from array behaves
     393              :         as if newly constructed with its current storage
     394              :         pointer.
     395              : 
     396              :         @par Complexity
     397              :         Constant.
     398              : 
     399              :         @par Exception Safety
     400              :         No-throw guarantee.
     401              : 
     402              :         @param other The container to move
     403              :     */
     404          188 :     array(array&& other) noexcept
     405          188 :         : sp_(other.sp_)
     406          376 :         , t_(detail::exchange(
     407          188 :             other.t_, &empty_))
     408              :     {
     409          188 :     }
     410              : 
     411              :     /** Move constructor.
     412              : 
     413              :         The array is constructed with the contents of
     414              :         `other` by move semantics, using the specified
     415              :         memory resource:
     416              : 
     417              :         @li If `*other.storage() == *sp`, ownership of
     418              :         the underlying memory is transferred in constant
     419              :         time, with no possibility of exceptions.
     420              :         After construction, the moved-from array behaves
     421              :         as if newly constructed with its current storage
     422              :         pointer.
     423              : 
     424              :         @li If `*other.storage() != *sp`, an
     425              :         element-wise copy is performed, which may throw.
     426              :         In this case, the moved-from array is not
     427              :         changed.
     428              : 
     429              :         @par Complexity
     430              :         At most, linear in `other.size()`.
     431              : 
     432              :         @par Exception Safety
     433              :         Strong guarantee.
     434              :         Calls to `memory_resource::allocate` may throw.
     435              : 
     436              :         @param other The container to move
     437              : 
     438              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     439              :         to use. The container will acquire shared
     440              :         ownership of the memory resource.
     441              :     */
     442              :     BOOST_JSON_DECL
     443              :     array(
     444              :         array&& other,
     445              :         storage_ptr sp);
     446              : 
     447              :     /** Constructor.
     448              : 
     449              :         The array is constructed with a copy of the values
     450              :         in the initializer-list in order, using the
     451              :         specified memory resource.
     452              : 
     453              :         @par Complexity
     454              :         Linear in `init.size()`.
     455              : 
     456              :         @par Exception Safety
     457              :         Strong guarantee.
     458              :         Calls to `memory_resource::allocate` may throw.
     459              : 
     460              :         @param init The initializer list to insert
     461              : 
     462              :         @param sp A pointer to the `boost::container::pmr::memory_resource`
     463              :         to use. The container will acquire shared
     464              :         ownership of the memory resource.
     465              :     */
     466              :     BOOST_JSON_DECL
     467              :     array(
     468              :         std::initializer_list<value_ref> init,
     469              :         storage_ptr sp = {});
     470              : 
     471              :     //------------------------------------------------------
     472              : 
     473              :     /** Copy assignment.
     474              : 
     475              :         The contents of the array are replaced with an
     476              :         element-wise copy of `other`.
     477              : 
     478              :         @par Complexity
     479              :         Linear in @ref size() plus `other.size()`.
     480              : 
     481              :         @par Exception Safety
     482              :         Strong guarantee.
     483              :         Calls to `memory_resource::allocate` may throw.
     484              : 
     485              :         @param other The array to copy.
     486              :     */
     487              :     BOOST_JSON_DECL
     488              :     array&
     489              :     operator=(array const& other);
     490              : 
     491              :     /** Move assignment.
     492              : 
     493              :         The contents of the array are replaced with the
     494              :         contents of `other` using move semantics:
     495              : 
     496              :         @li If `*other.storage() == *sp`, ownership of
     497              :         the underlying memory is transferred in constant
     498              :         time, with no possibility of exceptions.
     499              :         After assignment, the moved-from array behaves
     500              :         as if newly constructed with its current storage
     501              :         pointer.
     502              : 
     503              :         @li If `*other.storage() != *sp`, an
     504              :         element-wise copy is performed, which may throw.
     505              :         In this case, the moved-from array is not
     506              :         changed.
     507              : 
     508              :         @par Complexity
     509              :         Constant, or linear in
     510              :         `this->size()` plus `other.size()`.
     511              : 
     512              :         @par Exception Safety
     513              :         Strong guarantee.
     514              :         Calls to `memory_resource::allocate` may throw.
     515              : 
     516              :         @param other The array to move.
     517              :     */
     518              :     BOOST_JSON_DECL
     519              :     array&
     520              :     operator=(array&& other);
     521              : 
     522              :     /** Assignment.
     523              : 
     524              :         The contents of the array are replaced with a
     525              :         copy of the values in the initializer-list.
     526              : 
     527              :         @par Complexity
     528              :         Linear in `this->size()` plus `init.size()`.
     529              : 
     530              :         @par Exception Safety
     531              :         Strong guarantee.
     532              :         Calls to `memory_resource::allocate` may throw.
     533              : 
     534              :         @param init The initializer list to copy.
     535              :     */
     536              :     BOOST_JSON_DECL
     537              :     array&
     538              :     operator=(
     539              :         std::initializer_list<value_ref> init);
     540              : 
     541              :     //------------------------------------------------------
     542              : 
     543              :     /** Return the associated memory resource.
     544              : 
     545              :         This function returns the `boost::container::pmr::memory_resource` used
     546              :         by the container.
     547              : 
     548              :         @par Complexity
     549              :         Constant.
     550              : 
     551              :         @par Exception Safety
     552              :         No-throw guarantee.
     553              :     */
     554              :     storage_ptr const&
     555        15436 :     storage() const noexcept
     556              :     {
     557        15436 :         return sp_;
     558              :     }
     559              : 
     560              :     /** Return the associated allocator.
     561              : 
     562              :         This function returns an instance of @ref allocator_type constructed
     563              :         from the associated `boost::container::pmr::memory_resource`.
     564              : 
     565              :         @par Complexity
     566              :         Constant.
     567              : 
     568              :         @par Exception Safety
     569              :         No-throw guarantee.
     570              :     */
     571              :     allocator_type
     572            1 :     get_allocator() const noexcept
     573              :     {
     574            1 :         return sp_.get();
     575              :     }
     576              : 
     577              :     //------------------------------------------------------
     578              :     //
     579              :     // Element access
     580              :     //
     581              :     //------------------------------------------------------
     582              : 
     583              :     /** Access an element, with bounds checking.
     584              : 
     585              :         Returns `boost::system::result` containing a reference to the element
     586              :         specified at location `pos`, if `pos` is within the range of the
     587              :         container. Otherwise the result contains an `error_code`.
     588              : 
     589              :         @par Exception Safety
     590              :         No-throw guarantee.
     591              : 
     592              :         @param pos A zero-based index.
     593              : 
     594              :         @par Complexity
     595              :         Constant.
     596              :     */
     597              :     /** @{ */
     598              :     BOOST_JSON_DECL
     599              :     system::result<value&>
     600              :     try_at(std::size_t pos) noexcept;
     601              : 
     602              :     BOOST_JSON_DECL
     603              :     system::result<value const&>
     604              :     try_at(std::size_t pos) const noexcept;
     605              :     /** @} */
     606              : 
     607              :     /** Access an element, with bounds checking.
     608              : 
     609              :         Returns a reference to the element specified at
     610              :         location `pos`, with bounds checking. If `pos` is
     611              :         not within the range of the container, an exception
     612              :         of type `boost::system::system_error` is thrown.
     613              : 
     614              :         @par Complexity
     615              :         Constant.
     616              : 
     617              :         @param pos A zero-based index.
     618              : 
     619              :         @param loc `source_location` to use in thrown exception; the source
     620              :             location of the call site by default.
     621              : 
     622              :         @throw `boost::system::system_error` `pos >= size()`.
     623              :     */
     624              :     /** @{ */
     625              :     inline
     626              :     value&
     627              :     at(
     628              :         std::size_t pos,
     629              :         source_location const& loc = BOOST_CURRENT_LOCATION) &;
     630              : 
     631              :     inline
     632              :     value&&
     633              :     at(
     634              :         std::size_t pos,
     635              :         source_location const& loc = BOOST_CURRENT_LOCATION) &&;
     636              : 
     637              :     BOOST_JSON_DECL
     638              :     value const&
     639              :     at(
     640              :         std::size_t pos,
     641              :         source_location const& loc = BOOST_CURRENT_LOCATION) const&;
     642              :     /** @} */
     643              : 
     644              :     /** Access an element.
     645              : 
     646              :         Returns a reference to the element specified at
     647              :         location `pos`. No bounds checking is performed.
     648              : 
     649              :         @par Precondition
     650              :         `pos < size()`
     651              : 
     652              :         @par Complexity
     653              :         Constant.
     654              : 
     655              :         @param pos A zero-based index
     656              :     */
     657              :     /** @{ */
     658              :     inline
     659              :     value&
     660              :     operator[](std::size_t pos) & noexcept;
     661              : 
     662              :     inline
     663              :     value&&
     664              :     operator[](std::size_t pos) && noexcept;
     665              : 
     666              :     inline
     667              :     value const&
     668              :     operator[](std::size_t pos) const& noexcept;
     669              :     /** @} */
     670              : 
     671              :     /** Access the first element.
     672              : 
     673              :         Returns a reference to the first element.
     674              : 
     675              :         @par Precondition
     676              :         `not empty()`
     677              : 
     678              :         @par Complexity
     679              :         Constant.
     680              :     */
     681              :     /** @{ */
     682              :     inline
     683              :     value&
     684              :     front() & noexcept;
     685              : 
     686              :     inline
     687              :     value&&
     688              :     front() && noexcept;
     689              : 
     690              :     inline
     691              :     value const&
     692              :     front() const& noexcept;
     693              :     /** @} */
     694              : 
     695              :     /** Access the last element.
     696              : 
     697              :         Returns a reference to the last element.
     698              : 
     699              :         @par Precondition
     700              :         `not empty()`
     701              : 
     702              :         @par Complexity
     703              :         Constant.
     704              :     */
     705              :     /** @{ */
     706              :     inline
     707              :     value&
     708              :     back() & noexcept;
     709              : 
     710              :     inline
     711              :     value&&
     712              :     back() && noexcept;
     713              : 
     714              :     inline
     715              :     value const&
     716              :     back() const& noexcept;
     717              :     /** @} */
     718              : 
     719              :     /** Access the underlying array directly.
     720              : 
     721              :         Returns a pointer to the underlying array serving
     722              :         as element storage. The value returned is such that
     723              :         the range `{data(), data() + size())` is always a
     724              :         valid range, even if the container is empty.
     725              : 
     726              :         @par Complexity
     727              :         Constant.
     728              : 
     729              :         @par Exception Safety
     730              :         No-throw guarantee.
     731              : 
     732              :         @note
     733              : 
     734              :         If `size() == 0`, the function may or may not return
     735              :         a null pointer.
     736              :     */
     737              :     inline
     738              :     value*
     739              :     data() noexcept;
     740              : 
     741              :     /** Access the underlying array directly.
     742              : 
     743              :         Returns a pointer to the underlying array serving
     744              :         as element storage. The value returned is such that
     745              :         the range `{data(), data() + size())` is always a
     746              :         valid range, even if the container is empty.
     747              : 
     748              :         @par Complexity
     749              :         Constant.
     750              : 
     751              :         @par Exception Safety
     752              :         No-throw guarantee.
     753              : 
     754              :         @note
     755              : 
     756              :         If `size() == 0`, the function may or may not return
     757              :         a null pointer.
     758              :     */
     759              :     inline
     760              :     value const*
     761              :     data() const noexcept;
     762              : 
     763              :     /** Return a pointer to an element, or nullptr if the index is invalid
     764              : 
     765              :         This function returns a pointer to the element
     766              :         at index `pos` when the index is less then the size
     767              :         of the container. Otherwise it returns null.
     768              : 
     769              :         @par Example
     770              :         @code
     771              :         if( auto p = arr.if_contains( 1 ) )
     772              :             std::cout << *p;
     773              :         @endcode
     774              : 
     775              :         @par Complexity
     776              :         Constant.
     777              : 
     778              :         @par Exception Safety
     779              :         No-throw guarantee.
     780              : 
     781              :         @param pos The index of the element to return.
     782              :     */
     783              :     inline
     784              :     value const*
     785              :     if_contains(std::size_t pos) const noexcept;
     786              : 
     787              :     /** Return a pointer to an element, or nullptr if the index is invalid
     788              : 
     789              :         This function returns a pointer to the element
     790              :         at index `pos` when the index is less then the size
     791              :         of the container. Otherwise it returns null.
     792              : 
     793              :         @par Example
     794              :         @code
     795              :         if( auto p = arr.if_contains( 1 ) )
     796              :             std::cout << *p;
     797              :         @endcode
     798              : 
     799              :         @par Complexity
     800              :         Constant.
     801              : 
     802              :         @par Exception Safety
     803              :         No-throw guarantee.
     804              : 
     805              :         @param pos The index of the element to return.
     806              :     */
     807              :     inline
     808              :     value*
     809              :     if_contains(std::size_t pos) noexcept;
     810              : 
     811              :     //------------------------------------------------------
     812              :     //
     813              :     // Iterators
     814              :     //
     815              :     //------------------------------------------------------
     816              : 
     817              :     /** Return an iterator to the first element.
     818              : 
     819              :         If the container is empty, @ref end() is returned.
     820              : 
     821              :         @par Complexity
     822              :         Constant.
     823              : 
     824              :         @par Exception Safety
     825              :         No-throw guarantee.
     826              :     */
     827              :     inline
     828              :     iterator
     829              :     begin() noexcept;
     830              : 
     831              :     /** Return a const iterator to the first element.
     832              : 
     833              :         If the container is empty, @ref end() is returned.
     834              : 
     835              :         @par Complexity
     836              :         Constant.
     837              : 
     838              :         @par Exception Safety
     839              :         No-throw guarantee.
     840              :     */
     841              :     inline
     842              :     const_iterator
     843              :     begin() const noexcept;
     844              : 
     845              :     /** Return a const iterator to the first element.
     846              : 
     847              :         If the container is empty, @ref cend() is returned.
     848              : 
     849              :         @par Complexity
     850              :         Constant.
     851              : 
     852              :         @par Exception Safety
     853              :         No-throw guarantee.
     854              :     */
     855              :     inline
     856              :     const_iterator
     857              :     cbegin() const noexcept;
     858              : 
     859              :     /** Return an iterator to the element following the last element.
     860              : 
     861              :         The element acts as a placeholder; attempting
     862              :         to access it results in undefined behavior.
     863              : 
     864              :         @par Complexity
     865              :         Constant.
     866              : 
     867              :         @par Exception Safety
     868              :         No-throw guarantee.
     869              :     */
     870              :     inline
     871              :     iterator
     872              :     end() noexcept;
     873              : 
     874              :     /** Return a const iterator to the element following the last element.
     875              : 
     876              :         The element acts as a placeholder; attempting
     877              :         to access it results in undefined behavior.
     878              : 
     879              :         @par Complexity
     880              :         Constant.
     881              : 
     882              :         @par Exception Safety
     883              :         No-throw guarantee.
     884              :     */
     885              :     inline
     886              :     const_iterator
     887              :     end() const noexcept;
     888              : 
     889              :     /** Return a const iterator to the element following the last element.
     890              : 
     891              :         The element acts as a placeholder; attempting
     892              :         to access it results in undefined behavior.
     893              : 
     894              :         @par Complexity
     895              :         Constant.
     896              : 
     897              :         @par Exception Safety
     898              :         No-throw guarantee.
     899              :     */
     900              :     inline
     901              :     const_iterator
     902              :     cend() const noexcept;
     903              : 
     904              :     /** Return a reverse iterator to the first element of the reversed container.
     905              : 
     906              :         The pointed-to element corresponds to the
     907              :         last element of the non-reversed container.
     908              :         If the container is empty, @ref rend() is returned.
     909              : 
     910              :         @par Complexity
     911              :         Constant.
     912              : 
     913              :         @par Exception Safety
     914              :         No-throw guarantee.
     915              :     */
     916              :     inline
     917              :     reverse_iterator
     918              :     rbegin() noexcept;
     919              : 
     920              :     /** Return a const reverse iterator to the first element of the reversed container.
     921              : 
     922              :         The pointed-to element corresponds to the
     923              :         last element of the non-reversed container.
     924              :         If the container is empty, @ref rend() is returned.
     925              : 
     926              :         @par Complexity
     927              :         Constant.
     928              : 
     929              :         @par Exception Safety
     930              :         No-throw guarantee.
     931              :     */
     932              :     inline
     933              :     const_reverse_iterator
     934              :     rbegin() const noexcept;
     935              : 
     936              :     /** Return a const reverse iterator to the first element of the reversed container.
     937              : 
     938              :         The pointed-to element corresponds to the
     939              :         last element of the non-reversed container.
     940              :         If the container is empty, @ref crend() is returned.
     941              : 
     942              :         @par Complexity
     943              :         Constant.
     944              : 
     945              :         @par Exception Safety
     946              :         No-throw guarantee.
     947              :     */
     948              :     inline
     949              :     const_reverse_iterator
     950              :     crbegin() const noexcept;
     951              : 
     952              :     /** Return a reverse iterator to the element following the last element of the reversed container.
     953              : 
     954              :         The pointed-to element corresponds to the element
     955              :         preceding the first element of the non-reversed container.
     956              :         The element acts as a placeholder; attempting
     957              :         to access it results in undefined behavior.
     958              : 
     959              :         @par Complexity
     960              :         Constant.
     961              : 
     962              :         @par Exception Safety
     963              :         No-throw guarantee.
     964              :     */
     965              :     inline
     966              :     reverse_iterator
     967              :     rend() noexcept;
     968              : 
     969              :     /** Return a const reverse iterator to the element following the last element of the reversed container.
     970              : 
     971              :         The pointed-to element corresponds to the element
     972              :         preceding the first element of the non-reversed container.
     973              :         The element acts as a placeholder; attempting
     974              :         to access it results in undefined behavior.
     975              : 
     976              :         @par Complexity
     977              :         Constant.
     978              : 
     979              :         @par Exception Safety
     980              :         No-throw guarantee.
     981              :     */
     982              :     inline
     983              :     const_reverse_iterator
     984              :     rend() const noexcept;
     985              : 
     986              :     /** Return a const reverse iterator to the element following the last element of the reversed container.
     987              : 
     988              :         The pointed-to element corresponds to the element
     989              :         preceding the first element of the non-reversed container.
     990              :         The element acts as a placeholder; attempting
     991              :         to access it results in undefined behavior.
     992              : 
     993              :         @par Complexity
     994              :         Constant.
     995              : 
     996              :         @par Exception Safety
     997              :         No-throw guarantee.
     998              :     */
     999              :     inline
    1000              :     const_reverse_iterator
    1001              :     crend() const noexcept;
    1002              : 
    1003              :     //------------------------------------------------------
    1004              :     //
    1005              :     // Capacity
    1006              :     //
    1007              :     //------------------------------------------------------
    1008              : 
    1009              :     /** Return the number of elements in the array.
    1010              : 
    1011              :         This returns the number of elements in the array.
    1012              :         The value returned may be different from the number
    1013              :         returned from @ref capacity.
    1014              : 
    1015              :         @par Complexity
    1016              :         Constant.
    1017              : 
    1018              :         @par Exception Safety
    1019              :         No-throw guarantee.
    1020              :     */
    1021              :     inline
    1022              :     std::size_t
    1023              :     size() const noexcept;
    1024              : 
    1025              :     /** Return the maximum number of elements any array can hold.
    1026              : 
    1027              :         The maximum is an implementation-defined number.
    1028              :         This value is a theoretical limit; at runtime,
    1029              :         the actual maximum size may be less due to
    1030              :         resource limits.
    1031              : 
    1032              :         @par Complexity
    1033              :         Constant.
    1034              : 
    1035              :         @par Exception Safety
    1036              :         No-throw guarantee.
    1037              :     */
    1038              :     static
    1039              :     inline
    1040              :     constexpr
    1041              :     std::size_t
    1042              :     max_size() noexcept;
    1043              : 
    1044              :     /** Return the number of elements that can be held in currently allocated memory.
    1045              : 
    1046              :         This number may be larger than the value returned
    1047              :         by @ref size().
    1048              : 
    1049              :         @par Complexity
    1050              :         Constant.
    1051              : 
    1052              :         @par Exception Safety
    1053              :         No-throw guarantee.
    1054              :     */
    1055              :     inline
    1056              :     std::size_t
    1057              :     capacity() const noexcept;
    1058              : 
    1059              :     /** Check if the array has no elements.
    1060              : 
    1061              :         Returns `true` if there are no elements in the
    1062              :         array, i.e. @ref size() returns 0.
    1063              : 
    1064              :         @par Complexity
    1065              :         Constant.
    1066              : 
    1067              :         @par Exception Safety
    1068              :         No-throw guarantee.
    1069              :     */
    1070              :     inline
    1071              :     bool
    1072              :     empty() const noexcept;
    1073              : 
    1074              :     /** Increase the capacity to at least a certain amount.
    1075              : 
    1076              :         This increases the @ref capacity() to a value
    1077              :         that is greater than or equal to `new_capacity`.
    1078              :         If `new_capacity > capacity()`, new memory is
    1079              :         allocated. Otherwise, the call has no effect.
    1080              :         The number of elements and therefore the
    1081              :         @ref size() of the container is not changed.
    1082              :     \n
    1083              :         If new memory is allocated, all iterators
    1084              :         including any past-the-end iterators, and all
    1085              :         references to the elements are invalidated.
    1086              :         Otherwise, no iterators or references are
    1087              :         invalidated.
    1088              : 
    1089              :         @par Complexity
    1090              :         At most, linear in @ref size().
    1091              : 
    1092              :         @par Exception Safety
    1093              :         Strong guarantee.
    1094              :         Calls to `memory_resource::allocate` may throw.
    1095              : 
    1096              :         @param new_capacity The new capacity of the array.
    1097              : 
    1098              :         @throw `boost::system::system_error` `new_capacity > max_size()`.
    1099              :     */
    1100              :     inline
    1101              :     void
    1102              :     reserve(std::size_t new_capacity);
    1103              : 
    1104              :     /** Request the removal of unused capacity.
    1105              : 
    1106              :         This performs a non-binding request to reduce the
    1107              :         capacity to the current size. The request may or
    1108              :         may not be fulfilled. If reallocation occurs, all
    1109              :         iterators including any past-the-end iterators,
    1110              :         and all references to the elements are invalidated.
    1111              :         Otherwise, no iterators or references are
    1112              :         invalidated.
    1113              : 
    1114              :         @par Complexity
    1115              :         At most, linear in @ref size().
    1116              : 
    1117              :         @par Exception Safety
    1118              :         No-throw guarantee.
    1119              :     */
    1120              :     BOOST_JSON_DECL
    1121              :     void
    1122              :     shrink_to_fit() noexcept;
    1123              : 
    1124              :     //------------------------------------------------------
    1125              :     //
    1126              :     // Modifiers
    1127              :     //
    1128              :     //------------------------------------------------------
    1129              : 
    1130              :     /** Clear the contents.
    1131              : 
    1132              :         Erases all elements from the container. After this
    1133              :         call, @ref size() returns zero but @ref capacity()
    1134              :         is unchanged. All references, pointers, or iterators
    1135              :         referring to contained elements are invalidated. Any
    1136              :         past-the-end iterators are also invalidated.
    1137              : 
    1138              :         @par Complexity
    1139              :         Linear in @ref size().
    1140              : 
    1141              :         @par Exception Safety
    1142              :         No-throw guarantee.
    1143              :     */
    1144              :     BOOST_JSON_DECL
    1145              :     void
    1146              :     clear() noexcept;
    1147              : 
    1148              :     /** Insert elements before the specified location.
    1149              : 
    1150              :         This inserts a copy of `v` before `pos`.
    1151              :         If `capacity() < size() + 1`, a reallocation
    1152              :         occurs first, and all iterators and references
    1153              :         are invalidated.
    1154              :         Otherwise, only the iterators and references from
    1155              :         the insertion point forward are invalidated. All
    1156              :         past-the-end iterators are also invalidated.
    1157              : 
    1158              :         @par Complexity
    1159              :         Constant plus linear in `std::distance(pos, end())`.
    1160              : 
    1161              :         @par Exception Safety
    1162              :         Strong guarantee.
    1163              :         Calls to `memory_resource::allocate` may throw.
    1164              : 
    1165              :         @param pos Iterator before which the content will
    1166              :         be inserted. This may be the @ref end() iterator.
    1167              : 
    1168              :         @param v The value to insert. A copy will be made
    1169              :         using container's associated `boost::container::pmr::memory_resource`.
    1170              : 
    1171              :         @return An iterator to the inserted value
    1172              :     */
    1173              :     BOOST_JSON_DECL
    1174              :     iterator
    1175              :     insert(
    1176              :         const_iterator pos,
    1177              :         value const& v);
    1178              : 
    1179              :     /** Insert elements before the specified location.
    1180              : 
    1181              :         This inserts `v` before `pos` via move-construction.
    1182              :         If `capacity() < size() + 1`, a reallocation occurs
    1183              :         first, and all iterators and references are
    1184              :         invalidated.
    1185              :         Otherwise, only the iterators and references from
    1186              :         the insertion point forward are invalidated. All
    1187              :         past-the-end iterators are also invalidated.
    1188              : 
    1189              :         @par Complexity
    1190              :         Constant plus linear in `std::distance(pos, end())`.
    1191              : 
    1192              :         @par Exception Safety
    1193              :         Strong guarantee.
    1194              :         Calls to `memory_resource::allocate` may throw.
    1195              : 
    1196              :         @param pos Iterator before which the content will
    1197              :         be inserted. This may be the @ref end() iterator.
    1198              : 
    1199              :         @param v The value to insert. Ownership of the
    1200              :         value will be transferred via move construction,
    1201              :         using the container's
    1202              :         associated `boost::container::pmr::memory_resource`.
    1203              : 
    1204              :         @return An iterator to the inserted value
    1205              :     */
    1206              :     BOOST_JSON_DECL
    1207              :     iterator
    1208              :     insert(
    1209              :         const_iterator pos,
    1210              :         value&& v);
    1211              : 
    1212              :     /** Insert elements before the specified location.
    1213              : 
    1214              :         This inserts `count` copies of `v` before `pos`.
    1215              :         If `capacity() < size() + count`, a reallocation
    1216              :         occurs first, and all iterators and references are
    1217              :         invalidated.
    1218              :         Otherwise, only the iterators and references from
    1219              :         the insertion point forward are invalidated. All
    1220              :         past-the-end iterators are also invalidated.
    1221              : 
    1222              :         @par Complexity
    1223              :         Linear in `count + std::distance(pos, end())`.
    1224              : 
    1225              :         @par Exception Safety
    1226              :         Strong guarantee.
    1227              :         Calls to `memory_resource::allocate` may throw.
    1228              : 
    1229              :         @param pos Iterator before which the content will
    1230              :         be inserted. This may be the @ref end() iterator.
    1231              : 
    1232              :         @param count The number of copies to insert.
    1233              : 
    1234              :         @param v The value to insert. Copies will be made
    1235              :         using the container's
    1236              :         associated `boost::container::pmr::memory_resource`.
    1237              : 
    1238              :         @return An iterator to the first inserted value,
    1239              :         or `pos` if `count == 0`.
    1240              :     */
    1241              :     BOOST_JSON_DECL
    1242              :     iterator
    1243              :     insert(
    1244              :         const_iterator pos,
    1245              :         std::size_t count,
    1246              :         value const& v);
    1247              : 
    1248              :     /** Insert elements before the specified location.
    1249              : 
    1250              :         The elements in the range `{first, last)` are
    1251              :         inserted in order.
    1252              :         If `capacity() < size() + std::distance(first, last)`,
    1253              :         a reallocation occurs first, and all iterators and
    1254              :         references are invalidated.
    1255              :         Otherwise, only the iterators and references from
    1256              :         the insertion point forward are invalidated. All
    1257              :         past-the-end iterators are also invalidated.
    1258              : 
    1259              :         @par Precondition
    1260              :         `first` and `last` are not iterators into `*this`.
    1261              : 
    1262              :         @par Constraints
    1263              :         @code
    1264              :         not std::is_convertible_v<InputIt, value>
    1265              :         @endcode
    1266              : 
    1267              :         @par Mandates
    1268              :         @code
    1269              :         std::is_constructible_v<value, std::iterator_traits<InputIt>::reference>
    1270              :         @endcode
    1271              : 
    1272              :         @par Complexity
    1273              :         Linear in `std::distance(first, last) + std::distance(pos, end())`.
    1274              : 
    1275              :         @par Exception Safety
    1276              :         Strong guarantee.
    1277              :         Calls to `memory_resource::allocate` may throw.
    1278              : 
    1279              :         @return An iterator to the first inserted value, or
    1280              :         `pos` if `first == last`.
    1281              : 
    1282              :         @param pos Iterator before which the content will
    1283              :         be inserted. This may be the @ref end() iterator.
    1284              : 
    1285              :         @param first An input iterator pointing to the first
    1286              :         element to insert, or pointing to the end of the range.
    1287              : 
    1288              :         @param last An input iterator pointing to the end
    1289              :         of the range.
    1290              : 
    1291              :         @tparam InputIt a type satisfying the requirements
    1292              :         of __InputIterator__.
    1293              :     */
    1294              :     template<
    1295              :         class InputIt
    1296              :     #ifndef BOOST_JSON_DOCS
    1297              :         ,class = typename std::enable_if<
    1298              :             std::is_constructible<value,
    1299              :                 typename std::iterator_traits<
    1300              :                     InputIt>::reference>::value>::type
    1301              :     #endif
    1302              :     >
    1303              :     iterator
    1304              :     insert(
    1305              :         const_iterator pos,
    1306              :         InputIt first, InputIt last);
    1307              : 
    1308              :     /** Insert elements before the specified location.
    1309              : 
    1310              :         The elements in the initializer list `init` are
    1311              :         inserted in order.
    1312              :         If `capacity() < size() + init.size()`,
    1313              :         a reallocation occurs first, and all iterators and
    1314              :         references are invalidated.
    1315              :         Otherwise, only the iterators and references from
    1316              :         the insertion point forward are invalidated. All
    1317              :         past-the-end iterators are also invalidated.
    1318              : 
    1319              :         @par Complexity
    1320              :         Linear in `init.size() + std::distance(pos, end())`.
    1321              : 
    1322              :         @par Exception Safety
    1323              :         Strong guarantee.
    1324              :         Calls to `memory_resource::allocate` may throw.
    1325              : 
    1326              :         @param pos Iterator before which the content will
    1327              :         be inserted. This may be the @ref end() iterator.
    1328              : 
    1329              :         @param init The initializer list to insert
    1330              : 
    1331              :         @return An iterator to the first inserted value, or
    1332              :         `pos` if `init.size() == 0`.
    1333              :     */
    1334              :     BOOST_JSON_DECL
    1335              :     iterator
    1336              :     insert(
    1337              :         const_iterator pos,
    1338              :         std::initializer_list<value_ref> init);
    1339              : 
    1340              :     /** Insert a constructed element in-place.
    1341              : 
    1342              :         Inserts a new element into the container directly before
    1343              :         `pos`. The element is constructed using placement-new
    1344              :         with the parameter `std::forward<Arg>(arg)`.
    1345              :         If `capacity() < size() + 1`,
    1346              :         a reallocation occurs first, and all iterators and
    1347              :         references are invalidated.
    1348              :         Otherwise, only the iterators and references from
    1349              :         the insertion point forward are invalidated. All
    1350              :         past-the-end iterators are also invalidated.
    1351              : 
    1352              :         @par Complexity
    1353              :         Constant plus linear in `std::distance(pos, end())`.
    1354              : 
    1355              :         @par Exception Safety
    1356              :         Strong guarantee.
    1357              :         Calls to `memory_resource::allocate` may throw.
    1358              : 
    1359              :         @param pos Iterator before which the element will
    1360              :         be inserted. This may be the @ref end() iterator.
    1361              : 
    1362              :         @param arg The argument to forward to the @ref value
    1363              :         constructor.
    1364              : 
    1365              :         @return An iterator to the inserted element
    1366              :     */
    1367              :     template<class Arg>
    1368              :     iterator
    1369              :     emplace(
    1370              :         const_iterator pos,
    1371              :         Arg&& arg);
    1372              : 
    1373              :     /** Erase elements from the container.
    1374              : 
    1375              :         The element at `pos` is removed.
    1376              : 
    1377              :         @par Complexity
    1378              :         Constant plus linear in `std::distance(pos, end())`
    1379              : 
    1380              :         @par Exception Safety
    1381              :         No-throw guarantee.
    1382              : 
    1383              :         @param pos Iterator to the element to remove
    1384              : 
    1385              :         @return Iterator following the last removed element.
    1386              :         If the iterator `pos` refers to the last element,
    1387              :         the @ref end() iterator is returned.
    1388              :     */
    1389              :     BOOST_JSON_DECL
    1390              :     iterator
    1391              :     erase(const_iterator pos) noexcept;
    1392              : 
    1393              :     /** Erase elements from the container.
    1394              : 
    1395              :         The elements in the range `{first, last)` are removed.
    1396              : 
    1397              :         @par Complexity
    1398              :         Linear in `std::distance(first, end())`
    1399              : 
    1400              :         @par Exception Safety
    1401              :         No-throw guarantee.
    1402              : 
    1403              :         @param first An iterator pointing to the first
    1404              :         element to erase, or pointing to the end of the range.
    1405              : 
    1406              :         @param last An iterator pointing to one past the
    1407              :         last element to erase, or pointing to the end of the
    1408              :         range.
    1409              : 
    1410              :         @return Iterator following the last removed element.
    1411              :         If the iterator `last` refers to the last element,
    1412              :         the @ref end() iterator is returned.
    1413              :     */
    1414              :     BOOST_JSON_DECL
    1415              :     iterator
    1416              :     erase(
    1417              :         const_iterator first,
    1418              :         const_iterator last) noexcept;
    1419              : 
    1420              :     /** Add an element to the end.
    1421              : 
    1422              :         This appends a copy of `v` to the container's
    1423              :         elements.
    1424              :         If `capacity() < size() + 1`, a reallocation
    1425              :         occurs first, and all iterators and references
    1426              :         are invalidated. Any past-the-end iterators are
    1427              :         always invalidated.
    1428              : 
    1429              :         @par Complexity
    1430              :         Amortized constant.
    1431              : 
    1432              :         @par Exception Safety
    1433              :         Strong guarantee.
    1434              :         Calls to `memory_resource::allocate` may throw.
    1435              : 
    1436              :         @param v The value to insert. A copy will be made using the container's
    1437              :         associated `boost::container::pmr::memory_resource`.
    1438              :     */
    1439              :     BOOST_JSON_DECL
    1440              :     void
    1441              :     push_back(value const& v);
    1442              : 
    1443              :     /** Add an element to the end.
    1444              : 
    1445              :         This appends `v` to the container's elements via
    1446              :         move-construction.
    1447              :         If `capacity() < size() + 1`, a reallocation
    1448              :         occurs first, and all iterators and references
    1449              :         are invalidated. Any past-the-end iterators are
    1450              :         always invalidated.
    1451              : 
    1452              :         @par Complexity
    1453              :         Amortized constant.
    1454              : 
    1455              :         @par Exception Safety
    1456              :         Strong guarantee.
    1457              :         Calls to `memory_resource::allocate` may throw.
    1458              : 
    1459              :         @param v The value to insert. Ownership of the value will be
    1460              :         transferred via move construction, using the container's
    1461              :         associated `boost::container::pmr::memory_resource`.
    1462              :     */
    1463              :     BOOST_JSON_DECL
    1464              :     void
    1465              :     push_back(value&& v);
    1466              : 
    1467              :     /** Append a constructed element in-place.
    1468              : 
    1469              :         Appends a new element to the end of the container's
    1470              :         list of elements.
    1471              :         The element is constructed using placement-new
    1472              :         with the parameter `std::forward<Arg>(arg)`.
    1473              :         If `capacity() < size() + 1`,
    1474              :         a reallocation occurs first, and all iterators and
    1475              :         references are invalidated.
    1476              :         Otherwise, only the iterators and references from
    1477              :         the insertion point forward are invalidated. All
    1478              :         past-the-end iterators are also invalidated.
    1479              : 
    1480              :         @par Complexity
    1481              :         Amortized constant.
    1482              : 
    1483              :         @par Exception Safety
    1484              :         Strong guarantee.
    1485              :         Calls to `memory_resource::allocate` may throw.
    1486              : 
    1487              :         @param arg The argument to forward to the @ref value
    1488              :         constructor.
    1489              : 
    1490              :         @return A reference to the inserted element
    1491              :     */
    1492              :     template<class Arg>
    1493              :     value&
    1494              :     emplace_back(Arg&& arg);
    1495              : 
    1496              :     /** Remove the last element
    1497              : 
    1498              :         The last element of the container is erased.
    1499              : 
    1500              :         @par Precondition
    1501              :         `not empty()`
    1502              : 
    1503              :         @par Exception Safety
    1504              :         No-throw guarantee.
    1505              :     */
    1506              :     BOOST_JSON_DECL
    1507              :     void
    1508              :     pop_back() noexcept;
    1509              : 
    1510              :     /** Change the number of elements stored.
    1511              : 
    1512              :         Resizes the container to contain `count` elements.
    1513              :         If `capacity() < size() + count`, a reallocation
    1514              :         occurs first, and all iterators and references
    1515              :         are invalidated. Any past-the-end iterators are
    1516              :         always invalidated.
    1517              : 
    1518              :         @li If `size() > count`, the container is reduced
    1519              :         to its first `count` elements.
    1520              : 
    1521              :         @li If `size() < count`, additional null values
    1522              :         are appended.
    1523              : 
    1524              :         @par Complexity
    1525              :         Linear in `abs(size() - count)`, plus the cost of
    1526              :         reallocation if @ref capacity() is less than `count`.
    1527              : 
    1528              :         @par Exception Safety
    1529              :         Strong guarantee.
    1530              :         Calls to `memory_resource::allocate` may throw.
    1531              : 
    1532              :         @param count The new size of the container.
    1533              :     */
    1534              :     BOOST_JSON_DECL
    1535              :     void
    1536              :     resize(std::size_t count);
    1537              : 
    1538              :     /** Change the number of elements stored.
    1539              : 
    1540              :         Resizes the container to contain `count` elements.
    1541              :         If `capacity() < size() + count`, a reallocation
    1542              :         occurs first, and all iterators and references
    1543              :         are invalidated. Any past-the-end iterators are
    1544              :         always invalidated.
    1545              : 
    1546              :         @li If `size() > count`, the container is reduced
    1547              :         to its first `count` elements.
    1548              : 
    1549              :         @li If `size() < count`, additional copies of `v`
    1550              :         are appended.
    1551              : 
    1552              :         @par Complexity
    1553              :         Linear in `abs(size() - count)`, plus the cost of
    1554              :         reallocation if @ref capacity() is less than `count`.
    1555              : 
    1556              :         @par Exception Safety
    1557              :         Strong guarantee.
    1558              :         Calls to `memory_resource::allocate` may throw.
    1559              : 
    1560              :         @param count The new size of the container.
    1561              : 
    1562              :         @param v The @ref value to copy into the new elements.
    1563              :     */
    1564              :     BOOST_JSON_DECL
    1565              :     void
    1566              :     resize(
    1567              :         std::size_t count,
    1568              :         value const& v);
    1569              : 
    1570              :     /** Swap the contents.
    1571              : 
    1572              :         Exchanges the contents of this array with another
    1573              :         array. Ownership of the respective
    1574              :         `boost::container::pmr::memory_resource` objects is not transferred.
    1575              : 
    1576              :         @li If `*other.storage() == *this->storage()`,
    1577              :         ownership of the underlying memory is swapped in
    1578              :         constant time, with no possibility of exceptions.
    1579              :         All iterators and references remain valid.
    1580              : 
    1581              :         @li If `*other.storage() != *this->storage()`,
    1582              :         the contents are logically swapped by making copies,
    1583              :         which can throw. In this case all iterators and
    1584              :         references are invalidated.
    1585              : 
    1586              :         @par Complexity
    1587              :         Constant or linear in @ref size() plus `other.size()`.
    1588              : 
    1589              :         @par Exception Safety
    1590              :         Strong guarantee.
    1591              :         Calls to `memory_resource::allocate` may throw.
    1592              : 
    1593              :         @param other The value to swap with.
    1594              :         If `this == &other`, this function call has no effect.
    1595              :     */
    1596              :     BOOST_JSON_DECL
    1597              :     void
    1598              :     swap(array& other);
    1599              : 
    1600              :     /** Exchange the given values.
    1601              : 
    1602              :         Exchanges the contents of the array `lhs` with another array `rhs`.
    1603              :         Ownership of the respective `boost::container::pmr::memory_resource`
    1604              :         objects is not transferred.
    1605              : 
    1606              :         @li If `*lhs.storage() == *rhs.storage()`,
    1607              :         ownership of the underlying memory is swapped in
    1608              :         constant time, with no possibility of exceptions.
    1609              :         All iterators and references remain valid.
    1610              : 
    1611              :         @li If `*lhs.storage() != *rhs.storage()`,
    1612              :         the contents are logically swapped by making a copy,
    1613              :         which can throw. In this case all iterators and
    1614              :         references are invalidated.
    1615              : 
    1616              :         @par Effects
    1617              :         @code
    1618              :         lhs.swap( rhs );
    1619              :         @endcode
    1620              : 
    1621              :         @par Complexity
    1622              :         Constant or linear in `lhs.size() + rhs.size()`.
    1623              : 
    1624              :         @par Exception Safety
    1625              :         Strong guarantee.
    1626              :         Calls to `memory_resource::allocate` may throw.
    1627              : 
    1628              :         @param lhs The array to exchange.
    1629              : 
    1630              :         @param rhs The array to exchange.
    1631              :         If `&lhs == &rhs`, this function call has no effect.
    1632              : 
    1633              :         @see @ref array::swap
    1634              :     */
    1635              :     friend
    1636              :     void
    1637            1 :     swap(array& lhs, array& rhs)
    1638              :     {
    1639            1 :         lhs.swap(rhs);
    1640            1 :     }
    1641              : 
    1642              :     /** Return `true` if two arrays are equal.
    1643              : 
    1644              :         Arrays are equal when their sizes are
    1645              :         the same, and they are element-for-element
    1646              :         equal in order.
    1647              : 
    1648              :         @par Effects
    1649              :         `return std::equal( lhs.begin(), lhs.end(), rhs.begin(), rhs.end() );`
    1650              : 
    1651              :         @par Complexity
    1652              :         Constant or linear in `lhs.size()`.
    1653              : 
    1654              :         @par Exception Safety
    1655              :         No-throw guarantee.
    1656              :     */
    1657              :     // inline friend speeds up overload resolution
    1658              :     friend
    1659              :     bool
    1660           88 :     operator==(
    1661              :         array const& lhs,
    1662              :         array const& rhs) noexcept
    1663              :     {
    1664           88 :         return lhs.equal(rhs);
    1665              :     }
    1666              : 
    1667              :     /** Return `true` if two arrays are not equal.
    1668              : 
    1669              :         Arrays are equal when their sizes are
    1670              :         the same, and they are element-for-element
    1671              :         equal in order.
    1672              : 
    1673              :         @par Effects
    1674              :         `return ! std::equal( lhs.begin(), lhs.end(), rhs.begin(), rhs.end() );`
    1675              : 
    1676              :         @par Complexity
    1677              :         Constant or linear in `lhs.size()`.
    1678              : 
    1679              :         @par Exception Safety
    1680              :         No-throw guarantee.
    1681              :     */
    1682              :     // inline friend speeds up overload resolution
    1683              :     friend
    1684              :     bool
    1685            9 :     operator!=(
    1686              :         array const& lhs,
    1687              :         array const& rhs) noexcept
    1688              :     {
    1689            9 :         return ! (lhs == rhs);
    1690              :     }
    1691              : 
    1692              :     /** Serialize @ref array to an output stream.
    1693              : 
    1694              :         This function serializes an `array` as JSON into the output stream.
    1695              : 
    1696              :         @return Reference to `os`.
    1697              : 
    1698              :         @par Complexity
    1699              :         Constant or linear in the size of `arr`.
    1700              : 
    1701              :         @par Exception Safety
    1702              :         Strong guarantee.
    1703              :         Calls to `memory_resource::allocate` may throw.
    1704              : 
    1705              :         @param os The output stream to serialize to.
    1706              : 
    1707              :         @param arr The value to serialize.
    1708              :     */
    1709              :     BOOST_JSON_DECL
    1710              :     friend
    1711              :     std::ostream&
    1712              :     operator<<(
    1713              :         std::ostream& os,
    1714              :         array const& arr);
    1715              : 
    1716              : private:
    1717              :     template<class It>
    1718              :     using iter_cat = typename
    1719              :         std::iterator_traits<It>::iterator_category;
    1720              : 
    1721              :     template<class InputIt>
    1722              :     array(
    1723              :         InputIt first, InputIt last,
    1724              :         storage_ptr sp,
    1725              :         std::input_iterator_tag);
    1726              : 
    1727              :     template<class InputIt>
    1728              :     array(
    1729              :         InputIt first, InputIt last,
    1730              :         storage_ptr sp,
    1731              :         std::forward_iterator_tag);
    1732              : 
    1733              :     inline
    1734              :     std::size_t
    1735              :     growth(std::size_t new_size) const;
    1736              : 
    1737              :     BOOST_JSON_DECL
    1738              :     void
    1739              :     reserve_impl(
    1740              :         std::size_t new_capacity);
    1741              : 
    1742              :     BOOST_JSON_DECL
    1743              :     value&
    1744              :     push_back(
    1745              :         pilfered<value> pv);
    1746              : 
    1747              :     BOOST_JSON_DECL
    1748              :     iterator
    1749              :     insert(
    1750              :         const_iterator pos,
    1751              :         pilfered<value> pv);
    1752              : 
    1753              :     template<class InputIt>
    1754              :     iterator
    1755              :     insert(
    1756              :         const_iterator pos,
    1757              :         InputIt first, InputIt last,
    1758              :         std::input_iterator_tag);
    1759              : 
    1760              :     template<class InputIt>
    1761              :     iterator
    1762              :     insert(
    1763              :         const_iterator pos,
    1764              :         InputIt first, InputIt last,
    1765              :         std::forward_iterator_tag);
    1766              : 
    1767              :     BOOST_JSON_DECL
    1768              :     bool
    1769              :     equal(array const& other) const noexcept;
    1770              : };
    1771              : 
    1772              : } // namespace json
    1773              : } // namespace boost
    1774              : 
    1775              : // std::hash specialization
    1776              : #ifndef BOOST_JSON_DOCS
    1777              : namespace std {
    1778              : template <>
    1779              : struct hash< ::boost::json::array > {
    1780              :     BOOST_JSON_DECL
    1781              :     std::size_t
    1782              :     operator()(::boost::json::array const& ja) const noexcept;
    1783              : };
    1784              : } // std
    1785              : #endif
    1786              : 
    1787              : // Must be included here for this file to stand alone
    1788              : #include <boost/json/value.hpp>
    1789              : 
    1790              : // includes are at the bottom of <boost/json/value.hpp>
    1791              : 
    1792              : #endif
        

Generated by: LCOV version 2.1