Unverified Commit 0b345b20 authored by Niels Lohmann's avatar Niels Lohmann Committed by GitHub

Allow allocators for output_vector_adapter (#2989)

*  allow allocators for vectors

*  add regression tests
parent 58b83b71
...@@ -37,11 +37,11 @@ template<typename CharType> ...@@ -37,11 +37,11 @@ template<typename CharType>
using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>; using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;
/// output adapter for byte vectors /// output adapter for byte vectors
template<typename CharType> template<typename CharType, typename AllocatorType = std::allocator<CharType>>
class output_vector_adapter : public output_adapter_protocol<CharType> class output_vector_adapter : public output_adapter_protocol<CharType>
{ {
public: public:
explicit output_vector_adapter(std::vector<CharType>& vec) noexcept explicit output_vector_adapter(std::vector<CharType, AllocatorType>& vec) noexcept
: v(vec) : v(vec)
{} {}
...@@ -57,7 +57,7 @@ class output_vector_adapter : public output_adapter_protocol<CharType> ...@@ -57,7 +57,7 @@ class output_vector_adapter : public output_adapter_protocol<CharType>
} }
private: private:
std::vector<CharType>& v; std::vector<CharType, AllocatorType>& v;
}; };
#ifndef JSON_NO_IO #ifndef JSON_NO_IO
...@@ -114,8 +114,9 @@ template<typename CharType, typename StringType = std::basic_string<CharType>> ...@@ -114,8 +114,9 @@ template<typename CharType, typename StringType = std::basic_string<CharType>>
class output_adapter class output_adapter
{ {
public: public:
output_adapter(std::vector<CharType>& vec) template<typename AllocatorType = std::allocator<CharType>>
: oa(std::make_shared<output_vector_adapter<CharType>>(vec)) {} output_adapter(std::vector<CharType, AllocatorType>& vec)
: oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {}
#ifndef JSON_NO_IO #ifndef JSON_NO_IO
output_adapter(std::basic_ostream<CharType>& s) output_adapter(std::basic_ostream<CharType>& s)
......
...@@ -13485,11 +13485,11 @@ template<typename CharType> ...@@ -13485,11 +13485,11 @@ template<typename CharType>
using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>; using output_adapter_t = std::shared_ptr<output_adapter_protocol<CharType>>;
/// output adapter for byte vectors /// output adapter for byte vectors
template<typename CharType> template<typename CharType, typename AllocatorType = std::allocator<CharType>>
class output_vector_adapter : public output_adapter_protocol<CharType> class output_vector_adapter : public output_adapter_protocol<CharType>
{ {
public: public:
explicit output_vector_adapter(std::vector<CharType>& vec) noexcept explicit output_vector_adapter(std::vector<CharType, AllocatorType>& vec) noexcept
: v(vec) : v(vec)
{} {}
...@@ -13505,7 +13505,7 @@ class output_vector_adapter : public output_adapter_protocol<CharType> ...@@ -13505,7 +13505,7 @@ class output_vector_adapter : public output_adapter_protocol<CharType>
} }
private: private:
std::vector<CharType>& v; std::vector<CharType, AllocatorType>& v;
}; };
#ifndef JSON_NO_IO #ifndef JSON_NO_IO
...@@ -13562,8 +13562,9 @@ template<typename CharType, typename StringType = std::basic_string<CharType>> ...@@ -13562,8 +13562,9 @@ template<typename CharType, typename StringType = std::basic_string<CharType>>
class output_adapter class output_adapter
{ {
public: public:
output_adapter(std::vector<CharType>& vec) template<typename AllocatorType = std::allocator<CharType>>
: oa(std::make_shared<output_vector_adapter<CharType>>(vec)) {} output_adapter(std::vector<CharType, AllocatorType>& vec)
: oa(std::make_shared<output_vector_adapter<CharType, AllocatorType>>(vec)) {}
#ifndef JSON_NO_IO #ifndef JSON_NO_IO
output_adapter(std::basic_ostream<CharType>& s) output_adapter(std::basic_ostream<CharType>& s)
......
...@@ -181,6 +181,13 @@ class sax_no_exception : public nlohmann::detail::json_sax_dom_parser<json> ...@@ -181,6 +181,13 @@ class sax_no_exception : public nlohmann::detail::json_sax_dom_parser<json>
std::string* sax_no_exception::error_string = nullptr; std::string* sax_no_exception::error_string = nullptr;
/////////////////////////////////////////////////////////////////////
// for #2982
/////////////////////////////////////////////////////////////////////
template<class T>
class my_allocator : public std::allocator<T>
{};
TEST_CASE("regression tests 2") TEST_CASE("regression tests 2")
{ {
...@@ -679,6 +686,15 @@ TEST_CASE("regression tests 2") ...@@ -679,6 +686,15 @@ TEST_CASE("regression tests 2")
test3[json::json_pointer(p)] = json::object(); test3[json::json_pointer(p)] = json::object();
CHECK(test3.dump() == "{\"/root\":{}}"); CHECK(test3.dump() == "{\"/root\":{}}");
} }
SECTION("issue #2982 - to_{binary format} does not provide a mechanism for specifying a custom allocator for the returned type")
{
std::vector<std::uint8_t, my_allocator<std::uint8_t>> my_vector;
json j = {1, 2, 3, 4};
json::to_cbor(j, my_vector);
json k = json::from_cbor(my_vector);
CHECK(j == k);
}
} }
DOCTEST_CLANG_SUPPRESS_WARNING_POP DOCTEST_CLANG_SUPPRESS_WARNING_POP
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment