mirror of
https://github.com/nlohmann/json.git
synced 2026-10-26 15:58:55 +00:00
Clean up and document project files (#4560)
This commit is contained in:
1 parent
ad2ee18539
commit
26cfec34be
519 files changed
+3301
-1332
No files matched your search
+2
-3
@@ -7,7 +7,7 @@ all: create_output
|
||||
##########################################################################
|
||||
|
||||
# where are the example cpp files
|
||||
EXAMPLES = $(wildcard examples/*.cpp)
|
||||
EXAMPLES = $(wildcard mkdocs/docs/examples/*.cpp)
|
||||
|
||||
cxx_standard = $(lastword c++11 $(filter c++%, $(subst ., ,$1)))
|
||||
|
||||
@@ -37,9 +37,8 @@ check_output: $(EXAMPLES:.cpp=.test)
|
||||
|
||||
# check output of all stand-alone example files (exclude files with platform-dependent output.)
|
||||
# This target is used in the CI (ci_test_documentation).
|
||||
check_output_portable: $(filter-out examples/meta.test examples/max_size.test examples/std_hash.test examples/basic_json__CompatibleType.test,$(EXAMPLES:.cpp=.test))
|
||||
check_output_portable: $(filter-out mkdocs/docs/examples/meta.test mkdocs/docs/examples/max_size.test mkdocs/docs/examples/std_hash.test mkdocs/docs/examples/basic_json__CompatibleType.test,$(EXAMPLES:.cpp=.test))
|
||||
|
||||
clean:
|
||||
rm -fr $(EXAMPLES:.cpp=)
|
||||
$(MAKE) clean -C docset
|
||||
$(MAKE) clean -C mkdocs
|
||||
@@ -16,6 +16,7 @@ JSON_for_Modern_C++.docset: Info.plist docSet.dsidx
|
||||
cp icon*.png JSON_for_Modern_C++.docset
|
||||
cp Info.plist JSON_for_Modern_C++.docset/Contents
|
||||
# build and copy documentation
|
||||
$(MAKE) install_venv -C ../mkdocs
|
||||
$(MAKE) build -C ../mkdocs
|
||||
cp -r ../mkdocs/site/* JSON_for_Modern_C++.docset/Contents/Resources/Documents
|
||||
# patch CSS to hide navigation items
|
||||
|
||||
@@ -38,6 +38,7 @@ INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::emplace', 'Method
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::emplace_back', 'Method', 'api/basic_json/emplace_back/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::empty', 'Method', 'api/basic_json/empty/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::end', 'Method', 'api/basic_json/end/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::end_pos', 'Method', 'api/basic_json/end_pos/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::erase', 'Method', 'api/basic_json/erase/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::error_handler_t', 'Enum', 'api/basic_json/error_handler_t/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::exception', 'Class', 'api/basic_json/exception/index.html');
|
||||
@@ -72,6 +73,7 @@ INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::is_primitive', 'M
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::is_string', 'Method', 'api/basic_json/is_string/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::is_structured', 'Method', 'api/basic_json/is_structured/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::items', 'Method', 'api/basic_json/items/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::json_base_class_t', 'Type', 'api/basic_json/json_base_class_t/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::json_serializer', 'Class', 'api/basic_json/json_serializer/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::max_size', 'Method', 'api/basic_json/max_size/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::merge_patch', 'Method', 'api/basic_json/merge_patch/index.html');
|
||||
@@ -107,6 +109,7 @@ INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::rbegin', 'Method'
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::rend', 'Method', 'api/basic_json/rend/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::sax_parse', 'Function', 'api/basic_json/sax_parse/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::size', 'Method', 'api/basic_json/size/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::start_pos', 'Method', 'api/basic_json/start_pos/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::string_t', 'Type', 'api/basic_json/string_t/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::swap', 'Method', 'api/basic_json/swap/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('basic_json::type', 'Method', 'api/basic_json/type/index.html');
|
||||
@@ -175,6 +178,7 @@ INSERT INTO searchIndex(name, type, path) VALUES ('Element Access', 'Guide', 'fe
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Element Access: Access with default value: value', 'Guide', 'features/element_access/default_value/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Element Access: Checked access: at', 'Guide', 'features/element_access/checked_access/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Element Access: Unchecked access: operator[]', 'Guide', 'features/element_access/unchecked_access/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Exceptions', 'Guide', 'home/exceptions/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Integration: Migration Guide', 'Guide', 'integration/migration_guide/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Integration: CMake', 'Guide', 'integration/cmake/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Integration: Header only', 'Guide', 'integration/index.html');
|
||||
@@ -201,6 +205,7 @@ INSERT INTO searchIndex(name, type, path) VALUES ('Supported Macros', 'Guide', '
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_ASSERT', 'Macro', 'api/macros/json_assert/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_CATCH_USER', 'Macro', 'api/macros/json_throw_user/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_DIAGNOSTICS', 'Macro', 'api/macros/json_diagnostics/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_DIAGNOSTIC_POSITIONS', 'Macro', 'api/macros/json_diagnostic_positions/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_DISABLE_ENUM_SERIALIZATION', 'Macro', 'api/macros/json_disable_enum_serialization/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_CPP_11', 'Macro', 'api/macros/json_has_cpp_11/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_CPP_14', 'Macro', 'api/macros/json_has_cpp_11/index.html');
|
||||
@@ -209,6 +214,7 @@ INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_CPP_20', 'Macro', 'a
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_EXPERIMENTAL_FILESYSTEM', 'Macro', 'api/macros/json_has_filesystem/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_FILESYSTEM', 'Macro', 'api/macros/json_has_filesystem/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_RANGES', 'Macro', 'api/macros/json_has_ranges/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_STATIC_RTTI', 'Macro', 'api/macros/json_has_static_rtti/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_HAS_THREE_WAY_COMPARISON', 'Macro', 'api/macros/json_has_three_way_comparison/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_NOEXCEPTION', 'Macro', 'api/macros/json_noexception/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_NO_IO', 'Macro', 'api/macros/json_no_io/index.html');
|
||||
@@ -220,6 +226,10 @@ INSERT INTO searchIndex(name, type, path) VALUES ('JSON_USE_GLOBAL_UDLS', 'Macro
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_USE_IMPLICIT_CONVERSIONS', 'Macro', 'api/macros/json_use_implicit_conversions/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON', 'Macro', 'api/macros/json_use_legacy_discarded_value_comparison/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('Macros', 'Macro', 'api/macros/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE', 'Macro', 'api/macros/nlohmann_define_derived_type/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT', 'Macro', 'api/macros/nlohmann_define_derived_type/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE', 'Macro', 'api/macros/nlohmann_define_derived_type/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT', 'Macro', 'api/macros/nlohmann_define_derived_type/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_TYPE_INTRUSIVE', 'Macro', 'api/macros/nlohmann_define_type_intrusive/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT', 'Macro', 'api/macros/nlohmann_define_type_intrusive/index.html');
|
||||
INSERT INTO searchIndex(name, type, path) VALUES ('NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE', 'Macro', 'api/macros/nlohmann_define_type_non_intrusive/index.html');
|
||||
|
||||
+12
-16
@@ -1,39 +1,35 @@
|
||||
# serve the site locally
|
||||
serve: prepare_files style_check
|
||||
serve: style_check
|
||||
venv/bin/mkdocs serve
|
||||
|
||||
serve_dirty: prepare_files style_check
|
||||
serve_dirty: style_check
|
||||
venv/bin/mkdocs serve --dirtyreload
|
||||
|
||||
build: prepare_files style_check
|
||||
# This target is used in the CI (ci_test_build_documentation).
|
||||
# This target is used by the docset Makefile.
|
||||
build: style_check
|
||||
venv/bin/mkdocs build
|
||||
|
||||
# create files that are not versioned inside the mkdocs folder (images, examples)
|
||||
prepare_files: clean
|
||||
mkdir docs/examples
|
||||
cp -r ../json.gif docs/images
|
||||
cp -r ../examples/*.cpp ../examples/*.output docs/examples
|
||||
|
||||
style_check:
|
||||
@cd docs ; python3 ../scripts/check_structure.py
|
||||
@cd docs ; ../venv/bin/python3 ../scripts/check_structure.py
|
||||
|
||||
# clean subfolders
|
||||
clean:
|
||||
rm -fr docs/images/json.gif docs/examples
|
||||
# check the links in the documentation
|
||||
link_check:
|
||||
ENABLED_HTMLPROOFER=true venv/bin/mkdocs build
|
||||
|
||||
# publish site to GitHub pages (not working in GitHub Actions; need special action)
|
||||
publish: prepare_files
|
||||
publish:
|
||||
venv/bin/mkdocs gh-deploy --clean --force
|
||||
|
||||
# install a Python virtual environment
|
||||
# This target is used by the docset Makefile.
|
||||
install_venv: requirements.txt
|
||||
python3 -mvenv venv
|
||||
venv/bin/pip install --upgrade pip
|
||||
venv/bin/pip install wheel
|
||||
venv/bin/pip install -r requirements.txt
|
||||
|
||||
# uninstall the virtual environment
|
||||
uninstall_venv: clean
|
||||
uninstall_venv:
|
||||
rm -fr venv
|
||||
|
||||
update_requirements:
|
||||
|
||||
@@ -20,7 +20,7 @@ Checks whether the input is valid JSON.
|
||||
The value_type of the iterator must be an integral type with size of 1, 2 or 4 bytes, which will be interpreted
|
||||
respectively as UTF-8, UTF-16 and UTF-32.
|
||||
|
||||
Unlike the [`parse`](parse.md) function, this function neither throws an exception in case of invalid JSON input
|
||||
Unlike the [`parse()`](parse.md) function, this function neither throws an exception in case of invalid JSON input
|
||||
(i.e., a parse error) nor creates diagnostic information.
|
||||
|
||||
## Template parameters
|
||||
@@ -29,7 +29,7 @@ Unlike the [`parse`](parse.md) function, this function neither throws an excepti
|
||||
: A compatible input, for instance:
|
||||
|
||||
- an `std::istream` object
|
||||
- a `FILE` pointer (throws if null)
|
||||
- a `#!c FILE` pointer (throws if null)
|
||||
- a C-style array of characters
|
||||
- a pointer to a null-terminated string of single byte characters (throws if null)
|
||||
- a `std::string`
|
||||
@@ -66,7 +66,7 @@ Strong guarantee: if an exception is thrown, there are no changes in the JSON va
|
||||
|
||||
## Exceptions
|
||||
|
||||
Throws [`parse_error.101`](../../home/exceptions.md#jsonexceptionparse_error101) in case of an empty input like a null `FILE*` or `char*` pointer.
|
||||
Throws [`parse_error.101`](../../home/exceptions.md#jsonexceptionparse_error101) in case of an empty input like a null `#!c FILE*` or `#!c char*` pointer.
|
||||
|
||||
## Complexity
|
||||
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
# <small>nlohmann::basic_json::</small>end_pos
|
||||
|
||||
```cpp
|
||||
#if JSON_DIAGNOSTIC_POSITIONS
|
||||
constexpr std::size_t end_pos() const noexcept;
|
||||
#endif
|
||||
```
|
||||
|
||||
Returns the position immediately following the last character of the JSON string from which the value was parsed from.
|
||||
|
||||
| JSON type | return value |
|
||||
|-----------|-----------------------------------|
|
||||
| object | position after the closing `}` |
|
||||
| array | position after the closing `]` |
|
||||
| string | position after the closing `"` |
|
||||
| number | position after the last character |
|
||||
| boolean | position after `e` |
|
||||
| null | position after `l` |
|
||||
|
||||
## Return value
|
||||
|
||||
the position of the character _following_ the last character of the given value in the parsed JSON string, if the
|
||||
value was created by the [`parse`](parse.md) function, or `std::string::npos` if the value was constructed otherwise
|
||||
|
||||
## Exception safety
|
||||
|
||||
No-throw guarantee: this member function never throws exceptions.
|
||||
|
||||
## Complexity
|
||||
|
||||
Constant.
|
||||
|
||||
## Notes
|
||||
|
||||
!!! note "Note"
|
||||
|
||||
The function is only available if macro [`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) has
|
||||
been defined to `#!cpp 1` before including the library header.
|
||||
|
||||
!!! warning "Invalidation"
|
||||
|
||||
The returned positions are only valid as long as the JSON value is not changed. The positions are *not* updated
|
||||
when the JSON value is changed.
|
||||
|
||||
## Examples
|
||||
|
||||
??? example "Example"
|
||||
|
||||
```cpp
|
||||
--8<-- "examples/diagnostic_positions.cpp"
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```
|
||||
--8<-- "examples/diagnostic_positions.output"
|
||||
```
|
||||
|
||||
The output shows the start/end positions of all the objects and fields in the JSON string.
|
||||
|
||||
## See also
|
||||
|
||||
- [start_pos](start_pos.md) to access the start position
|
||||
- [JSON_DIAGNOSTIC_POSITIONS](../macros/json_diagnostic_positions.md) for an overview of the diagnostic positions
|
||||
|
||||
## Version history
|
||||
|
||||
- Added in version 3.12.0.
|
||||
@@ -156,9 +156,9 @@ The class satisfies the following concept requirements:
|
||||
- [(constructor)](basic_json.md)
|
||||
- [(destructor)](~basic_json.md)
|
||||
- [**operator=**](operator=.md) - copy assignment
|
||||
- [**array**](array_t.md) (_static_) - explicitly create an array
|
||||
- [**array**](array.md) (_static_) - explicitly create an array
|
||||
- [**binary**](binary.md) (_static_) - explicitly create a binary array
|
||||
- [**object**](object_t.md) (_static_) - explicitly create an object
|
||||
- [**object**](object.md) (_static_) - explicitly create an object
|
||||
|
||||
### Object inspection
|
||||
|
||||
@@ -181,6 +181,11 @@ Functions to inspect the type of a JSON value.
|
||||
- [**is_binary**](is_binary.md) - return whether value is a binary array
|
||||
- [**is_discarded**](is_discarded.md) - return whether value is discarded
|
||||
|
||||
Optional functions to access the [diagnostic positions](../macros/json_diagnostic_positions.md).
|
||||
|
||||
- [**start_pos**](start_pos.md) - return the start position of the value
|
||||
- [**end_pos**](end_pos.md) - return the one past the end position of the value
|
||||
|
||||
### Value access
|
||||
|
||||
Direct access to the stored value of a JSON value.
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
# <small>nlohmann::basic_json::</small>start_pos
|
||||
|
||||
```cpp
|
||||
#if JSON_DIAGNOSTIC_POSITIONS
|
||||
constexpr std::size_t start_pos() const noexcept;
|
||||
#endif
|
||||
```
|
||||
|
||||
Returns the position of the first character in the JSON string from which the value was parsed from.
|
||||
|
||||
| JSON type | return value |
|
||||
|-----------|------------------------------------------------|
|
||||
| object | position of the opening `{` |
|
||||
| array | position of the opening `[` |
|
||||
| string | position of the opening `"` |
|
||||
| number | position of the first character |
|
||||
| boolean | position of `t` for `true` and `f` for `false` |
|
||||
| null | position of `n` |
|
||||
|
||||
## Return value
|
||||
|
||||
the position of the first character of the value in the parsed JSON string, if the value was created by the
|
||||
[`parse`](parse.md) function, or `std::string::npos` if the value was constructed otherwise
|
||||
|
||||
## Exception safety
|
||||
|
||||
No-throw guarantee: this member function never throws exceptions.
|
||||
|
||||
## Complexity
|
||||
|
||||
Constant.
|
||||
|
||||
## Notes
|
||||
|
||||
!!! note "Note"
|
||||
|
||||
The function is only available if macro [`JSON_DIAGNOSTIC_POSITIONS`](../macros/json_diagnostic_positions.md) has
|
||||
been defined to `#!cpp 1` before including the library header.
|
||||
|
||||
!!! warning "Invalidation"
|
||||
|
||||
The returned positions are only valid as long as the JSON value is not changed. The positions are *not* updated
|
||||
when the JSON value is changed.
|
||||
|
||||
## Examples
|
||||
|
||||
??? example "Example"
|
||||
|
||||
```cpp
|
||||
--8<-- "examples/diagnostic_positions.cpp"
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```
|
||||
--8<-- "examples/diagnostic_positions.output"
|
||||
```
|
||||
|
||||
The output shows the start/end positions of all the objects and fields in the JSON string.
|
||||
|
||||
## See also
|
||||
|
||||
- [end_pos](end_pos.md) to access the end position
|
||||
- [JSON_DIAGNOSTIC_POSITIONS](../macros/json_diagnostic_positions.md) for an overview of the diagnostic positions
|
||||
|
||||
## Version history
|
||||
|
||||
- Added in version 3.12.0.
|
||||
@@ -11,6 +11,7 @@ header. See also the [macro overview page](../../features/macros.md).
|
||||
|
||||
- [**JSON_CATCH_USER(exception)**<br>**JSON_THROW_USER(exception)**<br>**JSON_TRY_USER**](json_throw_user.md) - control exceptions
|
||||
- [**JSON_DIAGNOSTICS**](json_diagnostics.md) - control extended diagnostics
|
||||
- [**JSON_DIAGNOSTIC_POSITIONS**](json_diagnostic_positions.md) - access positions of elements
|
||||
- [**JSON_NOEXCEPTION**](json_noexception.md) - switch off exceptions
|
||||
|
||||
## Language support
|
||||
@@ -49,27 +50,34 @@ header. See also the [macro overview page](../../features/macros.md).
|
||||
|
||||
## Serialization/deserialization macros
|
||||
|
||||
- Enum: [**NLOHMANN_JSON_SERIALIZE_ENUM**](nlohmann_json_serialize_enum.md)
|
||||
- Class/struct:
|
||||
- Do you need to serialize private variables?
|
||||
- Yes? Do you only need serialization?
|
||||
- Yes? `NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE`
|
||||
- No? Allow deserialization of JSON values with missing values?
|
||||
- Yes? `NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT`
|
||||
- No? `NLOHMANN_DEFINE_TYPE_INTRUSIVE`
|
||||
- No? Do you only need serialization?
|
||||
- Yes? `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE`
|
||||
- No? Allow deserialization of JSON values with missing values?
|
||||
- Yes? `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT`
|
||||
- No? `NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE`
|
||||
### Enums
|
||||
|
||||
- [**NLOHMANN_DEFINE_TYPE_INTRUSIVE(type, member...)**<br>**NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(type, member...)**
|
||||
<br>**NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE(type, member...)**][DefInt]
|
||||
\- serialization/deserialization of types _with_ access to private variables
|
||||
- [**NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(type, member...)**<br>**NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(type, member...)**
|
||||
<br>**NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(type, member...)**][DefNonInt]
|
||||
\- serialization/deserialization of types _without_ access to private variables
|
||||
- [**NLOHMANN_JSON_SERIALIZE_ENUM(type, ...)**](nlohmann_json_serialize_enum.md) - serialization/deserialization of enum types
|
||||
- [**NLOHMANN_JSON_SERIALIZE_ENUM**](nlohmann_json_serialize_enum.md) - serialize/deserialize an enum
|
||||
|
||||
[DefInt]: nlohmann_define_type_intrusive.md
|
||||
[DefNonInt]: nlohmann_define_type_non_intrusive.md
|
||||
### Classes and structs
|
||||
|
||||
- [**NLOHMANN_DEFINE_TYPE_INTRUSIVE**](nlohmann_define_type_intrusive.md) - serialize/deserialize a non-derived class
|
||||
with private members
|
||||
- [**NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT**](nlohmann_define_type_intrusive.md) - serialize/deserialize a
|
||||
non-derived class with private members; uses default values
|
||||
- [**NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE**](nlohmann_define_type_intrusive.md) - serialize a non-derived class
|
||||
with private members
|
||||
- [**NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE**](nlohmann_define_type_non_intrusive.md) - serialize/deserialize a non-derived
|
||||
class
|
||||
- [**NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT**](nlohmann_define_type_non_intrusive.md) - serialize/deserialize a
|
||||
non-derived class; uses default values
|
||||
- [**NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE**](nlohmann_define_type_non_intrusive.md) - serialize a
|
||||
non-derived class
|
||||
|
||||
- [**NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE**](nlohmann_define_derived_type.md) - serialize/deserialize a derived class
|
||||
with private members
|
||||
- [**NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT**](nlohmann_define_derived_type.md) - serialize/deserialize a
|
||||
derived class with private members; uses default values
|
||||
- [**NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE**](nlohmann_define_derived_type.md) - serialize a derived
|
||||
class with private members
|
||||
- [**NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE**](nlohmann_define_derived_type.md) - serialize/deserialize a derived
|
||||
class
|
||||
- [**NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT**](nlohmann_define_derived_type.md) - serialize/deserialize
|
||||
a derived class; uses default values
|
||||
- [**NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE**](nlohmann_define_derived_type.md) - serialize a derived
|
||||
class
|
||||
@@ -6,22 +6,34 @@
|
||||
|
||||
This macro enables position diagnostics for generated JSON objects.
|
||||
|
||||
When enabled, two new properties: `start_pos()` and `end_pos()` are added to `nlohmann::basic_json` objects and fields. `start_pos()` returns the start
|
||||
position of that JSON object/field in the original string the object was parsed from. Likewise, `end_pos()` returns the end position of that JSON
|
||||
object/field in the original string the object was parsed from.
|
||||
When enabled, two new member functions [`start_pos()`](../basic_json/start_pos.md) and
|
||||
[`end_pos()`](../basic_json/end_pos.md) are added to [`basic_json`](../basic_json/index.md) values. If the value was
|
||||
created by calling the[`parse`](../basic_json/parse.md) function, then these functions allow to query the byte positions
|
||||
of the value in the input it was parsed from. In case the value was constructed by other means, `std::string::npos` is
|
||||
returned.
|
||||
|
||||
`start_pos()` returns the first character of a given element in the original JSON string, while `end_pos()` returns the character following the last
|
||||
character. For objects and arrays, the first and last characters correspond to the opening or closing braces/brackets, respectively. For fields, the first
|
||||
and last character represent the opening and closing quotes or the first and last character of the field's numerical or predefined value
|
||||
(true/false/null), respectively.
|
||||
[`start_pos()`](../basic_json/start_pos.md) returns the position of the first character of a given value in the original
|
||||
JSON string, while [`end_pos()`](../basic_json/end_pos.md) returns the position of the character _following_ the last
|
||||
character. For objects and arrays, the first and last characters correspond to the opening or closing braces/brackets,
|
||||
respectively. For primitive values, the first and last character represent the opening and closing quotes (strings) or
|
||||
the first and last character of the field's numerical or predefined value (`true`, `false`, `null`), respectively.
|
||||
|
||||
Given the above, `end_pos() - start_pos()` for an object or field provides the length of the string representation for that object or field, including the
|
||||
opening or closing braces, brackets, or quotes.
|
||||
| JSON type | return value [`start_pos()`](../basic_json/start_pos.md) | return value [`end_pos()`](../basic_json/end_pos.md) |
|
||||
|-----------|----------------------------------------------------------|------------------------------------------------------|
|
||||
| object | position of the opening `{` | position after the closing `}` |
|
||||
| array | position of the opening `[` | position after the closing `]` |
|
||||
| string | position of the opening `"` | position after the closing `"` |
|
||||
| number | position of the first character | position after the last character |
|
||||
| boolean | position of `t` for `true` and `f` for `false` | position after `e` |
|
||||
| null | position of `n` | position after `l` |
|
||||
|
||||
`start_pos()` and `end_pos()` are only set if the JSON object was parsed using `parse()`. For all other cases, `std::string::npos` will be returned.
|
||||
Given the above, [`end_pos()`](../basic_json/end_pos.md)` - `[`start_pos()`](../basic_json/start_pos.md) for a JSON
|
||||
value provides the length of the parsed JSON string for that value, including the opening or closing braces, brackets,
|
||||
or quotes.
|
||||
|
||||
Note that enabling this macro increases the size of every JSON value by two `std::size_t` fields and adds
|
||||
slight runtime overhead.
|
||||
Note that enabling this macro increases the size of every JSON value by two `std::size_t` fields and adds slight runtime
|
||||
overhead to parsing, copying JSON value objects, and the generation of error messages for exceptions. It also causes
|
||||
these values to be reported in those error messages.
|
||||
|
||||
## Default definition
|
||||
|
||||
@@ -35,15 +47,27 @@ When the macro is not defined, the library will define it to its default value.
|
||||
|
||||
## Notes
|
||||
|
||||
!!! hint "CMake option"
|
||||
!!! note "CMake option"
|
||||
|
||||
Diagnostic messages can also be controlled with the CMake option
|
||||
Diagnostic positions can also be controlled with the CMake option
|
||||
[`JSON_Diagnostic_Positions`](../../integration/cmake.md#json_diagnostic_positions) (`OFF` by default)
|
||||
which defines `JSON_DIAGNOSTIC_POSITIONS` accordingly.
|
||||
|
||||
!!! note "Availability"
|
||||
|
||||
Diagnostic positions are only available if the value was created by the [`parse`](../basic_json/parse.md) function.
|
||||
The [`sax_parse`](../basic_json/sax_parse.md) function or all other means to create a JSON value **do not** set the
|
||||
diagnostic positions and [`start_pos()`](../basic_json/start_pos.md) and [`end_pos()`](../basic_json/end_pos.md)
|
||||
will only return `std::string::npos` for these values.
|
||||
|
||||
!!! warning "Invalidation"
|
||||
|
||||
The returned positions are only valid as long as the JSON value is not changed. The positions are *not* updated
|
||||
when the JSON value is changed.
|
||||
|
||||
## Examples
|
||||
|
||||
??? example "Example 1: retrieving positions"
|
||||
??? example "Example: retrieving positions"
|
||||
|
||||
```cpp
|
||||
--8<-- "examples/diagnostic_positions.cpp"
|
||||
@@ -59,3 +83,4 @@ When the macro is not defined, the library will define it to its default value.
|
||||
|
||||
## Version history
|
||||
|
||||
- Added in version 3.12.0.
|
||||
@@ -3,13 +3,19 @@
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT, NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE</h1>
|
||||
|
||||
```cpp
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(type, base_type, member...) // (1)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(type, base_type, member...) // (2)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(type, base_type, member...) // (3)
|
||||
// (1)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(type, base_type, member...)
|
||||
// (2)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT(type, base_type, member...)
|
||||
// (3)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE(type, base_type, member...)
|
||||
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(type, base_type, member...) // (4)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(type, base_type, member...) // (5)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(type, base_type, member...) // (6)
|
||||
// (4)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE(type, base_type, member...)
|
||||
// (5)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT(type, base_type, member...)
|
||||
// (6)
|
||||
#define NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE(type, base_type, member...)
|
||||
```
|
||||
|
||||
These macros can be used to simplify the serialization/deserialization of derived types if you want to use a JSON
|
||||
@@ -25,12 +31,23 @@ The first parameter is the name of the derived class/struct,
|
||||
the second parameter is the name of the base class/struct and all remaining parameters name the members.
|
||||
The base type **must** be already serializable/deserializable.
|
||||
|
||||
- Macros 1 and 3 will use [`at`](../basic_json/at.md) during deserialization and will throw
|
||||
- Macros 1 and 4 will use [`at`](../basic_json/at.md) during deserialization and will throw
|
||||
[`out_of_range.403`](../../home/exceptions.md#jsonexceptionout_of_range403) if a key is missing in the JSON object.
|
||||
- Macros 2 and 4 will use [`value`](../basic_json/value.md) during deserialization and fall back to the default value for the
|
||||
- Macros 2 and 5 will use [`value`](../basic_json/value.md) during deserialization and fall back to the default value for the
|
||||
respective type of the member variable if a key in the JSON object is missing. The generated `from_json()` function
|
||||
default constructs an object and uses its values as the defaults when calling the `value` function.
|
||||
|
||||
Summary:
|
||||
|
||||
| Need access to private members | Need only de-serialization | Allow missing values when de-serializing | macro |
|
||||
|------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|---------------------------------------------------------------|
|
||||
| <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | **NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE** |
|
||||
| <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | **NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT** |
|
||||
| <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: grey;">:octicons-skip-fill-24:</div> | **NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE** |
|
||||
| <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | **NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE** |
|
||||
| <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | **NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT** |
|
||||
| <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: grey;">:octicons-skip-fill-24:</div> | **NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE** |
|
||||
|
||||
## Parameters
|
||||
|
||||
`type` (in)
|
||||
@@ -64,7 +81,7 @@ Macros 3 and 6 add one function to the namespace which take care of the serializ
|
||||
void to_json(nlohmann::json&, const type&);
|
||||
```
|
||||
|
||||
In first two cases cases they call the `to_json`/`from_json` functions of the base type
|
||||
In first two cases, they call the `to_json`/`from_json` functions of the base type
|
||||
before serializing/deserializing the members of the derived type:
|
||||
|
||||
```cpp
|
||||
@@ -82,7 +99,7 @@ void from_json(const nlohmann::json& j, B& b) {
|
||||
}
|
||||
```
|
||||
|
||||
In the third case only `to_json` will be called:
|
||||
In the third case, only `to_json` will be called:
|
||||
|
||||
```cpp
|
||||
class A { /* ... */ };
|
||||
@@ -98,40 +115,55 @@ void to_json(nlohmann::json& j, const B& b) {
|
||||
|
||||
!!! info "Prerequisites"
|
||||
|
||||
- Macros 1, 2 and 3 have the same prerequisites of NLOHMANN_DEFINE_TYPE_INTRUSIVE.
|
||||
- Macros 4, 5 and 6 have the same prerequisites of NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE.
|
||||
- Macros 1, 2, and 3 have the same prerequisites of [NLOHMANN_DEFINE_TYPE_INTRUSIVE](nlohmann_define_type_intrusive.md).
|
||||
- Macros 4, 5, and 6 have the same prerequisites of [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE](nlohmann_define_type_non_intrusive.md).
|
||||
- Serialization/deserialization of base types must be defined.
|
||||
|
||||
!!! warning "Implementation limits"
|
||||
|
||||
- See Implementation limits for NLOHMANN_DEFINE_TYPE_INTRUSIVE and NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE.
|
||||
See Implementation limits for [NLOHMANN_DEFINE_TYPE_INTRUSIVE](nlohmann_define_type_intrusive.md) and
|
||||
[NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE](nlohmann_define_type_non_intrusive.md), respectively.
|
||||
|
||||
## Examples
|
||||
|
||||
Example of `NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE` usage:
|
||||
??? example "NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE"
|
||||
|
||||
```cpp
|
||||
class A {
|
||||
double Aa;
|
||||
double Ab;
|
||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE(A, Aa, Ab)
|
||||
};
|
||||
Consider the following complete example:
|
||||
|
||||
class B : public A {
|
||||
int Ba;
|
||||
int Bb;
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE(B, A, Ba, Bb)
|
||||
};
|
||||
```
|
||||
```cpp hl_lines="28"
|
||||
--8<-- "examples/nlohmann_define_derived_type_intrusive_macro.cpp"
|
||||
```
|
||||
|
||||
Output:
|
||||
|
||||
```json
|
||||
--8<-- "examples/nlohmann_define_derived_type_intrusive_macro.output"
|
||||
```
|
||||
|
||||
Notes:
|
||||
|
||||
- `A` and `B` are default-constructible. This is a requirement for using the macro.
|
||||
- `A` has private members and is not a derived class. Hence, macro `NLOHMANN_DEFINE_TYPE_INTRUSIVE` is used.
|
||||
- As `B` is a derived class, `NLOHMANN_DEFINE_TYPE_INTRUSIVE` is not applicable, but
|
||||
`NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE` must be used.
|
||||
- The macro `NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE` is used _inside_ the class use as
|
||||
`NLOHMANN_DEFINE_TYPE_INTRUSIVE`.
|
||||
|
||||
## See also
|
||||
|
||||
- [NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT](nlohmann_define_type_intrusive.md)
|
||||
- [NLOHMANN_DEFINE_TYPE_INTRUSIVE / NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT /
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE](nlohmann_define_type_intrusive.md)
|
||||
for similar macros that can be defined _inside_ a non-derived type.
|
||||
- [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE / NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT](nlohmann_define_type_non_intrusive.md)
|
||||
- [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE / NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT /
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE](nlohmann_define_type_non_intrusive.md)
|
||||
for similar macros that can be defined _outside_ a non-derived type.
|
||||
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) for an overview.
|
||||
|
||||
## Version history
|
||||
|
||||
1. Added in version 3.11.x.
|
||||
2. Added in version 3.11.x.
|
||||
3. Added in version 3.11.x.
|
||||
4. Added in version 3.11.x.
|
||||
5. Added in version 3.11.x.
|
||||
6. Added in version 3.11.x.
|
||||
@@ -19,6 +19,14 @@ parameter is the name of the class/struct, and all remaining parameters name the
|
||||
default constructs an object and uses its values as the defaults when calling the `value` function.
|
||||
3. Only defines the serialization. Useful in cases when the type does not have a default constructor and only serialization in required.
|
||||
|
||||
Summary:
|
||||
|
||||
| Need access to private members | Need only de-serialization | Allow missing values when de-serializing | macro |
|
||||
|------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|-------------------------------------------------------|
|
||||
| <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | **NLOHMANN_DEFINE_TYPE_INTRUSIVE** |
|
||||
| <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | **NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT** |
|
||||
| <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: grey;">:octicons-skip-fill-24:</div> | **NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE** |
|
||||
|
||||
## Parameters
|
||||
|
||||
`type` (in)
|
||||
@@ -145,12 +153,18 @@ See examples below for the concrete generated code.
|
||||
|
||||
## See also
|
||||
|
||||
- [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE{_WITH_DEFAULT, _ONLY_SERIALIZE}](nlohmann_define_type_non_intrusive.md)
|
||||
- [NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE, NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT,
|
||||
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE](nlohmann_define_type_non_intrusive.md)
|
||||
for a similar macro that can be defined _outside_ the type.
|
||||
- [NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE, NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT,
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE, NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE,
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT,
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE](nlohmann_define_derived_type.md) for similar macros for
|
||||
derived types
|
||||
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) for an overview.
|
||||
|
||||
## Version history
|
||||
|
||||
1. Added in version 3.9.0.
|
||||
2. Added in version 3.11.0.
|
||||
3. Added in version TODO.
|
||||
3. Added in version 3.11.3.
|
||||
@@ -19,6 +19,14 @@ parameter is the name of the class/struct, and all remaining parameters name the
|
||||
default constructs an object and uses its values as the defaults when calling the `value` function.
|
||||
3. Only defines the serialization. Useful in cases when the type does not have a default constructor and only serialization in required.
|
||||
|
||||
Summary:
|
||||
|
||||
| Need access to private members | Need only de-serialization | Allow missing values when de-serializing | macro |
|
||||
|------------------------------------------------------------------|------------------------------------------------------------------|------------------------------------------------------------------|-------------------------------------------------------|
|
||||
| <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | **NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE** |
|
||||
| <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | **NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT** |
|
||||
| <div style="color: red;">:octicons-x-circle-fill-24:</div> | <div style="color: green;">:octicons-check-circle-fill-24:</div> | <div style="color: grey;">:octicons-skip-fill-24:</div> | **NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE** |
|
||||
|
||||
## Parameters
|
||||
|
||||
`type` (in)
|
||||
@@ -146,12 +154,18 @@ See examples below for the concrete generated code.
|
||||
|
||||
## See also
|
||||
|
||||
- [NLOHMANN_DEFINE_TYPE_INTRUSIVE{_WITH_DEFAULT, _ONLY_SERIALIZE}](nlohmann_define_type_intrusive.md)
|
||||
- [NLOHMANN_DEFINE_TYPE_INTRUSIVE, NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT,
|
||||
NLOHMANN_DEFINE_TYPE_INTRUSIVE_ONLY_SERIALIZE](nlohmann_define_type_intrusive.md)
|
||||
for a similar macro that can be defined _inside_ the type.
|
||||
- [NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE, NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_WITH_DEFAULT,
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_INTRUSIVE_ONLY_SERIALIZE, NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE,
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_WITH_DEFAULT,
|
||||
NLOHMANN_DEFINE_DERIVED_TYPE_NON_INTRUSIVE_ONLY_SERIALIZE](nlohmann_define_derived_type.md) for similar macros for
|
||||
derived types
|
||||
- [Arbitrary Type Conversions](../../features/arbitrary_types.md) for an overview.
|
||||
|
||||
## Version history
|
||||
|
||||
1. Added in version 3.9.0.
|
||||
2. Added in version 3.11.0.
|
||||
3. Added in version TODO.
|
||||
3. Added in version 3.11.3.
|
||||
@@ -0,0 +1 @@
|
||||
--8<-- "../../../.github/CODE_OF_CONDUCT.md"
|
||||
@@ -0,0 +1 @@
|
||||
--8<-- "../../../.github/CONTRIBUTING.md"
|
||||
@@ -0,0 +1,122 @@
|
||||
# Governance
|
||||
|
||||
The governance model for the JSON for Modern C++ project is a **Benevolent Dictator for Life (BDFL)** structure. As the
|
||||
sole maintainer, [Niels Lohmann](https://github.com/nlohmann) is responsible for all key aspects of the project. The
|
||||
project governance may evolve as the project grows, but any changes will be documented here and communicated to
|
||||
contributors.
|
||||
|
||||
## Overview
|
||||
|
||||
This project is led by a benevolent dictator, [Niels Lohmann](https://github.com/nlohmann), and managed by the
|
||||
community. That is, the community actively contributes to the day-to-day maintenance of the project, but the general
|
||||
strategic line is drawn by the benevolent dictator. In case of disagreement, they have the last word. It is the
|
||||
benevolent dictator’s job to resolve disputes within the community and to ensure that the project is able to progress in
|
||||
a coordinated way. In turn, it is the community’s job to guide the decisions of the benevolent dictator through active
|
||||
engagement and contribution.
|
||||
|
||||
## Roles and responsibilities
|
||||
|
||||
### Benevolent dictator (project lead)
|
||||
|
||||
Typically, the benevolent dictator, or project lead, is self-appointed. However, because the community always has the
|
||||
ability to fork, this person is fully answerable to the community. The project lead’s role is a difficult one: they set
|
||||
the strategic objectives of the project and communicate these clearly to the community. They also have to understand the
|
||||
community as a whole and strive to satisfy as many conflicting needs as possible, while ensuring that the project
|
||||
survives in the long term.
|
||||
|
||||
In many ways, the role of the benevolent dictator is less about dictatorship and more about diplomacy. The key is to
|
||||
ensure that, as the project expands, the right people are given influence over it and the community rallies behind the
|
||||
vision of the project lead. The lead’s job is then to ensure that the committers (see below) make the right decisions on
|
||||
behalf of the project. Generally speaking, as long as the committers are aligned with the project’s strategy, the
|
||||
project lead will allow them to proceed as they desire.
|
||||
|
||||
### Committers
|
||||
|
||||
Committers are contributors who have made several valuable contributions to the project and are now relied upon to both
|
||||
write code directly to the repository and screen the contributions of others. In many cases they are programmers but it
|
||||
is also possible that they contribute in a different role. Typically, a committer will focus on a specific aspect of the
|
||||
project, and will bring a level of expertise and understanding that earns them the respect of the community and the
|
||||
project lead. The role of committer is not an official one, it is simply a position that influential members of the
|
||||
community will find themselves in as the project lead looks to them for guidance and support.
|
||||
|
||||
Committers have no authority over the overall direction of the project. However, they do have the ear of the project
|
||||
lead. It is a committer’s job to ensure that the lead is aware of the community’s needs and collective objectives, and
|
||||
to help develop or elicit appropriate contributions to the project. Often, committers are given informal control over
|
||||
their specific areas of responsibility, and are assigned rights to directly modify certain areas of the source code.
|
||||
That is, although committers do not have explicit decision-making authority, they will often find that their actions are
|
||||
synonymous with the decisions made by the lead.
|
||||
|
||||
### Contributors
|
||||
|
||||
Contributors are community members who either have no desire to become committers, or have not yet been given the
|
||||
opportunity by the benevolent dictator. They make valuable contributions, such as those outlined in the list below, but
|
||||
generally do not have the authority to make direct changes to the project code. Contributors engage with the project
|
||||
through communication tools, such as email lists, and via reports and patches attached to issues in the issue tracker,
|
||||
as detailed in our community tools document.
|
||||
|
||||
Anyone can become a contributor. There is no expectation of commitment to the project, no specific skill requirements
|
||||
and no selection process. To become a contributor, a community member simply has to perform one or more actions that are
|
||||
beneficial to the project.
|
||||
|
||||
Some contributors will already be engaging with the project as users, but will also find themselves doing one or more of
|
||||
the following:
|
||||
|
||||
- supporting new users (current users often provide the most effective new user support)
|
||||
- reporting bugs
|
||||
- identifying requirements
|
||||
- supplying graphics and web design
|
||||
- programming
|
||||
- assisting with project infrastructure
|
||||
- writing documentation
|
||||
- fixing bugs
|
||||
- adding features
|
||||
|
||||
As contributors gain experience and familiarity with the project, they may find that the project lead starts relying on
|
||||
them more and more. When this begins to happen, they gradually adopt the role of committer, as described above.
|
||||
|
||||
### Users
|
||||
|
||||
Users are community members who have a need for the project. They are the most important members of the community:
|
||||
without them, the project would have no purpose. Anyone can be a user; there are no specific requirements.
|
||||
|
||||
Users should be encouraged to participate in the life of the project and the community as much as possible. User
|
||||
contributions enable the project team to ensure that they are satisfying the needs of those users. Common user
|
||||
activities include (but are not limited to):
|
||||
|
||||
- evangelising about the project
|
||||
- informing developers of project strengths and weaknesses from a new user’s perspective
|
||||
- providing moral support (a ‘thank you’ goes a long way)
|
||||
- providing financial support
|
||||
|
||||
Users who continue to engage with the project and its community will often find themselves becoming more and more
|
||||
involved. Such users may then go on to become contributors, as described above.
|
||||
|
||||
## Support
|
||||
|
||||
All participants in the community are encouraged to provide support for new users within the project management
|
||||
infrastructure. This support is provided as a way of growing the community. Those seeking support should recognise that
|
||||
all support activity within the project is voluntary and is therefore provided as and when time allows. A user requiring
|
||||
guaranteed response times or results should therefore seek to purchase a support contract from a vendor. (Of course,
|
||||
that vendor should be an active member of the community.) However, for those willing to engage with the project on its
|
||||
own terms, and willing to help support other users, the community support channels are ideal.
|
||||
|
||||
## Contribution Process
|
||||
|
||||
Anyone can contribute to the project, regardless of their skills, as there are many ways to contribute. For instance, a
|
||||
contributor might be active on the project mailing list and issue tracker, or might supply patches. The various ways of
|
||||
contributing are described in more detail in our roles in open source document.
|
||||
|
||||
The developer mailing list is the most appropriate place for a contributor to ask for help when making their first
|
||||
contribution.
|
||||
|
||||
## Decision-Making Process
|
||||
|
||||
The benevolent dictatorship model does not need a formal conflict resolution process, since the project lead’s word is
|
||||
final. If the community chooses to question the wisdom of the actions of a committer, the project lead can review their
|
||||
decisions by checking the email archives, and either uphold or reverse them.
|
||||
|
||||
---
|
||||
|
||||
!!! quote "Source"
|
||||
|
||||
The text was taken from http://oss-watch.ac.uk/resources/benevolentdictatorgovernancemodel.
|
||||
@@ -0,0 +1,7 @@
|
||||
# Community
|
||||
|
||||
- [Code of Conduct](code_of_conduct.md) - the rules and norms of this project
|
||||
- [Contribution Guidelines](contribution_guidelines.md) - guidelines how to contribute to this project
|
||||
- [Governance](governance.md) - the governance model of this project
|
||||
- [Quality Assurance](quality_assurance.md) - how quality of this project is assured
|
||||
- [Security Policy](security_policy.md) - the security policy of the project
|
||||
@@ -0,0 +1,210 @@
|
||||
# Quality assurance
|
||||
|
||||
Ensuring quality is paramount for this project, particularly because [numerous other projects](../home/customers.md)
|
||||
depend on it. Each commit to the library undergoes rigorous checks against the following requirements, and any
|
||||
violations will result in a failed build.
|
||||
|
||||
## C++ language compliance and compiler compatibility
|
||||
|
||||
!!! success "Requirement: Compiler support"
|
||||
|
||||
Any compiler with complete C++11 support can compile the library without warnings.
|
||||
|
||||
- [x] The library is compiled library with 50+ different C++ compilers with different operating systems and platforms,
|
||||
including the oldest versions known to compile the library.
|
||||
|
||||
??? abstract "Compilers used in continuous integration"
|
||||
|
||||
| Compiler | Architecture | Operating System | CI |
|
||||
|----------------------------------------------|--------------|--------------------------|-----------|
|
||||
| AppleClang 14.0.0.14000029; Xcode 14.1 | x86_64 | macOS 13.7.2 (Ventura) | GitHub |
|
||||
| AppleClang 14.0.0.14000029; Xcode 14.2 | x86_64 | macOS 13.7.2 (Ventura) | GitHub |
|
||||
| AppleClang 14.0.3.14030022; Xcode 14.3.1 | x86_64 | macOS 13.7.2 (Ventura) | GitHub |
|
||||
| AppleClang 15.0.0.15000040; Xcode 15.0.1 | x86_64 | macOS 13.7.2 (Ventura) | GitHub |
|
||||
| AppleClang 15.0.0.15000100; Xcode 15.1 | x86_64 | macOS 13.7.2 (Ventura) | GitHub |
|
||||
| AppleClang 15.0.0.15000100; Xcode 15.2 | x86_64 | macOS 13.7.2 (Ventura) | GitHub |
|
||||
| AppleClang 15.0.0.15000309; Xcode 15.3 | arm64 | macOS 14.7.2 (Sonoma) | GitHub |
|
||||
| AppleClang 15.0.0.15000309; Xcode 15.4 | arm64 | macOS 14.7.2 (Sonoma) | GitHub |
|
||||
| AppleClang 16.0.0.16000026; Xcode 16 | arm64 | macOS 15.2 (Sequoia) | GitHub |
|
||||
| AppleClang 16.0.0.16000026; Xcode 16.1 | arm64 | macOS 15.2 (Sequoia) | GitHub |
|
||||
| AppleClang 16.0.0.16000026; Xcode 16.2 | arm64 | macOS 15.2 (Sequoia) | GitHub |
|
||||
| Clang 3.5.2 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 3.6.2 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 3.7.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 3.8.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 3.9.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 4.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 5.0.2 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 6.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 7.1.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 8.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 9.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 10.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 11.0.0 with GNU-like command-line | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| Clang 11.1.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 12.0.0 with GNU-like command-line | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| Clang 12.0.0 with MSVC-like command-line | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| Clang 12.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 13.0.0 with GNU-like command-line | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| Clang 13.0.1 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 14.0.0 with GNU-like command-line | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| Clang 14.0.6 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 15.0.0 with GNU-like command-line | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| Clang 15.0.7 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 16.0.6 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 17.0.6 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 18.1.8 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 19.1.6 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| Clang 20.0.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 4.8.5 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 4.9.3 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 5.5.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 6.4.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 7.5.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 8.5.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 9.3.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 9.4.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 9.5.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 10.5.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 11.4.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 11.5.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 12.2.0 (MinGW-W64 i686-ucrt-posix-dwarf) | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| GNU 12.2.0 (MinGW-W64 x86_64-ucrt-posix-seh) | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| GNU 12.4.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 13.3.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 14.2.0 | x86_64 | Ubuntu 22.04.1 LTS | GitHub |
|
||||
| GNU 14.2.0 | arm64 | Linux 6.1.100 | Cirrus CI |
|
||||
| MSVC 19.0.24241.7 | x86 | Windows 8.1 | AppVeyor |
|
||||
| MSVC 19.16.27035.0 | x86 | Windows-10 (Build 14393) | AppVeyor |
|
||||
| MSVC 19.29.30157.0 | x86 | Windows 10 (Build 17763) | GitHub |
|
||||
| MSVC 19.29.30157.0 | x86_64 | Windows 10 (Build 17763) | GitHub |
|
||||
| MSVC 19.29.30157.0 | x86 | Windows-10 (Build 17763) | AppVeyor |
|
||||
| MSVC 19.42.34435.0 | x86 | Windows 10 (Build 20348) | GitHub |
|
||||
| MSVC 19.42.34435.0 | x86_64 | Windows 10 (Build 20348) | GitHub |
|
||||
|
||||
- [x] The library is compiled with all C++ language revisions (C++11, C++14, C++17, C++20, C++23, and C++26) to detect
|
||||
and fix language deprecations early.
|
||||
- [x] The library is checked for compiler warnings:
|
||||
- On Clang, `-Weverything` is used with 7 exceptions.
|
||||
|
||||
??? abstract "Clang warnings"
|
||||
|
||||
```cmake
|
||||
--8<-- "../../../cmake/clang_flags.cmake"
|
||||
```
|
||||
|
||||
- On GCC, 300+ warnings are enabled with 8 exceptions.
|
||||
|
||||
??? abstract "GCC warnings"
|
||||
|
||||
```cmake
|
||||
--8<-- "../../../cmake/gcc_flags.cmake"
|
||||
```
|
||||
|
||||
## C++ standard library compliance
|
||||
|
||||
!!! success "Requirement: No prerequisites"
|
||||
|
||||
The library has no prerequisites other than the Standard Template Library (STL).
|
||||
|
||||
- [x] The library compiled and tested with both [libc++](https://libcxx.llvm.org) and
|
||||
[libstdc++](https://gcc.gnu.org/onlinedocs/libstdc++/) to detect subtle differences or incompatibilities.
|
||||
- [x] The code checked with [Include What You Use (IWYU)](https://include-what-you-use.org) that all required standard
|
||||
headers are included.
|
||||
- [x] On Windows, the library is compiled with `<Windows.h>` being included to detect and avoid common bugs.
|
||||
- [x] The library is compiled with exceptions disabled to support alternative means of error handling.
|
||||
|
||||
## Stable public API
|
||||
|
||||
!!! success "Requirement: Stable public API"
|
||||
|
||||
Any change to the library does not break the public API.
|
||||
|
||||
- [x] All public API functions are tested with a variety of arguments.
|
||||
- [x] The library is compiled and tested with different template arguments for number, string, array, and object types.
|
||||
- [x] All lines of the code base are covered by unit tests.
|
||||
- [x] Every exception of the library is thrown in the test suite and the error messages and exception ids are checked.
|
||||
|
||||
!!! success "Requirement: Complete documentation"
|
||||
|
||||
The public API is extensively documented.
|
||||
|
||||
- [x] Every public API function has a dedicated page in the
|
||||
[API reference documentation](https://json.nlohmann.me/api/basic_json/) with a self-contained code example.
|
||||
- [x] All examples in the documentation are tested and changes in their output is treated as an error.
|
||||
|
||||
## Robust input processing
|
||||
|
||||
!!! success "Requirement: Standards compliance"
|
||||
|
||||
The library is compliant to JSON as defined in [RFC 8259](https://datatracker.ietf.org/doc/html/rfc8259).
|
||||
|
||||
- [x] The lexer is tested with all valid Unicode code points and all prefixes of all invalid Unicode code points.
|
||||
- [x] The parser is tested against extensive correctness suites for JSON compliance.
|
||||
- [x] In addition, the library is continuously fuzz-tested at [OSS-Fuzz](https://google.github.io/oss-fuzz/) where the
|
||||
library is checked against billions of inputs.
|
||||
|
||||
## Static analysis
|
||||
|
||||
!!! success "Requirement: State-of-the-art code analysis"
|
||||
|
||||
The code is checked with state-of-the-art static code analysis tools.
|
||||
|
||||
- [x] The code is checked with the latest [Clang-Tidy](https://clang.llvm.org/extra/clang-tidy/).
|
||||
|
||||
??? abstract "Clang-Tidy configuration (.clang-tidy)"
|
||||
|
||||
```ini
|
||||
--8<-- "../../../.clang-tidy"
|
||||
```
|
||||
|
||||
- [x] The code is checked with the latest [Cppcheck](https://cppcheck.sourceforge.io) with all warnings enabled.
|
||||
- [x] The code is checked with the latest [Clang Static Analyzer](https://clang-analyzer.llvm.org) with 89 enabled
|
||||
rules.
|
||||
- [x] The code is checked with [Infer](https://fbinfer.com).
|
||||
- [x] The code is checked with [Codacy](https://app.codacy.com/gh/nlohmann/json/dashboard).
|
||||
|
||||
## Dynamic analysis
|
||||
|
||||
!!! success "Requirement: Correctness"
|
||||
|
||||
The library is checked for memory correctness and absence of undefined behavior.
|
||||
|
||||
- [x] The test suite is executed with enabled [runtime assertions](https://json.nlohmann.me/features/assertions/) to
|
||||
check invariants and preconditions of functions to detect undefined behavior.
|
||||
- [x] The test suite is executed with [Valgrind](https://valgrind.org) (Memcheck) to detect memory leaks.
|
||||
- [x] The test suite is executed with [Sanitizers](https://github.com/google/sanitizers) (address sanitizer, undefined
|
||||
behavior sanitizer, integer overflow detection, nullability violations).
|
||||
|
||||
## Style check
|
||||
|
||||
!!! success "Requirement: Common code style"
|
||||
|
||||
A common code style is used throughout all code files of the library.
|
||||
|
||||
- [x] The code is formatted with [Artistic Style](https://astyle.sourceforge.net) (astyle) against a style configuration
|
||||
that is also enforced in the CI.
|
||||
|
||||
??? abstract "Astyle configuration (tools/astyle/.astylerc)"
|
||||
|
||||
```ini
|
||||
--8<-- "../../../tools/astyle/.astylerc"
|
||||
```
|
||||
|
||||
- [x] The code style is checked with [cpplint](https://github.com/cpplint/cpplint) with 61 enabled rules.
|
||||
|
||||
## Simple integration
|
||||
|
||||
!!! success "Requirement: Single header"
|
||||
|
||||
The library can be used by adding a single header to a C++ project.
|
||||
|
||||
- [x] An amalgamation script is used to check if the source code is exposed as self-contained single-header file.
|
||||
- [x] The test suite is checked against the amalgamated source file as well as the individual source file.
|
||||
|
||||
!!! success "Requirement: CMake as primary development tool"
|
||||
|
||||
All library functions are exposed and usable by CMake.
|
||||
|
||||
- [x] All library options are exposed as [CMake options](https://json.nlohmann.me/integration/cmake/) and tested.
|
||||
- [x] The library is tested against the earliest supported CMake version.
|
||||
@@ -0,0 +1 @@
|
||||
--8<-- "../../../.github/SECURITY.md"
|
||||
@@ -1,4 +1,4 @@
|
||||
/* disable ligatures in code and preformatted blocks */
|
||||
code, pre {
|
||||
font-variant-ligatures: none;
|
||||
/* enable ligatures in code and preformatted blocks */
|
||||
.md-typeset code, .md-typeset pre {
|
||||
font-variant-ligatures: common-ligatures;
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Loaded 100 of 519 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user