1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
//
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// Official repository: https://github.com/boostorg/json
//
#include <boost/json/monotonic_resource.hpp>
#include <boost/json/parse.hpp>
#include <boost/json/static_resource.hpp>
#include <boost/json/storage_ptr.hpp>
#include <boost/json/value.hpp>
#include <iostream>
#include "test_suite.hpp"
namespace boost {
namespace json {
//----------------------------------------------------------
static void set1() {
//----------------------------------------------------------
{
// tag::doc_storage_ptr_1[]
storage_ptr sp1;
storage_ptr sp2;
assert( sp1.get() != nullptr ); // always points to a valid resource
assert( sp1.get() == sp2.get() ); // both point to the default resource
assert( *sp1.get() == *sp2.get() ); // the default resource compares equal
// end::doc_storage_ptr_1[]
}
//----------------------------------------------------------
{
// tag::doc_storage_ptr_2[]
array arr; // default construction
object obj;
string str;
value jv;
assert( jv.storage().get() == storage_ptr().get() ); // uses the default memory resource
assert( jv.storage().get() == arr.storage().get() ); // both point to the default resource
assert( *arr.storage() == *obj.storage() ); // containers use equivalent resources
// end::doc_storage_ptr_2[]
}
//----------------------------------------------------------
{
// tag::doc_storage_ptr_3[]
monotonic_resource mr;
value const jv = parse( "[1,2,3]", &mr );
// end::doc_storage_ptr_3[]
}
//----------------------------------------------------------
} // set1
//----------------------------------------------------------
// tag::doc_storage_ptr_4[]
value parse_value( string_view s)
{
return parse( s, make_shared_resource< monotonic_resource >() );
}
// end::doc_storage_ptr_4[]
//----------------------------------------------------------
// tag::doc_storage_ptr_5[]
template< class Handler >
void do_rpc( string_view s, Handler&& h )
{
unsigned char buffer[ 8192 ]; // Small stack buffer to avoid most allocations during parse
monotonic_resource mr( buffer ); // This resource will use our local buffer first
value const jv = parse( s, &mr ); // Parse the input string into a value that uses our resource
h( jv ); // Call the handler to perform the RPC command
}
// end::doc_storage_ptr_5[]
//----------------------------------------------------------
void set2() {
//----------------------------------------------------------
{
// tag::doc_storage_ptr_6[]
unsigned char buffer[ 8192 ];
static_resource mr( buffer ); // The resource will use our local buffer
// end::doc_storage_ptr_6[]
}
//----------------------------------------------------------
{
// tag::doc_storage_ptr_7[]
monotonic_resource mr;
array arr( &mr ); // construct an array using our resource
arr.emplace_back( "boost" ); // insert a string
assert( *arr[0].as_string().storage() == mr ); // the resource is propagated to the string
// end::doc_storage_ptr_7[]
}
//----------------------------------------------------------
{
// tag::doc_storage_ptr_8[]
{
monotonic_resource mr;
array arr( &mr ); // construct an array using our resource
assert( ! arr.storage().is_shared() ); // no shared ownership
}
// end::doc_storage_ptr_8[]
}
//----------------------------------------------------------
{
// tag::doc_storage_ptr_9[]
storage_ptr sp = make_shared_resource< monotonic_resource >();
string str( sp );
assert( sp.is_shared() ); // shared ownership
assert( str.storage().is_shared() ); // shared ownership
// end::doc_storage_ptr_9[]
}
//----------------------------------------------------------
} // set2
//----------------------------------------------------------
// tag::doc_storage_ptr_10[]
class logging_resource : public boost::container::pmr::memory_resource
{
private:
void* do_allocate( std::size_t bytes, std::size_t align ) override
{
std::cout << "Allocating " << bytes << " bytes with alignment " << align << '\n';
return ::operator new( bytes );
}
void do_deallocate( void* ptr, std::size_t bytes, std::size_t align ) override
{
std::cout << "Deallocating " << bytes << " bytes with alignment " << align << " @ address " << ptr << '\n';
return ::operator delete( ptr );
}
bool do_is_equal( memory_resource const& other ) const noexcept override
{
// since the global allocation and deallocation functions are used,
// any instance of a logging_resource can deallocate memory allocated
// by another instance of a logging_resource
return dynamic_cast< logging_resource const* >( &other ) != nullptr;
}
};
// end::doc_storage_ptr_10[]
//----------------------------------------------------------
class doc_storage_ptr_test
{
public:
void
run()
{
(void)&set1;
BOOST_TEST_PASS();
}
};
TEST_SUITE(doc_storage_ptr_test, "boost.json.doc_storage_ptr");
} // namespace json
} // namespace boost
|