X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Fboost%2Flibs%2Fjson%2Ftest%2Fdoc_storage_ptr.cpp;fp=ceph%2Fsrc%2Fboost%2Flibs%2Fjson%2Ftest%2Fdoc_storage_ptr.cpp;h=d211d13415595be4c541121a7c818a24c5c4adf5;hb=20effc670b57271cb089376d6d0800990e5218d5;hp=0000000000000000000000000000000000000000;hpb=a71831dadd1e1f3e0fa70405511f65cc33db0498;p=ceph.git diff --git a/ceph/src/boost/libs/json/test/doc_storage_ptr.cpp b/ceph/src/boost/libs/json/test/doc_storage_ptr.cpp new file mode 100644 index 000000000..d211d1341 --- /dev/null +++ b/ceph/src/boost/libs/json/test/doc_storage_ptr.cpp @@ -0,0 +1,176 @@ +// +// 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 +#include +#include +#include +#include + +#include + +#include "test_suite.hpp" + +BOOST_JSON_NS_BEGIN + +//---------------------------------------------------------- + +static void set1() { + +//---------------------------------------------------------- +{ +//[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 +//] +} +//---------------------------------------------------------- +{ +//[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 +//] +} +//---------------------------------------------------------- +{ +//[doc_storage_ptr_3 +monotonic_resource mr; + +value const jv = parse( "[1,2,3]", &mr ); +//] +} +//---------------------------------------------------------- + +} // set1 + +//---------------------------------------------------------- + +//[doc_storage_ptr_4 +value parse_value( string_view s) +{ + return parse( s, make_shared_resource< monotonic_resource >() ); +} +//] + +//---------------------------------------------------------- + +//[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 +} +//] + +//---------------------------------------------------------- + +void set2() { + +//---------------------------------------------------------- +{ +//[doc_storage_ptr_6 +unsigned char buffer[ 8192 ]; +static_resource mr( buffer ); // The resource will use our local buffer +//] +} +//---------------------------------------------------------- +{ +//[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 +//] +} +//---------------------------------------------------------- +{ +//[doc_storage_ptr_8 +{ + monotonic_resource mr; + + array arr( &mr ); // construct an array using our resource + + assert( ! arr.storage().is_shared() ); // no shared ownership +} +//] +} +//---------------------------------------------------------- +{ +//[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 +//] +} +//---------------------------------------------------------- + +} // set2 + +//---------------------------------------------------------- +//[doc_storage_ptr_10 +class logging_resource : public 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; + } +}; +//] + +//---------------------------------------------------------- + +class doc_storage_ptr_test +{ +public: + void + run() + { + (void)&set1; + BOOST_TEST_PASS(); + } +}; + +TEST_SUITE(doc_storage_ptr_test, "boost.json.doc_storage_ptr"); + +BOOST_JSON_NS_END