mirror of https://github.com/nlohmann/json.git
Add versioned, ABI-tagged inline namespace and namespace macros (#3590)
* Add versioned inline namespace Add a versioned inline namespace to prevent ABI issues when linking code using multiple library versions. * Add namespace macros * Encode ABI information in inline namespace Add _diag suffix to inline namespace if JSON_DIAGNOSTICS is enabled, and _ldvcmp suffix if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON is enabled. * Move ABI-affecting macros into abi_macros.hpp * Move std_fs namespace definition into std_fs.hpp * Remove std_fs namespace from unit test * Format more files in tests directory * Add unit tests * Update documentation * Fix GDB pretty printer * fixup! Add namespace macros * Derive ABI prefix from NLOHMANN_JSON_VERSION_*pull/3633/head
parent
fca1ddda96
commit
d909f80960
7
Makefile
7
Makefile
|
@ -15,6 +15,9 @@ SED:=$(shell command -v gsed || which sed)
|
||||||
# the list of sources in the include folder
|
# the list of sources in the include folder
|
||||||
SRCS=$(shell find include -type f | sort)
|
SRCS=$(shell find include -type f | sort)
|
||||||
|
|
||||||
|
# the list of sources in the tests folder
|
||||||
|
TESTS_SRCS=$(shell find tests -type f \( -name '*.hpp' -o -name '*.cpp' -o -name '*.cu' \) -not -path 'tests/thirdparty/*' | sort)
|
||||||
|
|
||||||
# the single header (amalgamated from the source files)
|
# the single header (amalgamated from the source files)
|
||||||
AMALGAMATED_FILE=single_include/nlohmann/json.hpp
|
AMALGAMATED_FILE=single_include/nlohmann/json.hpp
|
||||||
|
|
||||||
|
@ -159,11 +162,11 @@ pretty:
|
||||||
--preserve-date \
|
--preserve-date \
|
||||||
--suffix=none \
|
--suffix=none \
|
||||||
--formatted \
|
--formatted \
|
||||||
$(SRCS) $(AMALGAMATED_FILE) tests/src/*.cpp tests/src/*.hpp tests/benchmarks/src/benchmarks.cpp docs/examples/*.cpp
|
$(SRCS) $(TESTS_SRCS) $(AMALGAMATED_FILE) docs/examples/*.cpp
|
||||||
|
|
||||||
# call the Clang-Format on all source files
|
# call the Clang-Format on all source files
|
||||||
pretty_format:
|
pretty_format:
|
||||||
for FILE in $(SRCS) $(AMALGAMATED_FILE) tests/src/*.cpp tests/src/*.hpp benchmarks/src/benchmarks.cpp docs/examples/*.cpp; do echo $$FILE; clang-format -i $$FILE; done
|
for FILE in $(SRCS) $(TESTS_SRCS) $(AMALGAMATED_FILE) docs/examples/*.cpp; do echo $$FILE; clang-format -i $$FILE; done
|
||||||
|
|
||||||
# create single header file
|
# create single header file
|
||||||
amalgamate: $(AMALGAMATED_FILE)
|
amalgamate: $(AMALGAMATED_FILE)
|
||||||
|
|
|
@ -27,6 +27,11 @@ header. See also the [macro overview page](../../features/macros.md).
|
||||||
- [**JSON_SKIP_LIBRARY_VERSION_CHECK**](json_skip_library_version_check.md) - skip library version check
|
- [**JSON_SKIP_LIBRARY_VERSION_CHECK**](json_skip_library_version_check.md) - skip library version check
|
||||||
- [**NLOHMANN_JSON_VERSION_MAJOR**<br>**NLOHMANN_JSON_VERSION_MINOR**<br>**NLOHMANN_JSON_VERSION_PATCH**](nlohmann_json_version_major.md) - library version information
|
- [**NLOHMANN_JSON_VERSION_MAJOR**<br>**NLOHMANN_JSON_VERSION_MINOR**<br>**NLOHMANN_JSON_VERSION_PATCH**](nlohmann_json_version_major.md) - library version information
|
||||||
|
|
||||||
|
## Library namespace
|
||||||
|
|
||||||
|
- [**NLOHMANN_JSON_NAMESPACE**](nlohmann_json_namespace.md) - full name of the `nlohmann` namespace
|
||||||
|
- [**NLOHMANN_JSON_NAMESPACE_BEGIN**<br>**NLOHMANN_JSON_NAMESPACE_END**](nlohmann_json_namespace_begin.md) - open and close the library namespace
|
||||||
|
|
||||||
## Type conversions
|
## Type conversions
|
||||||
|
|
||||||
- [**JSON_DISABLE_ENUM_SERIALIZATION**](json_disable_enum_serialization.md) - switch off default serialization/deserialization functions for enums
|
- [**JSON_DISABLE_ENUM_SERIALIZATION**](json_disable_enum_serialization.md) - switch off default serialization/deserialization functions for enums
|
||||||
|
|
|
@ -26,11 +26,16 @@ When the macro is not defined, the library will define it to its default value.
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
!!! danger "ABI incompatibility"
|
!!! note "ABI compatibility"
|
||||||
|
|
||||||
As this macro changes the definition of the `basic_json` object, it MUST be defined in the same way globally, even
|
As of version 3.11.0, this macro is no longer required to be defined consistently throughout a codebase to avoid
|
||||||
across different compilation units: `basic_json` objects with differently defined `JSON_DIAGNOSTICS` macros are
|
One Definition Rule (ODR) violations, as the value of this macro is encoded in the namespace, resulting in distinct
|
||||||
not compatible!
|
symbol names.
|
||||||
|
|
||||||
|
This allows different parts of a codebase to use different versions or configurations of this library without
|
||||||
|
causing improper behavior.
|
||||||
|
|
||||||
|
Where possible, it is still recommended that all code define this the same way for maximum interoperability.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
@ -65,3 +70,4 @@ When the macro is not defined, the library will define it to its default value.
|
||||||
## Version history
|
## Version history
|
||||||
|
|
||||||
- Added in version 3.10.0.
|
- Added in version 3.10.0.
|
||||||
|
- As of version 3.11.0 the definition is allowed to vary between translation units.
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
# NLOHMANN_JSON_NAMESPACE
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE
|
||||||
|
```
|
||||||
|
|
||||||
|
This macro evaluates to the full name of the `nlohmann` namespace, including
|
||||||
|
the name of a versioned and ABI-tagged inline namespace. Use this macro to
|
||||||
|
unambiguously refer to the `nlohmann` namespace.
|
||||||
|
|
||||||
|
## Default definition
|
||||||
|
|
||||||
|
The default value consists of a prefix, a version string, and optional ABI tags
|
||||||
|
depending on whether ABI-affecting macros are defined (e.g.,
|
||||||
|
[`JSON_DIAGNOSTICS`](json_diagnostics.md), and
|
||||||
|
[`JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON`](json_use_legacy_discarded_value_comparison.md)).
|
||||||
|
|
||||||
|
When the macro is not defined, the library will define it to its default value.
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- [`NLOHMANN_JSON_NAMESPACE_BEGIN, NLOHMANN_JSON_NAMESPACE_END`](nlohmann_json_namespace_begin.md)
|
||||||
|
|
||||||
|
## Version history
|
||||||
|
|
||||||
|
- Added in version 3.11.0.
|
|
@ -0,0 +1,40 @@
|
||||||
|
# NLOHMANN_JSON_NAMESPACE_BEGIN, NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_BEGIN // (1)
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_END // (2)
|
||||||
|
```
|
||||||
|
|
||||||
|
These macros can be used to open and close the `nlohmann` namespace. They
|
||||||
|
include an inline namespace used to differentiate symbols when linking multiple
|
||||||
|
versions (including different ABI-affecting macros) of this library.
|
||||||
|
|
||||||
|
1. Opens the namespace.
|
||||||
|
```cpp
|
||||||
|
namespace nlohmann
|
||||||
|
{
|
||||||
|
inline namespace json_v3_11_0
|
||||||
|
{
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Closes the namespace.
|
||||||
|
```cpp
|
||||||
|
} // namespace nlohmann
|
||||||
|
} // json_v3_11_0
|
||||||
|
```
|
||||||
|
|
||||||
|
## Default definition
|
||||||
|
|
||||||
|
The default definitions open and close the `nlohmann` as well as an inline
|
||||||
|
namespace.
|
||||||
|
|
||||||
|
When these macros are not defined, the library will define them to their
|
||||||
|
default definitions.
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
- [NLOHMANN_JSON_NAMESPACE](nlohmann_json_namespace.md)
|
||||||
|
|
||||||
|
## Version history
|
||||||
|
|
||||||
|
- Added in version 3.11.0.
|
|
@ -155,7 +155,7 @@ To solve this, you need to add a specialization of `adl_serializer` to the `nloh
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
// partial specialization (full specialization works too)
|
// partial specialization (full specialization works too)
|
||||||
namespace nlohmann {
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct adl_serializer<boost::optional<T>> {
|
struct adl_serializer<boost::optional<T>> {
|
||||||
static void to_json(json& j, const boost::optional<T>& opt) {
|
static void to_json(json& j, const boost::optional<T>& opt) {
|
||||||
|
@ -176,9 +176,14 @@ namespace nlohmann {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
```
|
```
|
||||||
|
|
||||||
|
!!! note "ABI compatibility"
|
||||||
|
|
||||||
|
Use [`NLOHMANN_JSON_NAMESPACE_BEGIN`](../api/macros/nlohmann_json_namespace_begin.md) and `NLOHMANN_JSON_NAMESPACE_END`
|
||||||
|
instead of `#!cpp namespace nlohmann { }` in code which may be linked with different versions of this library.
|
||||||
|
|
||||||
## How can I use `get()` for non-default constructible/non-copyable types?
|
## How can I use `get()` for non-default constructible/non-copyable types?
|
||||||
|
|
||||||
There is a way, if your type is [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload:
|
There is a way, if your type is [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible). You will need to specialize the `adl_serializer` as well, but with a special `from_json` overload:
|
||||||
|
|
|
@ -264,6 +264,9 @@ nav:
|
||||||
- 'NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT': api/macros/nlohmann_define_type_intrusive.md
|
- 'NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT': api/macros/nlohmann_define_type_intrusive.md
|
||||||
- 'NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE': api/macros/nlohmann_define_type_non_intrusive.md
|
- 'NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE': api/macros/nlohmann_define_type_non_intrusive.md
|
||||||
- 'NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT': api/macros/nlohmann_define_type_non_intrusive.md
|
- 'NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT': api/macros/nlohmann_define_type_non_intrusive.md
|
||||||
|
- 'NLOHMANN_JSON_NAMESPACE': api/macros/nlohmann_json_namespace.md
|
||||||
|
- 'NLOHMANN_JSON_NAMESPACE_BEGIN': api/macros/nlohmann_json_namespace_begin.md
|
||||||
|
- 'NLOHMANN_JSON_NAMESPACE_END': api/macros/nlohmann_json_namespace_begin.md
|
||||||
- 'NLOHMANN_JSON_SERIALIZE_ENUM': api/macros/nlohmann_json_serialize_enum.md
|
- 'NLOHMANN_JSON_SERIALIZE_ENUM': api/macros/nlohmann_json_serialize_enum.md
|
||||||
- 'NLOHMANN_JSON_VERSION_MAJOR': api/macros/nlohmann_json_version_major.md
|
- 'NLOHMANN_JSON_VERSION_MAJOR': api/macros/nlohmann_json_version_major.md
|
||||||
- 'NLOHMANN_JSON_VERSION_MINOR': api/macros/nlohmann_json_version_major.md
|
- 'NLOHMANN_JSON_VERSION_MINOR': api/macros/nlohmann_json_version_major.md
|
||||||
|
|
|
@ -8,16 +8,14 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/conversions/from_json.hpp>
|
#include <nlohmann/detail/conversions/from_json.hpp>
|
||||||
#include <nlohmann/detail/conversions/to_json.hpp>
|
#include <nlohmann/detail/conversions/to_json.hpp>
|
||||||
#include <nlohmann/detail/meta/identity_tag.hpp>
|
#include <nlohmann/detail/meta/identity_tag.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
|
|
||||||
/// @sa https://json.nlohmann.me/api/adl_serializer/
|
/// @sa https://json.nlohmann.me/api/adl_serializer/
|
||||||
template<typename ValueType, typename>
|
template<typename ValueType, typename>
|
||||||
|
@ -53,4 +51,5 @@ struct adl_serializer
|
||||||
::nlohmann::to_json(j, std::forward<TargetType>(val));
|
::nlohmann::to_json(j, std::forward<TargetType>(val));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace nlohmann
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -12,8 +12,9 @@
|
||||||
#include <tuple> // tie
|
#include <tuple> // tie
|
||||||
#include <utility> // move
|
#include <utility> // move
|
||||||
|
|
||||||
namespace nlohmann
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
{
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
|
||||||
/// @brief an internal type for a backed binary type
|
/// @brief an internal type for a backed binary type
|
||||||
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/
|
/// @sa https://json.nlohmann.me/api/byte_container_with_subtype/
|
||||||
|
@ -99,4 +100,4 @@ class byte_container_with_subtype : public BinaryType
|
||||||
bool m_has_subtype = false;
|
bool m_has_subtype = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
// This file contains all macro definitions affecting or depending on the ABI
|
||||||
|
|
||||||
|
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
|
||||||
|
#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
|
||||||
|
#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 10 || NLOHMANN_JSON_VERSION_PATCH != 5
|
||||||
|
#warning "Already included a different version of the library!"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
|
||||||
|
#define NLOHMANN_JSON_VERSION_MINOR 10 // NOLINT(modernize-macro-to-enum)
|
||||||
|
#define NLOHMANN_JSON_VERSION_PATCH 5 // NOLINT(modernize-macro-to-enum)
|
||||||
|
|
||||||
|
#ifndef JSON_DIAGNOSTICS
|
||||||
|
#define JSON_DIAGNOSTICS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if JSON_DIAGNOSTICS
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag
|
||||||
|
#else
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
|
||||||
|
#else
|
||||||
|
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_ABI_PREFIX_EX(major, minor, patch) \
|
||||||
|
json_v ## major ## _ ## minor ## _ ## patch
|
||||||
|
#define NLOHMANN_JSON_ABI_PREFIX(major, minor, patch) \
|
||||||
|
NLOHMANN_JSON_ABI_PREFIX_EX(major, minor, patch)
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_ABI_CONCAT_EX(a, b, c) a ## b ## c
|
||||||
|
#define NLOHMANN_JSON_ABI_CONCAT(a, b, c) \
|
||||||
|
NLOHMANN_JSON_ABI_CONCAT_EX(a, b, c)
|
||||||
|
|
||||||
|
#define NLOHMANN_JSON_ABI_STRING \
|
||||||
|
NLOHMANN_JSON_ABI_CONCAT( \
|
||||||
|
NLOHMANN_JSON_ABI_PREFIX( \
|
||||||
|
NLOHMANN_JSON_VERSION_MAJOR, \
|
||||||
|
NLOHMANN_JSON_VERSION_MINOR, \
|
||||||
|
NLOHMANN_JSON_VERSION_PATCH), \
|
||||||
|
NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
|
||||||
|
NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON)
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE nlohmann::NLOHMANN_JSON_ABI_STRING
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_BEGIN \
|
||||||
|
namespace nlohmann \
|
||||||
|
{ \
|
||||||
|
inline namespace NLOHMANN_JSON_ABI_STRING \
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
#define NLOHMANN_JSON_NAMESPACE_END \
|
||||||
|
} /* namespace (abi_string) */ \
|
||||||
|
} /* namespace nlohmann */
|
||||||
|
#endif
|
|
@ -24,28 +24,15 @@
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
#include <nlohmann/detail/meta/cpp_future.hpp>
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
#include <nlohmann/detail/meta/identity_tag.hpp>
|
#include <nlohmann/detail/meta/identity_tag.hpp>
|
||||||
|
#include <nlohmann/detail/meta/std_fs.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
#if JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
#include <experimental/filesystem>
|
|
||||||
namespace nlohmann::detail
|
|
||||||
{
|
|
||||||
namespace std_fs = std::experimental::filesystem;
|
|
||||||
} // namespace nlohmann::detail
|
|
||||||
#elif JSON_HAS_FILESYSTEM
|
|
||||||
#include <filesystem>
|
|
||||||
namespace nlohmann::detail
|
|
||||||
{
|
|
||||||
namespace std_fs = std::filesystem;
|
|
||||||
} // namespace nlohmann::detail
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace nlohmann
|
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename BasicJsonType>
|
template<typename BasicJsonType>
|
||||||
inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
|
inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n)
|
||||||
{
|
{
|
||||||
|
@ -491,6 +478,7 @@ struct from_json_fn
|
||||||
return from_json(j, std::forward<T>(val));
|
return from_json(j, std::forward<T>(val));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
#ifndef JSON_HAS_CPP_17
|
#ifndef JSON_HAS_CPP_17
|
||||||
|
@ -505,4 +493,5 @@ JSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definition
|
||||||
#ifndef JSON_HAS_CPP_17
|
#ifndef JSON_HAS_CPP_17
|
||||||
} // namespace
|
} // namespace
|
||||||
#endif
|
#endif
|
||||||
} // namespace nlohmann
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -18,8 +18,7 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -1116,4 +1115,4 @@ char* to_chars(char* first, const char* last, FloatType value)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -17,30 +17,17 @@
|
||||||
#include <valarray> // valarray
|
#include <valarray> // valarray
|
||||||
#include <vector> // vector
|
#include <vector> // vector
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
|
||||||
#include <nlohmann/detail/iterators/iteration_proxy.hpp>
|
#include <nlohmann/detail/iterators/iteration_proxy.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
#include <nlohmann/detail/meta/cpp_future.hpp>
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
#include <nlohmann/detail/meta/std_fs.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
#if JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
#include <experimental/filesystem>
|
|
||||||
namespace nlohmann::detail
|
|
||||||
{
|
|
||||||
namespace std_fs = std::experimental::filesystem;
|
|
||||||
} // namespace nlohmann::detail
|
|
||||||
#elif JSON_HAS_FILESYSTEM
|
|
||||||
#include <filesystem>
|
|
||||||
namespace nlohmann::detail
|
|
||||||
{
|
|
||||||
namespace std_fs = std::filesystem;
|
|
||||||
} // namespace nlohmann::detail
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace nlohmann
|
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
//////////////////
|
//////////////////
|
||||||
// constructors //
|
// constructors //
|
||||||
//////////////////
|
//////////////////
|
||||||
|
@ -449,4 +436,5 @@ JSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-
|
||||||
#ifndef JSON_HAS_CPP_17
|
#ifndef JSON_HAS_CPP_17
|
||||||
} // namespace
|
} // namespace
|
||||||
#endif
|
#endif
|
||||||
} // namespace nlohmann
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -23,10 +23,10 @@
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
////////////////
|
////////////////
|
||||||
// exceptions //
|
// exceptions //
|
||||||
////////////////
|
////////////////
|
||||||
|
@ -252,4 +252,4 @@ class other_error : public exception
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -12,11 +12,10 @@
|
||||||
#include <cstddef> // size_t
|
#include <cstddef> // size_t
|
||||||
#include <functional> // hash
|
#include <functional> // hash
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -127,4 +126,4 @@ std::size_t hash(const BasicJsonType& j)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -32,8 +32,7 @@
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -2969,5 +2968,6 @@ class binary_reader
|
||||||
/// the SAX parser
|
/// the SAX parser
|
||||||
json_sax_t* sax = nullptr;
|
json_sax_t* sax = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -26,10 +26,10 @@
|
||||||
#include <nlohmann/detail/iterators/iterator_traits.hpp>
|
#include <nlohmann/detail/iterators/iterator_traits.hpp>
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
/// the supported input formats
|
/// the supported input formats
|
||||||
enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata };
|
enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata };
|
||||||
|
|
||||||
|
@ -489,5 +489,6 @@ class span_input_adapter
|
||||||
private:
|
private:
|
||||||
contiguous_bytes_input_adapter ia;
|
contiguous_bytes_input_adapter ia;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -17,8 +17,7 @@
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief SAX interface
|
@brief SAX interface
|
||||||
|
@ -724,6 +723,6 @@ class json_sax_acceptor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
} // namespace nlohmann
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -22,10 +22,10 @@
|
||||||
#include <nlohmann/detail/input/position_t.hpp>
|
#include <nlohmann/detail/input/position_t.hpp>
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
///////////
|
///////////
|
||||||
// lexer //
|
// lexer //
|
||||||
///////////
|
///////////
|
||||||
|
@ -1627,5 +1627,6 @@ scan_number_done:
|
||||||
/// the decimal point
|
/// the decimal point
|
||||||
const char_int_type decimal_point_char = '.';
|
const char_int_type decimal_point_char = '.';
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -24,8 +24,7 @@
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
////////////
|
////////////
|
||||||
|
@ -505,4 +504,4 @@ class parser
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -10,10 +10,12 @@
|
||||||
|
|
||||||
#include <cstddef> // size_t
|
#include <cstddef> // size_t
|
||||||
|
|
||||||
namespace nlohmann
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
{
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
/// struct to capture the start position of the current token
|
/// struct to capture the start position of the current token
|
||||||
struct position_t
|
struct position_t
|
||||||
{
|
{
|
||||||
|
@ -32,4 +34,4 @@ struct position_t
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -8,12 +8,13 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/iterators/primitive_iterator.hpp>
|
#include <nlohmann/detail/iterators/primitive_iterator.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief an iterator value
|
@brief an iterator value
|
||||||
|
|
||||||
|
@ -29,5 +30,6 @@ template<typename BasicJsonType> struct internal_iterator
|
||||||
/// generic iterator for all other types
|
/// generic iterator for all other types
|
||||||
primitive_iterator_t primitive_iterator {};
|
primitive_iterator_t primitive_iterator {};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -19,10 +19,10 @@
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
// forward declare, to be able to friend it later on
|
// forward declare, to be able to friend it later on
|
||||||
template<typename IteratorType> class iteration_proxy;
|
template<typename IteratorType> class iteration_proxy;
|
||||||
template<typename IteratorType> class iteration_proxy_value;
|
template<typename IteratorType> class iteration_proxy_value;
|
||||||
|
@ -746,5 +746,6 @@ class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-speci
|
||||||
/// the actual iterator of the associated instance
|
/// the actual iterator of the associated instance
|
||||||
internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};
|
internal_iterator<typename std::remove_const<BasicJsonType>::type> m_it {};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -18,13 +18,14 @@
|
||||||
#include <ranges> // enable_borrowed_range
|
#include <ranges> // enable_borrowed_range
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename string_type>
|
template<typename string_type>
|
||||||
void int_to_string( string_type& target, std::size_t value )
|
void int_to_string( string_type& target, std::size_t value )
|
||||||
{
|
{
|
||||||
|
@ -201,8 +202,9 @@ auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decl
|
||||||
{
|
{
|
||||||
return i.value();
|
return i.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
||||||
// The Addition to the STD Namespace is required to add
|
// The Addition to the STD Namespace is required to add
|
||||||
// Structured Bindings Support to the iteration_proxy_value class
|
// Structured Bindings Support to the iteration_proxy_value class
|
||||||
|
@ -210,6 +212,7 @@ auto get(const nlohmann::detail::iteration_proxy_value<IteratorType>& i) -> decl
|
||||||
// And see https://github.com/nlohmann/json/pull/1391
|
// And see https://github.com/nlohmann/json/pull/1391
|
||||||
namespace std
|
namespace std
|
||||||
{
|
{
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
// Fix: https://github.com/nlohmann/json/issues/1401
|
// Fix: https://github.com/nlohmann/json/issues/1401
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
|
@ -230,6 +233,7 @@ class tuple_element<N, ::nlohmann::detail::iteration_proxy_value<IteratorType >>
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
#if JSON_HAS_RANGES
|
#if JSON_HAS_RANGES
|
||||||
|
|
|
@ -10,13 +10,14 @@
|
||||||
|
|
||||||
#include <iterator> // random_access_iterator_tag
|
#include <iterator> // random_access_iterator_tag
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/meta/void_t.hpp>
|
#include <nlohmann/detail/meta/void_t.hpp>
|
||||||
#include <nlohmann/detail/meta/cpp_future.hpp>
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename It, typename = void>
|
template<typename It, typename = void>
|
||||||
struct iterator_types {};
|
struct iterator_types {};
|
||||||
|
|
||||||
|
@ -55,5 +56,6 @@ struct iterator_traits<T*, enable_if_t<std::is_object<T>::value>>
|
||||||
using pointer = T*;
|
using pointer = T*;
|
||||||
using reference = T&;
|
using reference = T&;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -12,10 +12,12 @@
|
||||||
#include <iterator> // reverse_iterator
|
#include <iterator> // reverse_iterator
|
||||||
#include <utility> // declval
|
#include <utility> // declval
|
||||||
|
|
||||||
namespace nlohmann
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
{
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
//////////////////////
|
//////////////////////
|
||||||
// reverse_iterator //
|
// reverse_iterator //
|
||||||
//////////////////////
|
//////////////////////
|
||||||
|
@ -123,5 +125,6 @@ class json_reverse_iterator : public std::reverse_iterator<Base>
|
||||||
return it.operator * ();
|
return it.operator * ();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -13,10 +13,10 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@brief an iterator for primitive JSON types
|
@brief an iterator for primitive JSON types
|
||||||
|
|
||||||
|
@ -127,5 +127,6 @@ class primitive_iterator_t
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -27,8 +27,7 @@
|
||||||
#include <nlohmann/detail/string_escape.hpp>
|
#include <nlohmann/detail/string_escape.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
|
|
||||||
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
|
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
|
||||||
/// @sa https://json.nlohmann.me/api/json_pointer/
|
/// @sa https://json.nlohmann.me/api/json_pointer/
|
||||||
|
@ -897,4 +896,5 @@ inline bool operator!=(json_pointer<RefStringTypeLhs> const& lhs,
|
||||||
{
|
{
|
||||||
return !(lhs == rhs);
|
return !(lhs == rhs);
|
||||||
}
|
}
|
||||||
} // namespace nlohmann
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -11,12 +11,13 @@
|
||||||
#include <initializer_list>
|
#include <initializer_list>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename BasicJsonType>
|
template<typename BasicJsonType>
|
||||||
class json_ref
|
class json_ref
|
||||||
{
|
{
|
||||||
|
@ -72,5 +73,6 @@ class json_ref
|
||||||
mutable value_type owned_value = nullptr;
|
mutable value_type owned_value = nullptr;
|
||||||
value_type const* value_ref = nullptr;
|
value_type const* value_ref = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -9,12 +9,14 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <utility> // declval, pair
|
#include <utility> // declval, pair
|
||||||
#include <nlohmann/thirdparty/hedley/hedley.hpp>
|
|
||||||
#include <nlohmann/detail/meta/detected.hpp>
|
#include <nlohmann/detail/meta/detected.hpp>
|
||||||
|
#include <nlohmann/thirdparty/hedley/hedley.hpp>
|
||||||
|
|
||||||
// This file contains all internal macro definitions
|
// This file contains all internal macro definitions (except those affecting ABI)
|
||||||
// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
|
// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
// exclude unsupported compilers
|
// exclude unsupported compilers
|
||||||
#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
|
#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK)
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
|
@ -457,14 +459,6 @@
|
||||||
#define JSON_EXPLICIT explicit
|
#define JSON_EXPLICIT explicit
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef JSON_DIAGNOSTICS
|
|
||||||
#define JSON_DIAGNOSTICS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
|
|
||||||
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef JSON_DISABLE_ENUM_SERIALIZATION
|
#ifndef JSON_DISABLE_ENUM_SERIALIZATION
|
||||||
#define JSON_DISABLE_ENUM_SERIALIZATION 0
|
#define JSON_DISABLE_ENUM_SERIALIZATION 0
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin);
|
NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin);
|
||||||
} // namespace nlohmann
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end);
|
NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end);
|
||||||
} // namespace nlohmann
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -164,4 +163,4 @@ struct static_const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/meta/void_t.hpp>
|
#include <nlohmann/detail/meta/void_t.hpp>
|
||||||
|
|
||||||
// https://en.cppreference.com/w/cpp/experimental/is_detected
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
namespace nlohmann
|
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// https://en.cppreference.com/w/cpp/experimental/is_detected
|
||||||
struct nonesuch
|
struct nonesuch
|
||||||
{
|
{
|
||||||
nonesuch() = delete;
|
nonesuch() = delete;
|
||||||
|
@ -65,5 +65,6 @@ using is_detected_exact = std::is_same<Expected, detected_t<Op, Args...>>;
|
||||||
template<class To, template<class...> class Op, class... Args>
|
template<class To, template<class...> class Op, class... Args>
|
||||||
using is_detected_convertible =
|
using is_detected_convertible =
|
||||||
std::is_convertible<detected_t<Op, Args...>, To>;
|
std::is_convertible<detected_t<Op, Args...>, To>;
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -8,11 +8,14 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace nlohmann
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
{
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
// dispatching helper struct
|
// dispatching helper struct
|
||||||
template <class T> struct identity_tag {};
|
template <class T> struct identity_tag {};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -12,13 +12,14 @@
|
||||||
#include <utility> // declval
|
#include <utility> // declval
|
||||||
#include <string> // string
|
#include <string> // string
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
#include <nlohmann/detail/meta/detected.hpp>
|
#include <nlohmann/detail/meta/detected.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using null_function_t = decltype(std::declval<T&>().null());
|
using null_function_t = decltype(std::declval<T&>().null());
|
||||||
|
|
||||||
|
@ -153,5 +154,6 @@ struct is_sax_static_asserts
|
||||||
"Missing/invalid function: bool parse_error(std::size_t, const "
|
"Missing/invalid function: bool parse_error(std::size_t, const "
|
||||||
"std::string&, const exception&)");
|
"std::string&, const exception&)");
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
|
#if JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
||||||
|
#include <experimental/filesystem>
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
namespace std_fs = std::experimental::filesystem;
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
#elif JSON_HAS_FILESYSTEM
|
||||||
|
#include <filesystem>
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
namespace std_fs = std::filesystem;
|
||||||
|
} // namespace detail
|
||||||
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
#endif
|
|
@ -13,17 +13,15 @@
|
||||||
#include <utility> // declval
|
#include <utility> // declval
|
||||||
#include <tuple> // tuple
|
#include <tuple> // tuple
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
|
||||||
|
|
||||||
#include <nlohmann/detail/iterators/iterator_traits.hpp>
|
#include <nlohmann/detail/iterators/iterator_traits.hpp>
|
||||||
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
#include <nlohmann/detail/meta/call_std/begin.hpp>
|
#include <nlohmann/detail/meta/call_std/begin.hpp>
|
||||||
#include <nlohmann/detail/meta/call_std/end.hpp>
|
#include <nlohmann/detail/meta/call_std/end.hpp>
|
||||||
#include <nlohmann/detail/meta/cpp_future.hpp>
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
#include <nlohmann/detail/meta/detected.hpp>
|
#include <nlohmann/detail/meta/detected.hpp>
|
||||||
#include <nlohmann/json_fwd.hpp>
|
#include <nlohmann/json_fwd.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
/*!
|
/*!
|
||||||
@brief detail namespace with internal helper functions
|
@brief detail namespace with internal helper functions
|
||||||
|
|
||||||
|
@ -34,6 +32,7 @@ implementations of some @ref basic_json methods, and meta-programming helpers.
|
||||||
*/
|
*/
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
/////////////
|
/////////////
|
||||||
// helpers //
|
// helpers //
|
||||||
/////////////
|
/////////////
|
||||||
|
@ -686,4 +685,4 @@ inline constexpr bool value_in_range_of(T val)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -8,14 +8,17 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace nlohmann
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
{
|
|
||||||
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
template<typename ...Ts> struct make_void
|
template<typename ...Ts> struct make_void
|
||||||
{
|
{
|
||||||
using type = void;
|
using type = void;
|
||||||
};
|
};
|
||||||
template<typename ...Ts> using void_t = typename make_void<Ts...>::type;
|
template<typename ...Ts> using void_t = typename make_void<Ts...>::type;
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -24,10 +24,10 @@
|
||||||
#include <nlohmann/detail/output/output_adapters.hpp>
|
#include <nlohmann/detail/output/output_adapters.hpp>
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
// binary writer //
|
// binary writer //
|
||||||
///////////////////
|
///////////////////
|
||||||
|
@ -1833,5 +1833,6 @@ class binary_writer
|
||||||
/// the output
|
/// the output
|
||||||
output_adapter_t<CharType> oa = nullptr;
|
output_adapter_t<CharType> oa = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -22,10 +22,10 @@
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
/// abstract output adapter interface
|
/// abstract output adapter interface
|
||||||
template<typename CharType> struct output_adapter_protocol
|
template<typename CharType> struct output_adapter_protocol
|
||||||
{
|
{
|
||||||
|
@ -142,5 +142,6 @@ class output_adapter
|
||||||
private:
|
private:
|
||||||
output_adapter_t<CharType> oa = nullptr;
|
output_adapter_t<CharType> oa = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -31,10 +31,10 @@
|
||||||
#include <nlohmann/detail/string_concat.hpp>
|
#include <nlohmann/detail/string_concat.hpp>
|
||||||
#include <nlohmann/detail/value_t.hpp>
|
#include <nlohmann/detail/value_t.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
// serialization //
|
// serialization //
|
||||||
///////////////////
|
///////////////////
|
||||||
|
@ -983,5 +983,6 @@ class serializer
|
||||||
/// error_handler how to react on decoding errors
|
/// error_handler how to react on decoding errors
|
||||||
const error_handler_t error_handler;
|
const error_handler_t error_handler;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
#include <nlohmann/detail/meta/cpp_future.hpp>
|
#include <nlohmann/detail/meta/cpp_future.hpp>
|
||||||
#include <nlohmann/detail/meta/detected.hpp>
|
#include <nlohmann/detail/meta/detected.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -144,4 +143,4 @@ inline OutStringType concat(Args && ... args)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -8,10 +8,9 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -70,4 +69,4 @@ static void unescape(StringType& s)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -18,10 +18,10 @@
|
||||||
#include <compare> // partial_ordering
|
#include <compare> // partial_ordering
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
// JSON type enumeration //
|
// JSON type enumeration //
|
||||||
///////////////////////////
|
///////////////////////////
|
||||||
|
@ -113,5 +113,6 @@ inline bool operator<(const value_t lhs, const value_t rhs) noexcept
|
||||||
return std::is_lt(lhs <=> rhs); // *NOPAD*
|
return std::is_lt(lhs <=> rhs); // *NOPAD*
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
|
@ -18,18 +18,6 @@
|
||||||
#ifndef INCLUDE_NLOHMANN_JSON_HPP_
|
#ifndef INCLUDE_NLOHMANN_JSON_HPP_
|
||||||
#define INCLUDE_NLOHMANN_JSON_HPP_
|
#define INCLUDE_NLOHMANN_JSON_HPP_
|
||||||
|
|
||||||
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
|
|
||||||
#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
|
|
||||||
#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 10 || NLOHMANN_JSON_VERSION_PATCH != 5
|
|
||||||
#warning "Already included a different version of the library!"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
|
|
||||||
#define NLOHMANN_JSON_VERSION_MINOR 10 // NOLINT(modernize-macro-to-enum)
|
|
||||||
#define NLOHMANN_JSON_VERSION_PATCH 5 // NOLINT(modernize-macro-to-enum)
|
|
||||||
|
|
||||||
#include <algorithm> // all_of, find, for_each
|
#include <algorithm> // all_of, find, for_each
|
||||||
#include <cstddef> // nullptr_t, ptrdiff_t, size_t
|
#include <cstddef> // nullptr_t, ptrdiff_t, size_t
|
||||||
#include <functional> // hash, less
|
#include <functional> // hash, less
|
||||||
|
@ -83,8 +71,7 @@
|
||||||
@see https://github.com/nlohmann
|
@see https://github.com/nlohmann
|
||||||
@since version 1.0.0
|
@since version 1.0.0
|
||||||
*/
|
*/
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief a class to store JSON values
|
@brief a class to store JSON values
|
||||||
|
@ -5087,7 +5074,7 @@ std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j)
|
||||||
return j.dump();
|
return j.dump();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
||||||
///////////////////////
|
///////////////////////
|
||||||
// nonmember support //
|
// nonmember support //
|
||||||
|
|
|
@ -15,13 +15,15 @@
|
||||||
#include <string> // string
|
#include <string> // string
|
||||||
#include <vector> // vector
|
#include <vector> // vector
|
||||||
|
|
||||||
|
#include <nlohmann/detail/abi_macros.hpp>
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief namespace for Niels Lohmann
|
@brief namespace for Niels Lohmann
|
||||||
@see https://github.com/nlohmann
|
@see https://github.com/nlohmann
|
||||||
@since version 1.0.0
|
@since version 1.0.0
|
||||||
*/
|
*/
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
/*!
|
/*!
|
||||||
@brief default JSONSerializer template argument
|
@brief default JSONSerializer template argument
|
||||||
|
|
||||||
|
@ -67,6 +69,6 @@ struct ordered_map;
|
||||||
/// @sa https://json.nlohmann.me/api/ordered_json/
|
/// @sa https://json.nlohmann.me/api/ordered_json/
|
||||||
using ordered_json = basic_json<nlohmann::ordered_map>;
|
using ordered_json = basic_json<nlohmann::ordered_map>;
|
||||||
|
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
||||||
#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_
|
#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_
|
||||||
|
|
|
@ -20,8 +20,7 @@
|
||||||
#include <nlohmann/detail/macro_scope.hpp>
|
#include <nlohmann/detail/macro_scope.hpp>
|
||||||
#include <nlohmann/detail/meta/type_traits.hpp>
|
#include <nlohmann/detail/meta/type_traits.hpp>
|
||||||
|
|
||||||
namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_BEGIN
|
||||||
{
|
|
||||||
|
|
||||||
/// ordered_map: a minimal map-like container that preserves insertion order
|
/// ordered_map: a minimal map-like container that preserves insertion order
|
||||||
/// for use within nlohmann::basic_json<ordered_map>
|
/// for use within nlohmann::basic_json<ordered_map>
|
||||||
|
@ -357,4 +356,4 @@ private:
|
||||||
JSON_NO_UNIQUE_ADDRESS key_compare m_compare = key_compare();
|
JSON_NO_UNIQUE_ADDRESS key_compare m_compare = key_compare();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace nlohmann
|
NLOHMANN_JSON_NAMESPACE_END
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -147,6 +147,12 @@ json_test_add_test_for(src/unit-comparison.cpp
|
||||||
|
|
||||||
# *DO NOT* use json_test_set_test_options() below this line
|
# *DO NOT* use json_test_set_test_options() below this line
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# test ABI compatibility
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
add_subdirectory(abi)
|
||||||
|
|
||||||
#############################################################################
|
#############################################################################
|
||||||
# Test the generated build configs
|
# Test the generated build configs
|
||||||
#############################################################################
|
#############################################################################
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
# common build settings
|
||||||
|
add_library(abi_compat_common INTERFACE)
|
||||||
|
target_compile_definitions(abi_compat_common INTERFACE
|
||||||
|
DOCTEST_CONFIG_SUPER_FAST_ASSERTS
|
||||||
|
JSON_TEST_KEEP_MACROS)
|
||||||
|
target_compile_features(abi_compat_common INTERFACE cxx_std_11)
|
||||||
|
target_compile_options(abi_compat_common INTERFACE
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:/EHsc;$<$<CONFIG:Release>:/Od>>
|
||||||
|
# MSVC: Force to always compile with W4
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:/W4>
|
||||||
|
|
||||||
|
# https://github.com/nlohmann/json/pull/3229
|
||||||
|
$<$<CXX_COMPILER_ID:Intel>:-diag-disable=2196>
|
||||||
|
|
||||||
|
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wno-deprecated;-Wno-float-equal>
|
||||||
|
$<$<CXX_COMPILER_ID:GNU>:-Wno-deprecated-declarations>
|
||||||
|
$<$<CXX_COMPILER_ID:Intel>:-diag-disable=1786>)
|
||||||
|
target_include_directories(abi_compat_common SYSTEM INTERFACE
|
||||||
|
../thirdparty/doctest
|
||||||
|
include)
|
||||||
|
target_link_libraries(abi_compat_common INTERFACE ${NLOHMANN_JSON_TARGET_NAME})
|
||||||
|
|
||||||
|
# shared main()
|
||||||
|
add_library(abi_compat_main STATIC main.cpp)
|
||||||
|
target_link_libraries(abi_compat_main PUBLIC abi_compat_common)
|
||||||
|
|
||||||
|
# add individual tests
|
||||||
|
add_subdirectory(diag)
|
||||||
|
add_subdirectory(inline_ns)
|
|
@ -0,0 +1,19 @@
|
||||||
|
# test linking library built with different JSON_DIAGNOSTICS setting
|
||||||
|
# into the same executable
|
||||||
|
|
||||||
|
# compile code using JSON_DIAGNOSTICS=1
|
||||||
|
add_library(abi_compat_diag_on STATIC diag_on.cpp)
|
||||||
|
target_link_libraries(abi_compat_diag_on PUBLIC abi_compat_common)
|
||||||
|
|
||||||
|
# compile code using JSON_DIAGNOSTICS=0
|
||||||
|
add_library(abi_compat_diag_off STATIC diag_off.cpp)
|
||||||
|
target_link_libraries(abi_compat_diag_off PUBLIC abi_compat_common)
|
||||||
|
|
||||||
|
# build test executable and add test
|
||||||
|
add_executable(abi_compat_diag diag.cpp)
|
||||||
|
target_link_libraries(abi_compat_diag PRIVATE
|
||||||
|
abi_compat_main abi_compat_diag_on abi_compat_diag_off)
|
||||||
|
|
||||||
|
add_test(
|
||||||
|
NAME test-abi_compat_diag
|
||||||
|
COMMAND abi_compat_diag ${DOCTEST_TEST_FILTER})
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include "doctest_compatibility.h"
|
||||||
|
|
||||||
|
#include "diag.hpp"
|
||||||
|
|
||||||
|
TEST_CASE("ABI compatible diagnostics")
|
||||||
|
{
|
||||||
|
SECTION("basic_json size")
|
||||||
|
{
|
||||||
|
// basic_json with diagnostics is larger because of added data members
|
||||||
|
CHECK(json_sizeof_diag_on() == json_sizeof_diag_on_explicit());
|
||||||
|
CHECK(json_sizeof_diag_off() == json_sizeof_diag_off_explicit());
|
||||||
|
CHECK(json_sizeof_diag_on() > json_sizeof_diag_off());
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("basic_json at")
|
||||||
|
{
|
||||||
|
// accessing a nonexistent key throws different exception with diagnostics
|
||||||
|
CHECK_THROWS_WITH(json_at_diag_on(), "[json.exception.out_of_range.403] (/foo) key 'bar' not found");
|
||||||
|
CHECK_THROWS_WITH(json_at_diag_off(), "[json.exception.out_of_range.403] key 'bar' not found");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
std::size_t json_sizeof_diag_on();
|
||||||
|
std::size_t json_sizeof_diag_on_explicit();
|
||||||
|
|
||||||
|
std::size_t json_sizeof_diag_off();
|
||||||
|
std::size_t json_sizeof_diag_off_explicit();
|
||||||
|
|
||||||
|
void json_at_diag_on();
|
||||||
|
void json_at_diag_off();
|
|
@ -0,0 +1,22 @@
|
||||||
|
#undef JSON_DIAGNOSTICS
|
||||||
|
#define JSON_DIAGNOSTICS 0
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
#include "diag.hpp"
|
||||||
|
|
||||||
|
std::size_t json_sizeof_diag_off()
|
||||||
|
{
|
||||||
|
return sizeof(nlohmann::json);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t json_sizeof_diag_off_explicit()
|
||||||
|
{
|
||||||
|
return sizeof(::NLOHMANN_JSON_NAMESPACE::json);
|
||||||
|
}
|
||||||
|
|
||||||
|
void json_at_diag_off()
|
||||||
|
{
|
||||||
|
using nlohmann::json;
|
||||||
|
json j = json{{"foo", json::object()}};
|
||||||
|
j.at(json::json_pointer("/foo/bar"));
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
#undef JSON_DIAGNOSTICS
|
||||||
|
#define JSON_DIAGNOSTICS 1
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
#include "diag.hpp"
|
||||||
|
|
||||||
|
std::size_t json_sizeof_diag_on()
|
||||||
|
{
|
||||||
|
return sizeof(nlohmann::json);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::size_t json_sizeof_diag_on_explicit()
|
||||||
|
{
|
||||||
|
return sizeof(::NLOHMANN_JSON_NAMESPACE::json);
|
||||||
|
}
|
||||||
|
|
||||||
|
void json_at_diag_on()
|
||||||
|
{
|
||||||
|
using nlohmann::json;
|
||||||
|
json j = json{{"foo", json::object()}};
|
||||||
|
j.at(json::json_pointer("/foo/bar"));
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,12 @@
|
||||||
|
# test linking an old library version without an inline namespace
|
||||||
|
# with the current library using an inline namespace into the same executable
|
||||||
|
|
||||||
|
# build test executable and add test
|
||||||
|
add_executable(abi_compat_inline_ns
|
||||||
|
use_v3_10_5.cpp
|
||||||
|
use_current.cpp)
|
||||||
|
target_link_libraries(abi_compat_inline_ns PRIVATE abi_compat_main)
|
||||||
|
|
||||||
|
add_test(
|
||||||
|
NAME test-abi_compat_inline_ns
|
||||||
|
COMMAND abi_compat_inline_ns ${DOCTEST_TEST_FILTER})
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include "doctest_compatibility.h"
|
||||||
|
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
TEST_CASE("use current library with inline namespace")
|
||||||
|
{
|
||||||
|
SECTION("implicitly")
|
||||||
|
{
|
||||||
|
using nlohmann::json;
|
||||||
|
using nlohmann::ordered_json;
|
||||||
|
|
||||||
|
json j;
|
||||||
|
// In v3.10.5 mixing json_pointers of different basic_json types
|
||||||
|
// results in implicit string conversion
|
||||||
|
j[ordered_json::json_pointer("/root")] = json::object();
|
||||||
|
CHECK(j.dump() == "{\"root\":{}}");
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("explicitly")
|
||||||
|
{
|
||||||
|
using NLOHMANN_JSON_NAMESPACE::json;
|
||||||
|
using NLOHMANN_JSON_NAMESPACE::ordered_json;
|
||||||
|
|
||||||
|
json j;
|
||||||
|
j[ordered_json::json_pointer("/root")] = json::object();
|
||||||
|
CHECK(j.dump() == "{\"root\":{}}");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#include "doctest_compatibility.h"
|
||||||
|
|
||||||
|
#include <nlohmann/json_v3_10_5.hpp>
|
||||||
|
using nlohmann::json;
|
||||||
|
using nlohmann::ordered_json;
|
||||||
|
|
||||||
|
TEST_CASE("use library v3.10.5 without inline namespace")
|
||||||
|
{
|
||||||
|
json j;
|
||||||
|
j[ordered_json::json_pointer("/root")] = json::object();
|
||||||
|
// In v3.10.5 mixing json_pointers of different basic_json types
|
||||||
|
// results in implicit string conversion
|
||||||
|
CHECK(j.dump() == "{\"/root\":{}}");
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
__ _____ _____ _____
|
||||||
|
__| | __| | | | JSON for Modern C++ (test suite)
|
||||||
|
| | |__ | | | | | | version 3.10.5
|
||||||
|
|_____|_____|_____|_|___| https://github.com/nlohmann/json
|
||||||
|
|
||||||
|
Licensed under the MIT License <http://opensource.org/licenses/MIT>.
|
||||||
|
SPDX-License-Identifier: MIT
|
||||||
|
Copyright (c) 2013-2022 Niels Lohmann <http://nlohmann.me>.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||||
|
#include "doctest_compatibility.h"
|
|
@ -33,20 +33,6 @@ using ordered_json = nlohmann::ordered_json;
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if JSON_HAS_EXPERIMENTAL_FILESYSTEM
|
|
||||||
#include <experimental/filesystem>
|
|
||||||
namespace nlohmann::detail
|
|
||||||
{
|
|
||||||
namespace std_fs = std::experimental::filesystem;
|
|
||||||
} // namespace nlohmann::detail
|
|
||||||
#elif JSON_HAS_FILESYSTEM
|
|
||||||
#include <filesystem>
|
|
||||||
namespace nlohmann::detail
|
|
||||||
{
|
|
||||||
namespace std_fs = std::filesystem;
|
|
||||||
} // namespace nlohmann::detail
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JSON_HAS_CPP_20
|
#ifdef JSON_HAS_CPP_20
|
||||||
#include <span>
|
#include <span>
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -50,7 +50,8 @@ File [nlohmann-json.py](nlohmann-json.py) contains a pretty printer for GDB for
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Tested with GDB 9.2. See [#1952](https://github.com/nlohmann/json/issues/1952) for more information. Please post questions there.
|
Requires Python 3.9+. Last tested with GDB 12.1.
|
||||||
|
See [#1952](https://github.com/nlohmann/json/issues/1952) for more information. Please post questions there.
|
||||||
|
|
||||||
## Copyright
|
## Copyright
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import gdb
|
import gdb
|
||||||
|
import re
|
||||||
|
|
||||||
|
ns_pattern = re.compile(r'nlohmann::json_v(?P<v_major>\d+)_(?P<v_minor>\d+)_(?P<v_patch>\d+)(?P<tags>\w*)::(?P<name>.+)')
|
||||||
class JsonValuePrinter:
|
class JsonValuePrinter:
|
||||||
"Print a json-value"
|
"Print a json-value"
|
||||||
|
|
||||||
|
@ -12,12 +14,14 @@ class JsonValuePrinter:
|
||||||
return self.val
|
return self.val
|
||||||
|
|
||||||
def json_lookup_function(val):
|
def json_lookup_function(val):
|
||||||
name = val.type.strip_typedefs().name
|
m = ns_pattern.fullmatch(val.type.strip_typedefs().name)
|
||||||
if name and name.startswith("nlohmann::basic_json<") and name.endswith(">"):
|
name = m.group('name')
|
||||||
t = str(val['m_type'])
|
if name and name.startswith('basic_json<') and name.endswith('>'):
|
||||||
if t.startswith("nlohmann::detail::value_t::"):
|
m = ns_pattern.fullmatch(str(val['m_type']))
|
||||||
|
t = m.group('name')
|
||||||
|
if t and t.startswith('detail::value_t::'):
|
||||||
try:
|
try:
|
||||||
union_val = val['m_value'][t[27:]]
|
union_val = val['m_value'][t.removeprefix('detail::value_t::')]
|
||||||
if union_val.type.code == gdb.TYPE_CODE_PTR:
|
if union_val.type.code == gdb.TYPE_CODE_PTR:
|
||||||
return gdb.default_visualizer(union_val.dereference())
|
return gdb.default_visualizer(union_val.dereference())
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue