LCOV - code coverage report
Current view: top level - json - static_resource.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 3 3
Test Date: 2025-12-23 17:38:56 Functions: 50.0 % 4 2

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2020 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_STATIC_RESOURCE_HPP
      11              : #define BOOST_JSON_STATIC_RESOURCE_HPP
      12              : 
      13              : #include <boost/container/pmr/memory_resource.hpp>
      14              : #include <boost/json/detail/config.hpp>
      15              : #include <boost/json/is_deallocate_trivial.hpp>
      16              : #include <cstddef>
      17              : 
      18              : namespace boost {
      19              : namespace json {
      20              : 
      21              : #ifdef _MSC_VER
      22              : #pragma warning(push)
      23              : #pragma warning(disable: 4275) // non dll-interface class used as base for dll-interface class
      24              : #endif
      25              : 
      26              : //----------------------------------------------------------
      27              : 
      28              : /** A resource using a caller-owned buffer, with a trivial deallocate.
      29              : 
      30              :     This memory resource is a special-purpose resource that releases allocated
      31              :     memory only when the resource is destroyed (or when @ref release is
      32              :     called). It has a trivial deallocate function; that is, the metafunction
      33              :     @ref is_deallocate_trivial returns `true`.
      34              : 
      35              :     The resource is constructed from a caller-owned buffer from which
      36              :     subsequent calls to allocate are apportioned. When a memory request cannot
      37              :     be satisfied from the free bytes remaining in the buffer, the allocation
      38              :     request fails with the exception `std::bad_alloc`.
      39              : 
      40              :     @par Example
      41              :     This parses a JSON text into a value which uses a local stack buffer, then
      42              :     prints the result.
      43              : 
      44              :     @code
      45              :     unsigned char buf[ 4000 ];
      46              :     static_resource mr( buf );
      47              : 
      48              :     // Parse the string, using our memory resource
      49              :     value const jv = parse( "[1,2,3]", &mr );
      50              : 
      51              :     // Print the JSON
      52              :     std::cout << jv;
      53              :     @endcode
      54              : 
      55              :     @par Thread Safety
      56              :     Members of the same instance may not be called concurrently.
      57              : 
      58              :     @see https://en.wikipedia.org/wiki/Region-based_memory_management
      59              : */
      60              : class
      61              :     BOOST_JSON_DECL
      62              :     BOOST_SYMBOL_VISIBLE
      63              : static_resource final
      64              :     : public container::pmr::memory_resource
      65              : {
      66              :     void* p_;
      67              :     std::size_t n_;
      68              :     std::size_t size_;
      69              : 
      70              : public:
      71              :     /** Assignment operator.
      72              : 
      73              :         The type is neither copyable nor movable, so this operator is deleted.
      74              :     */
      75              :     static_resource& operator=(
      76              :         static_resource const&) = delete;
      77              : 
      78              :     /** Constructors.
      79              : 
      80              :         These construct the resource to use the specified buffer for subsequent
      81              :         calls to allocate. When the buffer is exhausted, allocate will throw
      82              :         `std::bad_alloc`.
      83              : 
      84              :         Ownership of `buffer` is not transferred; the caller is responsible for
      85              :         ensuring that its lifetime extends until the resource is destroyed.
      86              : 
      87              :         Overload **(5)** is the copy constructor. The type is neither copyable
      88              :         nor movable, so this overload is deleted.
      89              : 
      90              :         @par Complexity
      91              :         Constant.
      92              : 
      93              :         @par Exception Safety
      94              :         No-throw guarantee.
      95              : 
      96              :         @param buffer The buffer to use.
      97              :         @param size The number of valid bytes pointed to by `buffer`.
      98              : 
      99              :         @{
     100              :     */
     101              :     static_resource(
     102              :         unsigned char* buffer,
     103              :         std::size_t size) noexcept;
     104              : 
     105              : #if defined(__cpp_lib_byte) || defined(BOOST_JSON_DOCS)
     106              :     static_resource(
     107              :         std::byte* buffer,
     108              :         std::size_t size) noexcept
     109              :         : static_resource(reinterpret_cast<
     110              :             unsigned char*>(buffer), size)
     111              :     {
     112              :     }
     113              : #endif
     114              : 
     115              :     /** Overload
     116              : 
     117              :         @tparam N The size of `buffer`.
     118              :         @param buffer
     119              :     */
     120              :     template<std::size_t N>
     121              :     explicit
     122            3 :     static_resource(
     123              :         unsigned char(&buffer)[N]) noexcept
     124            3 :         : static_resource(&buffer[0], N)
     125              :     {
     126            3 :     }
     127              : 
     128              : #if defined(__cpp_lib_byte) || defined(BOOST_JSON_DOCS)
     129              :     /** Overload
     130              : 
     131              :         @tparam N
     132              :         @param buffer
     133              :     */
     134              :     template<std::size_t N>
     135              :     explicit
     136              :     static_resource(
     137              :         std::byte(&buffer)[N]) noexcept
     138              :         : static_resource(&buffer[0], N)
     139              :     {
     140              :     }
     141              : #endif
     142              : 
     143              : #ifndef BOOST_JSON_DOCS
     144              :     // Safety net for accidental buffer overflows
     145              :     template<std::size_t N>
     146              :     static_resource(
     147              :         unsigned char(&buffer)[N], std::size_t n) noexcept
     148              :         : static_resource(&buffer[0], n)
     149              :     {
     150              :         // If this goes off, check your parameters
     151              :         // closely, chances are you passed an array
     152              :         // thinking it was a pointer.
     153              :         BOOST_ASSERT(n <= N);
     154              :     }
     155              : 
     156              : #ifdef __cpp_lib_byte
     157              :     // Safety net for accidental buffer overflows
     158              :     template<std::size_t N>
     159              :     static_resource(
     160              :         std::byte(&buffer)[N], std::size_t n) noexcept
     161              :         : static_resource(&buffer[0], n)
     162              :     {
     163              :         // If this goes off, check your parameters
     164              :         // closely, chances are you passed an array
     165              :         // thinking it was a pointer.
     166              :         BOOST_ASSERT(n <= N);
     167              :     }
     168              : #endif
     169              : #endif
     170              : 
     171              :     /// Overload
     172              :     static_resource(
     173              :         static_resource const&) = delete;
     174              :     /// @}
     175              : 
     176              :     /** Release all allocated memory.
     177              : 
     178              :         This function resets the buffer provided upon construction so that all
     179              :         of the valid bytes are available for subsequent allocation.
     180              : 
     181              :         @par Complexity
     182              :         Constant
     183              : 
     184              :         @par Exception Safety
     185              :         No-throw guarantee.
     186              :     */
     187              :     void
     188              :     release() noexcept;
     189              : 
     190              : protected:
     191              : #ifndef BOOST_JSON_DOCS
     192              :     void*
     193              :     do_allocate(
     194              :         std::size_t n,
     195              :         std::size_t align) override;
     196              : 
     197              :     void
     198              :     do_deallocate(
     199              :         void* p,
     200              :         std::size_t n,
     201              :         std::size_t align) override;
     202              : 
     203              :     bool
     204              :     do_is_equal(
     205              :         memory_resource const& mr
     206              :             ) const noexcept override;
     207              : #endif
     208              : };
     209              : 
     210              : #ifdef _MSC_VER
     211              : #pragma warning(pop)
     212              : #endif
     213              : 
     214              : template<>
     215              : struct is_deallocate_trivial<
     216              :     static_resource>
     217              : {
     218              :     static constexpr bool value = true;
     219              : };
     220              : 
     221              : } // namespace json
     222              : } // namespace boost
     223              : 
     224              : #endif
        

Generated by: LCOV version 2.1