mirror of
https://github.com/nlohmann/json.git
synced 2026-10-06 22:47:13 +00:00
Add with_*_t alias templates to create basic_json types with changed template parameters (#5758)
* Add helper types to make it easier to create a basic_json type with modified template parameters Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Rename with_changed_*_t aliases to with_*_t and merge integer/unsigned aliases Per review discussion on #3898 between gregmarr and nlohmann: - rename with_changed_X_t to with_X_t for brevity - replace the separate with_changed_integer_t/with_changed_unsigned_t aliases with a single with_integers_t<NumberIntegerType2, NumberUnsignedType2> - add @sa doc comment links for the upcoming documentation page Co-authored-by: Raphael Grimm <1005058+barcode@users.noreply.github.com> Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Add documentation for the with_*_t member alias templates Add docs/mkdocs/docs/api/basic_json/with_t.md documenting with_object_t, with_array_t, with_string_t, with_boolean_t, with_integers_t, with_float_t, with_allocator_t, with_json_serializer_t, with_binary_t and with_base_class_t, with an accompanying example, and link the page from the basic_json member types list and the mkdocs navigation. Co-authored-by: Raphael Grimm <1005058+barcode@users.noreply.github.com> Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Add tests for the with_*_t member alias templates Check with std::is_same that each with_*_t alias produces the expected basic_json type, and that with_string_t keeps nlohmann::ordered_map as the object type when used on ordered_json. Co-authored-by: Raphael Grimm <1005058+barcode@users.noreply.github.com> Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Fix with_t nav entry and document chaining of the with_*_t aliases Indent the with_t entry in mkdocs.yml so it is listed under basic_json, explain that the aliases can be chained and work on ordered_json, and test both, including json::with_object_t<ordered_map> == ordered_json. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Add docset entry for basic_json::with_t Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me> Co-authored-by: barcode <barcode@example.com> Co-authored-by: Raphael Grimm <1005058+barcode@users.noreply.github.com>
This commit is contained in:
13 files changed
+372
-77
No files matched your search
@@ -48,14 +48,7 @@ TEST_CASE("bad_alloc")
|
||||
SECTION("bad_alloc")
|
||||
{
|
||||
// create JSON type using the throwing allocator
|
||||
using bad_json = nlohmann::basic_json<std::map,
|
||||
std::vector,
|
||||
std::string,
|
||||
bool,
|
||||
std::int64_t,
|
||||
std::uint64_t,
|
||||
double,
|
||||
bad_allocator>;
|
||||
using bad_json = nlohmann::json::with_allocator_t<bad_allocator>;
|
||||
|
||||
// creating an object should throw
|
||||
CHECK_THROWS_AS(bad_json(bad_json::value_t::object), std::bad_alloc&);
|
||||
@@ -129,14 +122,7 @@ void my_allocator_clean_up(T* p)
|
||||
TEST_CASE("controlled bad_alloc")
|
||||
{
|
||||
// create JSON type using the throwing allocator
|
||||
using my_json = nlohmann::basic_json<std::map,
|
||||
std::vector,
|
||||
std::string,
|
||||
bool,
|
||||
std::int64_t,
|
||||
std::uint64_t,
|
||||
double,
|
||||
my_allocator>;
|
||||
using my_json = nlohmann::json::with_allocator_t<my_allocator>;
|
||||
|
||||
SECTION("class json_value")
|
||||
{
|
||||
@@ -593,14 +579,7 @@ TEST_CASE("bad my_allocator::construct")
|
||||
{
|
||||
SECTION("my_allocator::construct doesn't forward")
|
||||
{
|
||||
using bad_alloc_json = nlohmann::basic_json<std::map,
|
||||
std::vector,
|
||||
std::string,
|
||||
bool,
|
||||
std::int64_t,
|
||||
std::uint64_t,
|
||||
double,
|
||||
allocator_no_forward>;
|
||||
using bad_alloc_json = nlohmann::json::with_allocator_t<allocator_no_forward>;
|
||||
|
||||
bad_alloc_json j;
|
||||
j["test"] = bad_alloc_json::array_t();
|
||||
|
||||
@@ -163,16 +163,7 @@ void int_to_string(alt_string& target, std::size_t value)
|
||||
target = std::to_string(value).c_str();
|
||||
}
|
||||
|
||||
using alt_json = nlohmann::basic_json <
|
||||
std::map,
|
||||
std::vector,
|
||||
alt_string,
|
||||
bool,
|
||||
std::int64_t,
|
||||
std::uint64_t,
|
||||
double,
|
||||
std::allocator,
|
||||
nlohmann::adl_serializer >;
|
||||
using alt_json = nlohmann::json::with_string_t<alt_string>;
|
||||
|
||||
bool operator<(const char* op1, const alt_string& op2) noexcept
|
||||
{
|
||||
|
||||
@@ -38,20 +38,7 @@ class json_metadata
|
||||
};
|
||||
|
||||
template<class T>
|
||||
using json_with_metadata =
|
||||
nlohmann::basic_json <
|
||||
std::map,
|
||||
std::vector,
|
||||
std::string,
|
||||
bool,
|
||||
std::int64_t,
|
||||
std::uint64_t,
|
||||
double,
|
||||
std::allocator,
|
||||
nlohmann::adl_serializer,
|
||||
std::vector<std::uint8_t>,
|
||||
json_metadata<T>
|
||||
>;
|
||||
using json_with_metadata = nlohmann::json::with_base_class_t<json_metadata<T>>;
|
||||
|
||||
TEST_CASE("JSON Node Metadata")
|
||||
{
|
||||
@@ -268,19 +255,7 @@ class visitor_adaptor
|
||||
void do_visit(const Ptr& ptr, const Fnc& fnc) const;
|
||||
};
|
||||
|
||||
using json_with_visitor_t = nlohmann::basic_json <
|
||||
std::map,
|
||||
std::vector,
|
||||
std::string,
|
||||
bool,
|
||||
std::int64_t,
|
||||
std::uint64_t,
|
||||
double,
|
||||
std::allocator,
|
||||
nlohmann::adl_serializer,
|
||||
std::vector<std::uint8_t>,
|
||||
visitor_adaptor
|
||||
>;
|
||||
using json_with_visitor_t = nlohmann::json::with_base_class_t<visitor_adaptor>;
|
||||
|
||||
template <class Fnc>
|
||||
void visitor_adaptor::visit(const Fnc& fnc) const
|
||||
|
||||
+77
-3
@@ -23,6 +23,7 @@ using nlohmann::json;
|
||||
using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
|
||||
#endif
|
||||
|
||||
#include <deque>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
@@ -684,8 +685,7 @@ static std::ostream& operator<<(std::ostream& os, small_pod l)
|
||||
TEST_CASE("custom serializer for pods" * doctest::test_suite("udt"))
|
||||
{
|
||||
using custom_json =
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator, pod_serializer>;
|
||||
nlohmann::json::with_json_serializer_t<pod_serializer>;
|
||||
|
||||
auto p = udt::small_pod{42, '/', 42};
|
||||
custom_json const j = p;
|
||||
@@ -703,7 +703,7 @@ TEST_CASE("custom serializer for pods" * doctest::test_suite("udt"))
|
||||
template <typename T, typename>
|
||||
struct another_adl_serializer;
|
||||
|
||||
using custom_json = nlohmann::basic_json<std::map, std::vector, std::string, bool, std::int64_t, std::uint64_t, double, std::allocator, another_adl_serializer>;
|
||||
using custom_json = nlohmann::json::with_json_serializer_t<another_adl_serializer>;
|
||||
|
||||
template <typename T, typename>
|
||||
struct another_adl_serializer
|
||||
@@ -734,6 +734,80 @@ TEST_CASE("custom serializer that does adl by default" * doctest::test_suite("ud
|
||||
CHECK(me == cj.get<udt::person>());
|
||||
}
|
||||
|
||||
TEST_CASE("with_*_t aliases" * doctest::test_suite("udt"))
|
||||
{
|
||||
// a custom base class used to check with_base_class_t
|
||||
struct custom_base_class {};
|
||||
|
||||
CHECK(std::is_same<json::with_object_t<std::deque>,
|
||||
nlohmann::basic_json<std::deque, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_array_t<std::deque>,
|
||||
nlohmann::basic_json<std::map, std::deque, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_string_t<std::wstring>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::wstring, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_boolean_t<int>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, int,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_integers_t<std::int32_t, std::uint32_t>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int32_t, std::uint32_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_float_t<float>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, float, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_allocator_t<std::allocator>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_json_serializer_t<nlohmann::adl_serializer>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_binary_t<std::vector<char>>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<char>>>::value);
|
||||
|
||||
CHECK(std::is_same<json::with_base_class_t<custom_base_class>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>, custom_base_class>>::value);
|
||||
|
||||
// with_string_t on ordered_json must keep ordered_map as the object type
|
||||
CHECK(std::is_same<nlohmann::ordered_json::with_string_t<std::wstring>,
|
||||
nlohmann::basic_json<nlohmann::ordered_map, std::vector, std::wstring, bool,
|
||||
std::int64_t, std::uint64_t, double, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
|
||||
// the aliases are members of the resulting type, so they can be chained
|
||||
CHECK(std::is_same<json::with_integers_t<int, unsigned int>::with_float_t<float>,
|
||||
nlohmann::basic_json<std::map, std::vector, std::string, bool,
|
||||
int, unsigned int, float, std::allocator,
|
||||
nlohmann::adl_serializer, std::vector<std::uint8_t>>>::value);
|
||||
CHECK(std::is_same<json::with_float_t<float>::with_integers_t<int, unsigned int>,
|
||||
json::with_integers_t<int, unsigned int>::with_float_t<float>>::value);
|
||||
|
||||
// replacing the object type of json with ordered_map yields ordered_json
|
||||
CHECK(std::is_same<json::with_object_t<nlohmann::ordered_map>, nlohmann::ordered_json>::value);
|
||||
CHECK(std::is_same<nlohmann::ordered_json::with_object_t<std::map>, json>::value);
|
||||
}
|
||||
|
||||
TEST_CASE("different basic_json types conversions")
|
||||
{
|
||||
SECTION("null")
|
||||
|
||||
Reference in new issue
Block a user