LCOV - code coverage report
Current view: top level - json - array.hpp (source / functions) Coverage Total Hit
Test: coverage_remapped.info Lines: 100.0 % 29 29
Test Date: 2026-03-05 09:04:27 Functions: 100.0 % 9 9

           TLA  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 HIT          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.3