Full Code of bblanchon/ArduinoJson for AI

7.x d4e745ab5490 cached
517 files
1.6 MB
442.7k tokens
2431 symbols
1 requests
Download .txt
Showing preview only (1,819K chars total). Download the full file or copy to clipboard to get everything.
Repository: bblanchon/ArduinoJson
Branch: 7.x
Commit: d4e745ab5490
Files: 517
Total size: 1.6 MB

Directory structure:
gitextract_077kgy9b/

├── .clang-format
├── .devcontainer/
│   ├── clang10/
│   │   └── devcontainer.json
│   ├── clang11/
│   │   └── devcontainer.json
│   ├── clang13/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang14/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang15/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang16/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang17/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang5/
│   │   └── devcontainer.json
│   ├── clang6/
│   │   └── devcontainer.json
│   ├── clang7/
│   │   └── devcontainer.json
│   ├── clang8/
│   │   └── devcontainer.json
│   ├── clang9/
│   │   └── devcontainer.json
│   ├── gcc10/
│   │   └── devcontainer.json
│   ├── gcc11/
│   │   └── devcontainer.json
│   ├── gcc12/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── gcc48/
│   │   └── devcontainer.json
│   ├── gcc5/
│   │   └── devcontainer.json
│   ├── gcc6/
│   │   └── devcontainer.json
│   ├── gcc7/
│   │   └── devcontainer.json
│   ├── gcc8/
│   │   └── devcontainer.json
│   └── gcc9/
│       └── devcontainer.json
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   ├── feature_request.md
│   │   └── help.md
│   └── workflows/
│       ├── ci.yml
│       ├── lock.yml
│       └── release.yml
├── .gitignore
├── .mbedignore
├── .prettierignore
├── .vscode/
│   └── settings.json
├── ArduinoJson.h
├── CHANGELOG.md
├── CMakeLists.txt
├── CONTRIBUTING.md
├── LICENSE.txt
├── README.md
├── SUPPORT.md
├── appveyor.yml
├── component.mk
├── examples/
│   ├── JsonConfigFile/
│   │   └── JsonConfigFile.ino
│   ├── JsonFilterExample/
│   │   └── JsonFilterExample.ino
│   ├── JsonGeneratorExample/
│   │   └── JsonGeneratorExample.ino
│   ├── JsonHttpClient/
│   │   └── JsonHttpClient.ino
│   ├── JsonParserExample/
│   │   └── JsonParserExample.ino
│   ├── JsonServer/
│   │   └── JsonServer.ino
│   ├── JsonUdpBeacon/
│   │   └── JsonUdpBeacon.ino
│   ├── MsgPackParser/
│   │   └── MsgPackParser.ino
│   ├── ProgmemExample/
│   │   └── ProgmemExample.ino
│   └── StringExample/
│       └── StringExample.ino
├── extras/
│   ├── ArduinoJsonConfig.cmake.in
│   ├── CompileOptions.cmake
│   ├── ci/
│   │   ├── espidf/
│   │   │   ├── CMakeLists.txt
│   │   │   └── main/
│   │   │       ├── CMakeLists.txt
│   │   │       ├── component.mk
│   │   │       └── main.cpp
│   │   └── particle.sh
│   ├── conf_test/
│   │   ├── avr.cpp
│   │   ├── esp8266.cpp
│   │   ├── x64.cpp
│   │   └── x86.cpp
│   ├── fuzzing/
│   │   ├── CMakeLists.txt
│   │   ├── Makefile
│   │   ├── json_corpus/
│   │   │   └── .gitignore
│   │   ├── json_fuzzer.cpp
│   │   ├── json_seed_corpus/
│   │   │   ├── Comments.json
│   │   │   ├── EmptyArray.json
│   │   │   ├── EmptyObject.json
│   │   │   ├── ExcessiveNesting.json
│   │   │   ├── IntegerOverflow.json
│   │   │   ├── Numbers.json
│   │   │   ├── OpenWeatherMap.json
│   │   │   ├── Strings.json
│   │   │   └── WeatherUnderground.json
│   │   ├── msgpack_corpus/
│   │   │   └── .gitignore
│   │   ├── msgpack_fuzzer.cpp
│   │   ├── msgpack_seed_corpus/
│   │   │   ├── array16
│   │   │   ├── array32
│   │   │   ├── false
│   │   │   ├── fixarray
│   │   │   ├── fixint_negative
│   │   │   ├── fixint_positive
│   │   │   ├── fixmap
│   │   │   ├── fixstr
│   │   │   ├── float32
│   │   │   ├── float64
│   │   │   ├── int16
│   │   │   ├── int32
│   │   │   ├── int64
│   │   │   ├── int8
│   │   │   ├── map16
│   │   │   ├── map32
│   │   │   ├── nil
│   │   │   ├── str16
│   │   │   ├── str32
│   │   │   ├── str8
│   │   │   ├── true
│   │   │   ├── uint16
│   │   │   ├── uint32
│   │   │   ├── uint64
│   │   │   └── uint8
│   │   ├── number_corpus/
│   │   │   └── .gitignore
│   │   ├── number_fuzzer.cpp
│   │   ├── number_seed_corpus/
│   │   │   ├── decimal_half
│   │   │   ├── decimal_one_and_half
│   │   │   ├── infinity
│   │   │   ├── issue2220-1
│   │   │   ├── issue2220-2
│   │   │   ├── large_decimal
│   │   │   ├── large_integer
│   │   │   ├── leading_zeros
│   │   │   ├── nan
│   │   │   ├── negative_decimal
│   │   │   ├── negative_one
│   │   │   ├── negative_scientific
│   │   │   ├── negative_scientific_large_exp
│   │   │   ├── negative_zero
│   │   │   ├── one
│   │   │   ├── pi_approximation
│   │   │   ├── scientific_e10
│   │   │   ├── scientific_e_minus
│   │   │   ├── scientific_e_plus
│   │   │   ├── small_decimal
│   │   │   ├── small_integer
│   │   │   ├── trailing_zeros
│   │   │   ├── very_small_positive
│   │   │   └── zero
│   │   └── reproducer.cpp
│   ├── particle/
│   │   ├── project.properties
│   │   └── src/
│   │       └── smocktest.ino
│   ├── scripts/
│   │   ├── build-single-header.sh
│   │   ├── extract_changes.awk
│   │   ├── get-release-page.sh
│   │   ├── publish-particle-library.sh
│   │   ├── publish.sh
│   │   └── wandbox/
│   │       ├── JsonGeneratorExample.cpp
│   │       ├── JsonParserExample.cpp
│   │       ├── MsgPackParserExample.cpp
│   │       └── publish.sh
│   └── tests/
│       ├── .clang-tidy
│       ├── CMakeLists.txt
│       ├── Cpp17/
│       │   ├── CMakeLists.txt
│       │   └── string_view.cpp
│       ├── Cpp20/
│       │   ├── CMakeLists.txt
│       │   └── smoke_test.cpp
│       ├── Deprecated/
│       │   ├── BasicJsonDocument.cpp
│       │   ├── CMakeLists.txt
│       │   ├── DynamicJsonDocument.cpp
│       │   ├── StaticJsonDocument.cpp
│       │   ├── add.cpp
│       │   ├── containsKey.cpp
│       │   ├── createNestedArray.cpp
│       │   ├── createNestedObject.cpp
│       │   ├── macros.cpp
│       │   ├── memoryUsage.cpp
│       │   └── shallowCopy.cpp
│       ├── FailingBuilds/
│       │   ├── CMakeLists.txt
│       │   ├── Issue978.cpp
│       │   ├── assign_char.cpp
│       │   ├── deserialize_object.cpp
│       │   ├── read_long_long.cpp
│       │   ├── variant_as_char.cpp
│       │   └── write_long_long.cpp
│       ├── Helpers/
│       │   ├── Allocators.hpp
│       │   ├── Arduino.h
│       │   ├── CustomReader.hpp
│       │   ├── Literals.hpp
│       │   ├── api/
│       │   │   ├── Print.h
│       │   │   ├── Stream.h
│       │   │   └── String.h
│       │   └── avr/
│       │       └── pgmspace.h
│       ├── IntegrationTests/
│       │   ├── CMakeLists.txt
│       │   ├── gbathree.cpp
│       │   ├── issue772.cpp
│       │   ├── openweathermap.cpp
│       │   └── round_trip.cpp
│       ├── JsonArray/
│       │   ├── CMakeLists.txt
│       │   ├── add.cpp
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── copyArray.cpp
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── remove.cpp
│       │   ├── size.cpp
│       │   ├── subscript.cpp
│       │   └── unbound.cpp
│       ├── JsonArrayConst/
│       │   ├── CMakeLists.txt
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── size.cpp
│       │   └── subscript.cpp
│       ├── JsonDeserializer/
│       │   ├── CMakeLists.txt
│       │   ├── DeserializationError.cpp
│       │   ├── array.cpp
│       │   ├── destination_types.cpp
│       │   ├── errors.cpp
│       │   ├── filter.cpp
│       │   ├── input_types.cpp
│       │   ├── misc.cpp
│       │   ├── nestingLimit.cpp
│       │   ├── number.cpp
│       │   ├── object.cpp
│       │   └── string.cpp
│       ├── JsonDocument/
│       │   ├── CMakeLists.txt
│       │   ├── ElementProxy.cpp
│       │   ├── MemberProxy.cpp
│       │   ├── add.cpp
│       │   ├── assignment.cpp
│       │   ├── cast.cpp
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── constructor.cpp
│       │   ├── isNull.cpp
│       │   ├── issue1120.cpp
│       │   ├── nesting.cpp
│       │   ├── overflowed.cpp
│       │   ├── remove.cpp
│       │   ├── set.cpp
│       │   ├── shrinkToFit.cpp
│       │   ├── size.cpp
│       │   ├── subscript.cpp
│       │   └── swap.cpp
│       ├── JsonObject/
│       │   ├── CMakeLists.txt
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── remove.cpp
│       │   ├── set.cpp
│       │   ├── size.cpp
│       │   ├── std_string.cpp
│       │   ├── subscript.cpp
│       │   └── unbound.cpp
│       ├── JsonObjectConst/
│       │   ├── CMakeLists.txt
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── size.cpp
│       │   └── subscript.cpp
│       ├── JsonSerializer/
│       │   ├── CMakeLists.txt
│       │   ├── CustomWriter.cpp
│       │   ├── JsonArray.cpp
│       │   ├── JsonArrayPretty.cpp
│       │   ├── JsonObject.cpp
│       │   ├── JsonObjectPretty.cpp
│       │   ├── JsonVariant.cpp
│       │   ├── misc.cpp
│       │   ├── std_stream.cpp
│       │   └── std_string.cpp
│       ├── JsonVariant/
│       │   ├── CMakeLists.txt
│       │   ├── add.cpp
│       │   ├── as.cpp
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── converters.cpp
│       │   ├── copy.cpp
│       │   ├── is.cpp
│       │   ├── isnull.cpp
│       │   ├── misc.cpp
│       │   ├── nesting.cpp
│       │   ├── nullptr.cpp
│       │   ├── or.cpp
│       │   ├── overflow.cpp
│       │   ├── remove.cpp
│       │   ├── set.cpp
│       │   ├── size.cpp
│       │   ├── stl_containers.cpp
│       │   ├── subscript.cpp
│       │   ├── types.cpp
│       │   └── unbound.cpp
│       ├── JsonVariantConst/
│       │   ├── CMakeLists.txt
│       │   ├── as.cpp
│       │   ├── is.cpp
│       │   ├── isnull.cpp
│       │   ├── nesting.cpp
│       │   ├── size.cpp
│       │   └── subscript.cpp
│       ├── Misc/
│       │   ├── CMakeLists.txt
│       │   ├── JsonString.cpp
│       │   ├── NoArduinoHeader.cpp
│       │   ├── Readers.cpp
│       │   ├── StringAdapters.cpp
│       │   ├── StringWriter.cpp
│       │   ├── TypeTraits.cpp
│       │   ├── Utf16.cpp
│       │   ├── Utf8.cpp
│       │   ├── arithmeticCompare.cpp
│       │   ├── conflicts.cpp
│       │   ├── custom_string.hpp
│       │   ├── issue1967.cpp
│       │   ├── issue2129.cpp
│       │   ├── issue2166.cpp
│       │   ├── issue2181.cpp
│       │   ├── printable.cpp
│       │   ├── unsigned_char.cpp
│       │   ├── version.cpp
│       │   └── weird_strcmp.hpp
│       ├── MixedConfiguration/
│       │   ├── CMakeLists.txt
│       │   ├── decode_unicode_0.cpp
│       │   ├── decode_unicode_1.cpp
│       │   ├── enable_alignment_0.cpp
│       │   ├── enable_alignment_1.cpp
│       │   ├── enable_comments_0.cpp
│       │   ├── enable_comments_1.cpp
│       │   ├── enable_infinity_0.cpp
│       │   ├── enable_infinity_1.cpp
│       │   ├── enable_nan_0.cpp
│       │   ├── enable_nan_1.cpp
│       │   ├── enable_progmem_1.cpp
│       │   ├── issue1707.cpp
│       │   ├── string_length_size_1.cpp
│       │   ├── string_length_size_2.cpp
│       │   ├── string_length_size_4.cpp
│       │   ├── use_double_0.cpp
│       │   ├── use_double_1.cpp
│       │   ├── use_long_long_0.cpp
│       │   └── use_long_long_1.cpp
│       ├── MsgPackDeserializer/
│       │   ├── CMakeLists.txt
│       │   ├── deserializeArray.cpp
│       │   ├── deserializeObject.cpp
│       │   ├── deserializeVariant.cpp
│       │   ├── destination_types.cpp
│       │   ├── doubleToFloat.cpp
│       │   ├── errors.cpp
│       │   ├── filter.cpp
│       │   ├── input_types.cpp
│       │   └── nestingLimit.cpp
│       ├── MsgPackSerializer/
│       │   ├── CMakeLists.txt
│       │   ├── destination_types.cpp
│       │   ├── measure.cpp
│       │   ├── misc.cpp
│       │   ├── serializeArray.cpp
│       │   ├── serializeObject.cpp
│       │   └── serializeVariant.cpp
│       ├── Numbers/
│       │   ├── CMakeLists.txt
│       │   ├── convertNumber.cpp
│       │   ├── decomposeFloat.cpp
│       │   ├── parseDouble.cpp
│       │   ├── parseFloat.cpp
│       │   ├── parseInteger.cpp
│       │   └── parseNumber.cpp
│       ├── ResourceManager/
│       │   ├── CMakeLists.txt
│       │   ├── StringBuffer.cpp
│       │   ├── StringBuilder.cpp
│       │   ├── allocVariant.cpp
│       │   ├── clear.cpp
│       │   ├── saveString.cpp
│       │   ├── shrinkToFit.cpp
│       │   ├── size.cpp
│       │   └── swap.cpp
│       ├── TextFormatter/
│       │   ├── CMakeLists.txt
│       │   ├── writeFloat.cpp
│       │   ├── writeInteger.cpp
│       │   └── writeString.cpp
│       └── catch/
│           ├── .clang-format
│           ├── CMakeLists.txt
│           ├── catch.cpp
│           └── catch.hpp
├── idf_component.yml
├── keywords.txt
├── library.json
├── library.properties
└── src/
    ├── ArduinoJson/
    │   ├── Array/
    │   │   ├── ArrayImpl.hpp
    │   │   ├── ElementProxy.hpp
    │   │   ├── JsonArray.hpp
    │   │   ├── JsonArrayConst.hpp
    │   │   ├── JsonArrayIterator.hpp
    │   │   └── Utilities.hpp
    │   ├── Collection/
    │   │   ├── CollectionImpl.hpp
    │   │   └── CollectionIterator.hpp
    │   ├── Configuration.hpp
    │   ├── Deserialization/
    │   │   ├── DeserializationError.hpp
    │   │   ├── DeserializationOptions.hpp
    │   │   ├── Filter.hpp
    │   │   ├── NestingLimit.hpp
    │   │   ├── Reader.hpp
    │   │   ├── Readers/
    │   │   │   ├── ArduinoStreamReader.hpp
    │   │   │   ├── ArduinoStringReader.hpp
    │   │   │   ├── FlashReader.hpp
    │   │   │   ├── IteratorReader.hpp
    │   │   │   ├── RamReader.hpp
    │   │   │   ├── StdStreamReader.hpp
    │   │   │   └── VariantReader.hpp
    │   │   └── deserialize.hpp
    │   ├── Document/
    │   │   └── JsonDocument.hpp
    │   ├── Json/
    │   │   ├── EscapeSequence.hpp
    │   │   ├── JsonDeserializer.hpp
    │   │   ├── JsonSerializer.hpp
    │   │   ├── Latch.hpp
    │   │   ├── PrettyJsonSerializer.hpp
    │   │   ├── TextFormatter.hpp
    │   │   ├── Utf16.hpp
    │   │   └── Utf8.hpp
    │   ├── Memory/
    │   │   ├── Alignment.hpp
    │   │   ├── Allocator.hpp
    │   │   ├── MemoryPool.hpp
    │   │   ├── MemoryPoolList.hpp
    │   │   ├── ResourceManager.hpp
    │   │   ├── StringBuffer.hpp
    │   │   ├── StringBuilder.hpp
    │   │   ├── StringNode.hpp
    │   │   └── StringPool.hpp
    │   ├── Misc/
    │   │   └── SerializedValue.hpp
    │   ├── MsgPack/
    │   │   ├── MsgPackBinary.hpp
    │   │   ├── MsgPackDeserializer.hpp
    │   │   ├── MsgPackExtension.hpp
    │   │   ├── MsgPackSerializer.hpp
    │   │   ├── endianness.hpp
    │   │   └── ieee754.hpp
    │   ├── Namespace.hpp
    │   ├── Numbers/
    │   │   ├── FloatParts.hpp
    │   │   ├── FloatTraits.hpp
    │   │   ├── JsonFloat.hpp
    │   │   ├── JsonInteger.hpp
    │   │   ├── arithmeticCompare.hpp
    │   │   ├── convertNumber.hpp
    │   │   └── parseNumber.hpp
    │   ├── Object/
    │   │   ├── JsonObject.hpp
    │   │   ├── JsonObjectConst.hpp
    │   │   ├── JsonObjectIterator.hpp
    │   │   ├── JsonPair.hpp
    │   │   ├── MemberProxy.hpp
    │   │   └── ObjectImpl.hpp
    │   ├── Polyfills/
    │   │   ├── alias_cast.hpp
    │   │   ├── assert.hpp
    │   │   ├── attributes.hpp
    │   │   ├── ctype.hpp
    │   │   ├── integer.hpp
    │   │   ├── limits.hpp
    │   │   ├── math.hpp
    │   │   ├── mpl/
    │   │   │   └── max.hpp
    │   │   ├── pgmspace.hpp
    │   │   ├── pgmspace_generic.hpp
    │   │   ├── preprocessor.hpp
    │   │   ├── type_traits/
    │   │   │   ├── conditional.hpp
    │   │   │   ├── decay.hpp
    │   │   │   ├── declval.hpp
    │   │   │   ├── enable_if.hpp
    │   │   │   ├── function_traits.hpp
    │   │   │   ├── integral_constant.hpp
    │   │   │   ├── is_array.hpp
    │   │   │   ├── is_base_of.hpp
    │   │   │   ├── is_class.hpp
    │   │   │   ├── is_const.hpp
    │   │   │   ├── is_convertible.hpp
    │   │   │   ├── is_enum.hpp
    │   │   │   ├── is_floating_point.hpp
    │   │   │   ├── is_integral.hpp
    │   │   │   ├── is_pointer.hpp
    │   │   │   ├── is_same.hpp
    │   │   │   ├── is_signed.hpp
    │   │   │   ├── is_unsigned.hpp
    │   │   │   ├── make_unsigned.hpp
    │   │   │   ├── remove_const.hpp
    │   │   │   ├── remove_cv.hpp
    │   │   │   ├── remove_reference.hpp
    │   │   │   ├── type_identity.hpp
    │   │   │   └── void_t.hpp
    │   │   ├── type_traits.hpp
    │   │   └── utility.hpp
    │   ├── Serialization/
    │   │   ├── CountingDecorator.hpp
    │   │   ├── Writer.hpp
    │   │   ├── Writers/
    │   │   │   ├── ArduinoStringWriter.hpp
    │   │   │   ├── DummyWriter.hpp
    │   │   │   ├── PrintWriter.hpp
    │   │   │   ├── StaticStringWriter.hpp
    │   │   │   ├── StdStreamWriter.hpp
    │   │   │   └── StdStringWriter.hpp
    │   │   ├── measure.hpp
    │   │   └── serialize.hpp
    │   ├── Strings/
    │   │   ├── Adapters/
    │   │   │   ├── FlashString.hpp
    │   │   │   ├── RamString.hpp
    │   │   │   └── StringObject.hpp
    │   │   ├── IsString.hpp
    │   │   ├── JsonString.hpp
    │   │   ├── StringAdapter.hpp
    │   │   ├── StringAdapters.hpp
    │   │   └── StringTraits.hpp
    │   ├── Variant/
    │   │   ├── Converter.hpp
    │   │   ├── ConverterImpl.hpp
    │   │   ├── JsonVariant.hpp
    │   │   ├── JsonVariantConst.hpp
    │   │   ├── JsonVariantCopier.hpp
    │   │   ├── JsonVariantVisitor.hpp
    │   │   ├── VariantAttorney.hpp
    │   │   ├── VariantCompare.hpp
    │   │   ├── VariantContent.hpp
    │   │   ├── VariantData.hpp
    │   │   ├── VariantDataVisitor.hpp
    │   │   ├── VariantImpl.hpp
    │   │   ├── VariantOperators.hpp
    │   │   ├── VariantRefBase.hpp
    │   │   ├── VariantRefBaseImpl.hpp
    │   │   └── VariantTag.hpp
    │   ├── compatibility.hpp
    │   └── version.hpp
    ├── ArduinoJson.h
    ├── ArduinoJson.hpp
    └── CMakeLists.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html

BasedOnStyle: Google
Standard: c++11
AllowShortFunctionsOnASingleLine: Empty
IncludeBlocks: Preserve
IndentPPDirectives: AfterHash
DerivePointerAlignment: false

# Always break after if to get accurate coverage
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false


================================================
FILE: .devcontainer/clang10/devcontainer.json
================================================
{
	"name": "Clang 10",
	"image": "conanio/clang10",
	"runArgs": [
		"--name=ArduinoJson-clang10"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang11/devcontainer.json
================================================
{
	"name": "Clang 11",
	"image": "conanio/clang11",
	"runArgs": [
		"--name=ArduinoJson-clang11"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang13/Dockerfile
================================================
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y cmake git clang-13 libc++-13-dev libc++abi-13-dev
ENV CC=clang-13 CXX=clang++-13


================================================
FILE: .devcontainer/clang13/devcontainer.json
================================================
{
	"name": "Clang 13",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"runArgs": [
		"--name=ArduinoJson-clang13"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang14/Dockerfile
================================================
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y cmake git clang-14 libc++-14-dev libc++abi-14-dev
ENV CC=clang-14 CXX=clang++-14


================================================
FILE: .devcontainer/clang14/devcontainer.json
================================================
{
	"name": "Clang 14",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"runArgs": [
		"--name=ArduinoJson-clang14"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang15/Dockerfile
================================================
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y cmake git clang-15 libc++-15-dev libc++abi-15-dev
ENV CC=clang-15 CXX=clang++-15


================================================
FILE: .devcontainer/clang15/devcontainer.json
================================================
{
	"name": "Clang 15",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"runArgs": [
		"--name=ArduinoJson-clang15"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang16/Dockerfile
================================================
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y cmake git clang-16 libc++-16-dev libc++abi-16-dev
ENV CC=clang-16 CXX=clang++-16


================================================
FILE: .devcontainer/clang16/devcontainer.json
================================================
{
	"name": "Clang 16",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"runArgs": [
		"--name=ArduinoJson-clang16"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang17/Dockerfile
================================================
FROM ubuntu:24.04

RUN apt-get update
RUN apt-get install -y cmake git clang-17 libc++-17-dev libc++abi-17-dev
ENV CC=clang-17 CXX=clang++-17


================================================
FILE: .devcontainer/clang17/devcontainer.json
================================================
{
	"name": "Clang 17",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"runArgs": [
		"--name=ArduinoJson-clang17"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang5/devcontainer.json
================================================
{
	"name": "Clang 5",
	"image": "conanio/clang50",
	"runArgs": [
		"--name=ArduinoJson-clang5"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang6/devcontainer.json
================================================
{
	"name": "Clang 6",
	"image": "conanio/clang60",
	"runArgs": [
		"--name=ArduinoJson-clang6"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang7/devcontainer.json
================================================
{
	"name": "Clang 7",
	"image": "conanio/clang7",
	"runArgs": [
		"--name=ArduinoJson-clang7"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang8/devcontainer.json
================================================
{
	"name": "Clang 8",
	"image": "conanio/clang8",
	"runArgs": [
		"--name=ArduinoJson-clang8"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/clang9/devcontainer.json
================================================
{
	"name": "Clang 9",
	"image": "conanio/clang9",
	"runArgs": [
		"--name=ArduinoJson-clang9"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc10/devcontainer.json
================================================
{
	"name": "GCC 10",
	"image": "conanio/gcc10",
	"runArgs": [
		"--name=ArduinoJson-gcc10"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc11/devcontainer.json
================================================
{
	"name": "GCC 11",
	"image": "conanio/gcc11",
	"runArgs": [
		"--name=ArduinoJson-gcc11"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc12/Dockerfile
================================================
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y cmake git g++-12


================================================
FILE: .devcontainer/gcc12/devcontainer.json
================================================
{
	"name": "GCC 12",
	"build": {
		"dockerfile": "Dockerfile",
	},
	"runArgs": [
		"--name=ArduinoJson-gcc12"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc48/devcontainer.json
================================================
{
	"name": "GCC 4.8",
	"image": "conanio/gcc48",
	"runArgs": [
		"--name=ArduinoJson-gcc48"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools",
				"josetr.cmake-language-support-vscode",
				"ms-vscode.cpptools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc5/devcontainer.json
================================================
{
	"name": "GCC 5",
	"image": "conanio/gcc5",
	"runArgs": [
		"--name=ArduinoJson-gcc5"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc6/devcontainer.json
================================================
{
	"name": "GCC 6",
	"image": "conanio/gcc6",
	"runArgs": [
		"--name=ArduinoJson-gcc6"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc7/devcontainer.json
================================================
{
	"name": "GCC 7",
	"image": "conanio/gcc7",
	"runArgs": [
		"--name=ArduinoJson-gcc7"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc8/devcontainer.json
================================================
{
	"name": "GCC 8",
	"image": "conanio/gcc8",
	"runArgs": [
		"--name=ArduinoJson-gcc8"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .devcontainer/gcc9/devcontainer.json
================================================
{
	"name": "GCC 9",
	"image": "conanio/gcc9",
	"runArgs": [
		"--name=ArduinoJson-gcc9"
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-vscode.cmake-tools"
			],
			"settings": {
				"cmake.generator": "Unix Makefiles",
				"cmake.buildDirectory": "/tmp/build"
			}
		}
	}
}


================================================
FILE: .gitattributes
================================================
* text=auto
*.sh text eol=lf


================================================
FILE: .github/FUNDING.yml
================================================
github: bblanchon
custom:
  - https://arduinojson.org/book/
  - https://donate.benoitblanchon.fr/


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: 🐛 Bug report
about: Report a bug in ArduinoJson
title: ''
labels: 'bug'
assignees: ''
---

<!-- ⚠️ IMPORTANT ⚠️
Before opening a bug report, please use the ArduinoJson Troubleshooter as it may find a solution to your issue; if not, please include the  Troubleshooter's report in the description.
-->

**Describe the bug**  
A clear and concise description of what the bug is.

**Troubleshooter report**  
Here is the report generated by the [ArduinoJson Troubleshooter](https://arduinojson.org/v7/troubleshooter/):  
[Paste the report here]

**Environment**  
Here is the environment that I used:
* Microcontroller: [e.g. ESP8266]
* Core/runtime: [e.g. ESP8266 core for Arduino v3.0.2]
* IDE: [e.g. Arduino IDE 1.8.16]

**Reproduction**  
Here is a small snippet that reproduces the issue.

```c++
JsonDocument doc;

DeserializationError error = deserializeJson(doc, "{\"hello\":\"world\"}");

[insert repro code here]
```

**Compiler output**    
If relevant, include the complete compiler output (i.e. not just the line that contains the error.)


**Program output**  
If relevant, include the repro program output.

Expected output:

```
[insert expected output here]
```

Actual output:

```
[insert actual output here]
```


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
  - name: 👨‍🏫 ArduinoJson Assistant
    url: https://arduinojson.org/v7/assistant/
    about: An online tool that computes memory requirements and generates scaffolding code for your project.
  - name: 👨‍⚕️ ArduinoJson Troubleshooter
    url: https://arduinojson.org/v7/troubleshooter/
    about: An online tool that helps you diagnose the most common issues with ArduinoJson.


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: 💡 Feature request
about: Suggest an idea for ArduinoJson
title: ''
labels: enhancement
assignees: ''
---

**Is your feature request related to a problem? Please describe.**  
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**  
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**  
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**  
Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/help.md
================================================
---
name: 😭 Help!
about: Ask for help
title: ''
labels: 'question'
assignees: ''
---

<!-- ⚠️ IMPORTANT ⚠️
Before asking for help, please use the ArduinoJson Troubleshooter as it may find a solution to your issue; if not, please include the  Troubleshooter's report in the description.
-->

**Describe the issue**  
A clear and concise description of what you're trying to do.
You don't need to explain every aspect of your project: focus on the problem you're having.

**Troubleshooter report**  
Here is the report generated by the [ArduinoJson Troubleshooter](https://arduinojson.org/v7/troubleshooter/):  
[Paste the report here]

**Environment**  
Here is the environment that I'm using':
* Microconroller: [e.g. ESP8266]
* Core/runtime: [e.g. ESP8266 core for Arduino v3.0.2]
* IDE: [e.g. Arduino IDE 1.8.16]

**Reproduction**  
Here is a small snippet that demonstrate the problem.

```c++
JsonDocument doc;

DeserializationError error = deserializeJson(doc, "{\"hello\":\"world\"}");

// insert code here
```

**Program output**  
If relevant, include the program output.

Expected output:

```
[insert expected output here]
```

Actual output:

```
[insert actual output here]
```


================================================
FILE: .github/workflows/ci.yml
================================================
name: Continuous Integration

on: [push, pull_request]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-22.04
    steps:
      - name: Install
        run: sudo apt-get install -y clang-format
      - name: Checkout
        uses: actions/checkout@v4
      - name: Symlinks
        run: find * -type l -printf "::error::%p is a symlink. This is forbidden by the Arduino Library Specification." -exec false {} +
      - name: Clang-format
        run: |
          find src/ extras/ -name '*.[ch]pp' | xargs clang-format -i --verbose --style=file
          git diff --exit-code
      - name: Check URLs
        run: |
          grep -hREo "(http|https)://[a-zA-Z0-9./?=_%:-]*" src/ | sort -u | while read -r URL
          do
            STATUS=$(curl -s -o /dev/null -I -w "%{http_code}" "$URL")
            [ "$STATUS" -ge 400 ] && echo "::warning title=HTTP $STATUS::$URL returned $STATUS"
          done || true

  gcc:
    name: GCC
    needs: lint
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        include:
          - gcc: "4.8"
          - gcc: "5"
          - gcc: "6"
          - gcc: "7"
            cxxflags: -fsanitize=leak -fno-sanitize-recover=all
          - gcc: "8"
            cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
          - gcc: "9"
            cxxflags: -fsanitize=address -fno-sanitize-recover=all
          - gcc: "10"
            cxxflags: -funsigned-char # Issue #1715
          - gcc: "11"
          - gcc: "12"
    steps:
      - name: Workaround for actions/runner-images#9491
        run: sudo sysctl vm.mmap_rnd_bits=28

      - name: Install
        run: |
          sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 3B4FE6ACC0B21F32
          sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ xenial main universe'
          sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ bionic main universe'
          sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ focal main universe'
          sudo apt-get update
          sudo apt-get install -y gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
        timeout-minutes: 5

      - name: Checkout
        uses: actions/checkout@v4
        timeout-minutes: 1

      - name: Configure
        run: cmake -DCMAKE_BUILD_TYPE=Debug .
        env:
          CC: gcc-${{ matrix.gcc }}
          CXX: g++-${{ matrix.gcc }}
          CXXFLAGS: ${{ matrix.cxxflags }}
        timeout-minutes: 1

      - name: Build
        run: cmake --build .
        timeout-minutes: 10

      - name: Test
        run: ctest --output-on-failure -C Debug .
        env:
          UBSAN_OPTIONS: print_stacktrace=1
        timeout-minutes: 2

  clang:
    name: Clang
    needs: lint
    strategy:
      fail-fast: false
      matrix:
        include:
          - clang: "7"
            runner: ubuntu-22.04
            archive: focal
          - clang: "8"
            cxxflags: -fsanitize=leak -fno-sanitize-recover=all
            runner: ubuntu-22.04
            archive: focal
          - clang: "9"
            cxxflags: -fsanitize=undefined -fno-sanitize-recover=all
            runner: ubuntu-22.04
            archive: focal
          - clang: "10"
            cxxflags: -fsanitize=address -fno-sanitize-recover=all
            runner: ubuntu-22.04
            archive: focal
          - clang: "11"
            runner: ubuntu-22.04
          - clang: "12"
            runner: ubuntu-22.04
          - clang: "13"
            runner: ubuntu-22.04
          - clang: 14
          - clang: 15
          - clang: 16
          - clang: 17
          - clang: 18
          - clang: 19
    runs-on: ${{ matrix.runner || 'ubuntu-latest' }}
    steps:
      - name: Add archive repositories
        if: matrix.archive
        run: |
          sudo gpg --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
          sudo gpg --export 3B4FE6ACC0B21F32 | sudo tee /etc/apt/trusted.gpg.d/ubuntu-keyring.gpg > /dev/null
          sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ ${{ matrix.archive }} main'
          sudo add-apt-repository -yn 'deb http://archive.ubuntu.com/ubuntu/ ${{ matrix.archive }} universe'
      - name: Install Clang ${{ matrix.clang }}
        run: |
          sudo apt-get update
          sudo apt-get install -y clang-${{ matrix.clang }}
      - name: Install libc++ ${{ matrix.clang }}
        run: sudo apt-get install -y libc++-${{ matrix.clang }}-dev libc++abi-${{ matrix.clang }}-dev
      - name: Install libunwind ${{ matrix.clang }}
        if: matrix.clang == 12 # dependency is missing in Ubuntu 22.04
        run: sudo apt-get install -y libunwind-${{ matrix.clang }}-dev
      - name: Checkout
        uses: actions/checkout@v4
      - name: Configure
        run: cmake -DCMAKE_BUILD_TYPE=Debug .
        env:
          CC: clang-${{ matrix.clang }}
          CXX: clang++-${{ matrix.clang }}
          CXXFLAGS: >-
            ${{ matrix.cxxflags }}
            ${{ matrix.clang < 11 && '-I/usr/lib/llvm-10/include/c++/v1/' || '' }}
      - name: Build
        run: cmake --build .
      - name: Test
        run: ctest --output-on-failure -C Debug .
        env:
          UBSAN_OPTIONS: print_stacktrace=1

  conf_test:
    name: Test configuration on Linux
    needs: [gcc, clang]
    runs-on: ubuntu-22.04
    steps:
      - name: Install
        run: |
          sudo apt-get update
          sudo apt-get install -y g++-multilib gcc-avr avr-libc
      - name: Checkout
        uses: actions/checkout@v4
      - name: AVR
        run: avr-g++ -std=c++11 -Isrc extras/conf_test/avr.cpp
      - name: GCC 32-bit
        run: g++ -std=c++11 -m32 -Isrc extras/conf_test/x86.cpp
      - name: GCC 64-bit
        run: g++ -std=c++11 -m64 -Isrc extras/conf_test/x64.cpp
      - name: Clang 32-bit
        run: clang++ -std=c++11 -m32 -Isrc extras/conf_test/x86.cpp
      - name: Clang 64-bit
        run: clang++ -std=c++11 -m64 -Isrc extras/conf_test/x64.cpp

  conf_test_windows:
    name: Test configuration on Windows
    runs-on: windows-2022
    needs: [gcc, clang]
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: 32-bit
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
          cl /Isrc extras/conf_test/x86.cpp
        shell: cmd
      - name: 64-bit
        run: |
          call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"
          cl /Isrc extras/conf_test/x64.cpp
        shell: cmd

  xcode:
    name: XCode
    needs: clang
    runs-on: macos-26
    strategy:
      fail-fast: false
      matrix:
        include:
          - xcode: "26.0"
          - xcode: "26.1"
          - xcode: "26.2"
          - xcode: "26.3"
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Select XCode version
        run: sudo xcode-select --switch /Applications/Xcode_${{ matrix.xcode }}.app
      - name: Configure
        run: cmake -DCMAKE_BUILD_TYPE=Debug .
      - name: Build
        run: cmake --build .
      - name: Test
        run: ctest --output-on-failure -C Debug .

  # DISABLED: Running on AppVeyor instead because it supports older versions of the compiler
  # msvc:
  #   name: Visual Studio
  #   strategy:
  #     fail-fast: false
  #     matrix:
  #       include:
  #         - os: windows-2016
  #         - os: windows-2019
  #   runs-on: ${{ matrix.os }}
  #   steps:
  #     - name: Checkout
  #       uses: actions/checkout@v4
  #     - name: Configure
  #       run: cmake -DCMAKE_BUILD_TYPE=Debug .
  #     - name: Build
  #       run: cmake --build .
  #     - name: Test
  #       run: ctest --output-on-failure -C Debug .

  arduino:
    name: Arduino
    needs: gcc
    strategy:
      fail-fast: false
      matrix:
        include:
          - core: arduino:avr
            board: arduino:avr:uno
          - core: arduino:samd
            board: arduino:samd:mkr1000
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Install arduino-cli
        run: curl -fsSL https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | BINDIR=/usr/local/bin sh
      - name: Install core
        run: arduino-cli core install ${{ matrix.core }}
      - name: Install libraries
        run: arduino-cli lib install SD Ethernet
      - name: Build JsonConfigFile
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonConfigFile/JsonConfigFile.ino"
      - name: Build JsonFilterExample
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonFilterExample/JsonFilterExample.ino"
      - name: Build JsonGeneratorExample
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonGeneratorExample/JsonGeneratorExample.ino"
      - name: Build JsonHttpClient
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonHttpClient/JsonHttpClient.ino"
      - name: Build JsonParserExample
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonParserExample/JsonParserExample.ino"
      - name: Build JsonServer
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonServer/JsonServer.ino"
      - name: Build JsonUdpBeacon
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/JsonUdpBeacon/JsonUdpBeacon.ino"
      - name: Build MsgPackParser
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/MsgPackParser/MsgPackParser.ino"
      - name: Build ProgmemExample
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/ProgmemExample/ProgmemExample.ino"
      - name: Build StringExample
        run: arduino-cli compile --library . --warnings all -b ${{ matrix.board }} "examples/StringExample/StringExample.ino"

  platformio:
    name: PlatformIO
    needs: gcc
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - platform: atmelavr
            board: leonardo
            libraries:
              - SD
              - Ethernet
            conf_test: avr
          - platform: espressif8266
            board: huzzah
            conf_test: esp8266
          - platform: espressif32
            board: esp32dev
            libraries:
              - Ethernet
            conf_test: esp8266
          - platform: atmelsam
            board: mkr1000USB
            libraries:
              - SD
              - Ethernet
            conf_test: esp8266
          - platform: teensy
            board: teensy31
            conf_test: esp8266
          - platform: ststm32
            board: adafruit_feather_f405
            libraries:
              - SD
              - Ethernet
            conf_test: esp8266
          - platform: nordicnrf52
            board: adafruit_feather_nrf52840
            libraries:
              - SD
              - Ethernet
            conf_test: esp8266
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Set up cache for pip
        uses: actions/cache@v4
        with:
          path: ~/.cache/pip
          key: ${{ runner.os }}-pip
      - name: Set up Python 3.x
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"
      - name: Install PlatformIO
        run: pip install platformio
      - name: Install adafruit-nrfutil
        if: ${{ matrix.platform == 'nordicnrf52' }}
        run: pip install adafruit-nrfutil
      - name: Include Adafruit_TinyUSB.h # https://github.com/adafruit/Adafruit_nRF52_Arduino/issues/653
        if: ${{ matrix.platform == 'nordicnrf52' }}
        run: find examples/ -name '*.ino' -exec sed -i 's/\(#include <ArduinoJson.h>\)/\1\n#include <Adafruit_TinyUSB.h>/' {} +
      - name: Set up cache for platformio
        uses: actions/cache@v4
        with:
          path: ~/.platformio
          key: ${{ runner.os }}-platformio-${{ matrix.platform }}
      - name: Install platform "${{ matrix.platform }}"
        run: platformio platform install ${{ matrix.platform }}
      - name: Install libraries
        if: ${{ matrix.libraries }}
        run: platformio lib install arduino-libraries/${{ join(matrix.libraries, ' arduino-libraries/') }}
      - name: Test configuration
        run: platformio ci "extras/conf_test/${{ matrix.conf_test }}.cpp" -l '.' -b ${{ matrix.board }}
        if: ${{ matrix.conf_test }}
      - name: Build JsonConfigFile
        run: platformio ci "examples/JsonConfigFile/JsonConfigFile.ino" -l '.' -b ${{ matrix.board }}
      - name: Build JsonFilterExample
        run: platformio ci "examples/JsonFilterExample/JsonFilterExample.ino" -l '.' -b ${{ matrix.board }}
      - name: Build JsonGeneratorExample
        run: platformio ci "examples/JsonGeneratorExample/JsonGeneratorExample.ino" -l '.' -b ${{ matrix.board }}
      - name: Build JsonHttpClient
        run: platformio ci "examples/JsonHttpClient/JsonHttpClient.ino" -l '.' -b ${{ matrix.board }}
      - name: Build JsonParserExample
        run: platformio ci "examples/JsonParserExample/JsonParserExample.ino" -l '.' -b ${{ matrix.board }}
      - name: Build JsonServer
        if: ${{ matrix.platform != 'espressif32' }}
        run: platformio ci "examples/JsonServer/JsonServer.ino" -l '.' -b ${{ matrix.board }}
      - name: Build JsonUdpBeacon
        run: platformio ci "examples/JsonUdpBeacon/JsonUdpBeacon.ino" -l '.' -b ${{ matrix.board }}
      - name: Build MsgPackParser
        run: platformio ci "examples/MsgPackParser/MsgPackParser.ino" -l '.' -b ${{ matrix.board }}
      - name: Build ProgmemExample
        run: platformio ci "examples/ProgmemExample/ProgmemExample.ino" -l '.' -b ${{ matrix.board }}
      - name: Build StringExample
        run: platformio ci "examples/StringExample/StringExample.ino" -l '.' -b ${{ matrix.board }}
      - name: PlatformIO prune
        if: ${{ always() }}
        run: platformio system prune -f

  particle:
    name: Particle
    needs: gcc
    runs-on: ubuntu-latest
    if: github.event_name == 'push'
    strategy:
      fail-fast: false
      matrix:
        include:
          - board: argon
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Install Particle CLI
        run: |
          bash <( curl -sL https://particle.io/install-cli )
          echo "$HOME/bin" >> $GITHUB_PATH
      - name: Login to Particle
        run: particle login -t "${{ secrets.PARTICLE_TOKEN }}"
      - name: Compile
        run: extras/ci/particle.sh ${{ matrix.board }}

  arm:
    name: GCC for ARM processor
    needs: gcc
    runs-on: ubuntu-22.04
    steps:
      - name: Install
        run: |
          sudo apt-get update
          sudo apt-get install -y g++-arm-linux-gnueabihf
      - name: Checkout
        uses: actions/checkout@v4
      - name: Configure
        run: cmake .
        env:
          CC: arm-linux-gnueabihf-gcc
          CXX: arm-linux-gnueabihf-g++
      - name: Build
        run: cmake --build .

  coverage:
    needs: gcc
    name: Coverage
    runs-on: ubuntu-22.04
    steps:
      - name: Install
        run: sudo apt-get install -y lcov ninja-build
      - name: Checkout
        uses: actions/checkout@v4
      - name: Configure
        run: cmake -G Ninja -DCOVERAGE=true .
      - name: Build
        run: ninja
      - name: Test
        run: ctest --output-on-failure -LE 'WillFail|Fuzzing' -T test
      - name: lcov --capture
        run: lcov --capture --no-external --directory . --output-file coverage.info
      - name: lcov --remove
        run: lcov --remove coverage.info "$(pwd)/extras/*" --output-file coverage_filtered.info
      - name: genhtml
        run: mkdir coverage && genhtml coverage_filtered.info -o coverage -t ArduinoJson
      - name: Upload HTML report
        uses: actions/upload-artifact@v4
        with:
          name: Coverage report
          path: coverage
      - name: Upload to Coveralls
        uses: coverallsapp/github-action@v2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          path-to-lcov: coverage_filtered.info

  valgrind:
    needs: gcc
    name: Valgrind
    runs-on: ubuntu-22.04
    steps:
      - name: Install
        run: |
          sudo apt-get update
          sudo apt-get install -y valgrind ninja-build
      - name: Checkout
        uses: actions/checkout@v4
      - name: Configure
        run: cmake -G Ninja -D MEMORYCHECK_COMMAND_OPTIONS="--error-exitcode=1 --leak-check=full"  .
      - name: Build
        run: ninja
      - name: Memcheck
        run: ctest --output-on-failure -LE WillFail -T memcheck
        id: memcheck
      - name: MemoryChecker.*.log
        run: cat Testing/Temporary/MemoryChecker.*.log > $GITHUB_STEP_SUMMARY
        if: failure()

  clang-tidy:
    needs: clang
    name: Clang-Tidy
    runs-on: ubuntu-latest
    steps:
      - name: Install
        run: sudo apt-get install -y clang-tidy libc++-dev libc++abi-dev
      - name: Checkout
        uses: actions/checkout@v4
      - name: Configure
        run: cmake -G Ninja -DCMAKE_CXX_CLANG_TIDY="clang-tidy;--warnings-as-errors=*" -DCMAKE_BUILD_TYPE=Debug .
        env:
          CC: clang
          CXX: clang++
      - name: Check
        run: cmake --build . -- -k 0

  amalgamate:
    needs: gcc
    name: Amalgamate ArduinoJson.h
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Setup
        run: |
          if [[ $GITHUB_REF == refs/tags/* ]]; then
            VERSION=${GITHUB_REF#refs/tags/}
          else
            VERSION=${GITHUB_SHA::7}
          fi
          echo "ARDUINOJSON_H=ArduinoJson-$VERSION.h" >> $GITHUB_ENV
          echo "ARDUINOJSON_HPP=ArduinoJson-$VERSION.hpp" >> $GITHUB_ENV
      - name: Amalgamate ArduinoJson.h
        run: extras/scripts/build-single-header.sh "src/ArduinoJson.h" "$ARDUINOJSON_H"
      - name: Amalgamate ArduinoJson.hpp
        run: extras/scripts/build-single-header.sh "src/ArduinoJson.hpp" "$ARDUINOJSON_HPP"
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: Single headers
          path: |
            ${{ env.ARDUINOJSON_H }}
            ${{ env.ARDUINOJSON_HPP }}
      - name: Smoke test ArduinoJson.h
        run: |
          g++ -x c++ - <<END
          #include "$ARDUINOJSON_H"
          int main() {
            JsonDocument doc;
            deserializeJson(doc, "{}");
          }
          END
      - name: Smoke test ArduinoJson.hpp
        run: |
          g++ -x c++ - <<END
          #include "$ARDUINOJSON_HPP"
          int main() {
            ArduinoJson::JsonDocument doc;
            deserializeJson(doc, "{}");
          }
          END

  esp-idf:
    needs: gcc
    name: ESP-IDF
    runs-on: ubuntu-latest
    steps:
      - name: Setup cache
        uses: actions/cache@v4
        with:
          path: ~/.espressif
          key: ${{ runner.os }}-esp-idf
      - name: Checkout ArduinoJson
        uses: actions/checkout@v4
      - name: Checkout ESP-IDF
        uses: actions/checkout@v4
        with:
          repository: espressif/esp-idf
          path: esp-idf
          submodules: true
      - name: Install ESP-IDF
        run: ./esp-idf/install.sh
      - name: Add component
        # NOTE: we cannot commit the symlink because the Arduino Library Specification forbids it.
        run: |
          mkdir -p extras/ci/espidf/components
          ln -s $PWD extras/ci/espidf/components/ArduinoJson
      - name: Build example
        run: |
          source esp-idf/export.sh
          cd extras/ci/espidf
          idf.py build

  codeql:
    name: CodeQL
    runs-on: ubuntu-22.04
    needs: gcc

    permissions:
      actions: read
      contents: read
      security-events: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: cpp

      - name: Build
        run: |
          cmake -DCMAKE_BUILD_TYPE=Debug .
          cmake --build .

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3
        with:
          category: "/language:cpp"


================================================
FILE: .github/workflows/lock.yml
================================================
name: Lock Threads

on:
  schedule:
    - cron: '0 0 * * *'

jobs:
  lock:
    runs-on: ubuntu-latest
    steps:
      - uses: dessant/lock-threads@v5
        with:
          github-token: ${{ github.token }}
          issue-inactive-days: 30


================================================
FILE: .github/workflows/release.yml
================================================
name: Release

on:
  push:
    tags:
      - v*.*.*

jobs:
  release:
    name: Create release
    runs-on: ubuntu-22.04
    steps:
      - name: Set variables
        id: init
        run: |
          echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
          echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
      - name: Checkout
        uses: actions/checkout@v4
      - name: Write release body
        id: body
        run: |
          FILENAME=RELEASE.md
          tee $FILENAME <<END
          ## Changes

          $(extras/scripts/extract_changes.awk CHANGELOG.md)

          [View version history](https://github.com/bblanchon/ArduinoJson/blob/${{ steps.init.outputs.tag }}/CHANGELOG.md)
          END
          echo "filename=$FILENAME" >> $GITHUB_OUTPUT
      - name: Amalgamate ArduinoJson.h
        id: amalgamate_h
        run: |
          FILENAME=ArduinoJson-${{ steps.init.outputs.tag }}.h
          extras/scripts/build-single-header.sh src/ArduinoJson.h "$FILENAME"
          echo "filename=$FILENAME" >> $GITHUB_OUTPUT
      - name: Amalgamate ArduinoJson.hpp
        id: amalgamate_hpp
        run: |
          FILENAME=ArduinoJson-${{ steps.init.outputs.tag }}.hpp
          extras/scripts/build-single-header.sh src/ArduinoJson.hpp "$FILENAME"
          echo "filename=$FILENAME" >> $GITHUB_OUTPUT
      - name: Create release
        uses: ncipollo/release-action@v1
        with:
          bodyFile: ${{ steps.body.outputs.filename }}
          name: ArduinoJson ${{ steps.init.outputs.version }}
          artifacts: ${{ steps.amalgamate_h.outputs.filename }},${{ steps.amalgamate_hpp.outputs.filename }}
          token: ${{ secrets.GITHUB_TOKEN }}

  idf:
    name: IDF Component Registry
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Upload component to the component registry
        uses: espressif/upload-components-ci-action@v1
        with:
          name: ArduinoJson
          namespace: bblanchon
          api_token: ${{ secrets.IDF_COMPONENT_API_TOKEN }}

  particle:
    name: Particle
    runs-on: ubuntu-latest
    steps:
      - name: Install
        run: npm install -g particle-cli
      - name: Checkout
        uses: actions/checkout@v4
      - name: Login
        run: particle login --token ${{ secrets.PARTICLE_TOKEN }}
      - name: Publish
        run: bash -eux extras/scripts/publish-particle-library.sh

  platformio:
    name: PlatformIO
    runs-on: ubuntu-latest
    steps:
      - name: Set up Python 3.x
        uses: actions/setup-python@v5
        with:
          python-version: "3.x"
      - name: Install PlatformIO
        run: pip install platformio
      - name: Checkout
        uses: actions/checkout@v4
      - name: Publish
        run: pio pkg publish --no-interactive --no-notify
        env:
          PLATFORMIO_AUTH_TOKEN: ${{ secrets.PLATFORMIO_AUTH_TOKEN }}


================================================
FILE: .gitignore
================================================
.DS_Store
/.idea
/build
/bin
/lib
/sftp-config.json
.tags
.tags_sorted_by_file
/extras/fuzzing/*_fuzzer
/extras/fuzzing/*_fuzzer.options
/extras/fuzzing/*_fuzzer_seed_corpus.zip
.vs/
/out/

# Used by CI for Particle
/src/*.ino
/project.properties

# Used by IDF
/dist/


================================================
FILE: .mbedignore
================================================
.devcontainer/
.github/
examples/
extras/


================================================
FILE: .prettierignore
================================================
*.md


================================================
FILE: .vscode/settings.json
================================================
{
  "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools",
  "git.inputValidationLength": 80,
  "git.inputValidationSubjectLength": 72,
  "files.insertFinalNewline": true,
  "files.trimFinalNewlines": true,
  "search.exclude": {
    "/extras/tests/catch/*": true
  },
  "C_Cpp.default.includePath": [
    "/src"
  ],
  "[cmake]": {
    "editor.detectIndentation": false,
    "editor.insertSpaces": false,
  }
}


================================================
FILE: ArduinoJson.h
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include "src/ArduinoJson.h"


================================================
FILE: CHANGELOG.md
================================================
ArduinoJson: change log
=======================

HEAD
----

* Don't store string literals by pointer anymore (issue #2189)
  Version 7.3 introduced a new way to detect string literals, but it fails in some edge cases.
  I could not find a way to fix it, so I chose to remove the optimization rather than keep it broken.
* Replace the "extension slots" mechanism with a memory pool dedicated to 8-byte values.

> ### BREAKING CHANGES
>
> #### `JsonString` constructor's boolean parameter
>
> Since version 7.3, you could pass a boolean to `JsonString`'s constructor to force the string to be stored by pointer.
> This optimization has been removed, and you'll get a deprecation warning if you use it.
> To fix the issue, you must remove the boolean argument from the constructor, or better yet, remove `JsonString` altogether.
>
> ```diff
>   char name[] = "ArduinoJson";
> - doc["name"] = JsonString(name, true);
> + doc["name"] = name;
> ```
>
> #### NUL characters in string literals
> 
> Since version 7.3, ArduinoJson has supported NUL characters (`\0`) in string literals.
> This feature has been removed as part of the storage policy change.
>
> If you do need to include NULs in your string, you must use a `JsonString` instead:
>
> ```diff
> - doc["strings"] = "hello\0world"
> + doc["strings"] = JsonString("hello\0world", 11)
> ```

v7.4.3 (2026-03-02)
------

* Fix a buffer overrun in `as<T>()` when `T` is a numeric type and
  the variant contains a string representing a floating point number
  with a large number of digits (issue #2220)

v7.4.2 (2025-06-20)
------

* Fix truncated strings on Arduino Due (issue #2181)

v7.4.1 (2025-04-11)
------

* Fix crash with tiny Flash strings (issue #2170)

v7.4.0 (2025-04-09)
------

* Optimize storage of tiny strings (up to 3 characters)
* Fix support for `const char[]` (issue #2166)

v7.3.1 (2025-02-27)
------

* Fix conversion from static string to number
* Slightly reduce code size

v7.3.0 (2024-12-29)
------

* Fix support for NUL characters in `deserializeJson()`
* Make `ElementProxy` and `MemberProxy` non-copyable
* Change string copy policy: only string literal are stored by pointer
* `JsonString` is now stored by copy, unless specified otherwise
* Replace undocumented `JsonString::Ownership` with `bool`
* Rename undocumented `JsonString::isLinked()` to `isStatic()`
* Move public facing SFINAEs to template declarations

> ### BREAKING CHANGES
>
> In previous versions, `MemberProxy` (the class returned by `operator[]`) could lead to dangling pointers when used with a temporary string.
> To prevent this issue, `MemberProxy` and `ElementProxy` are now non-copyable.
>
> Your code is likely to be affected if you use `auto` to store the result of `operator[]`. For example, the following line won't compile anymore:
>
> ```cpp
> auto value = doc["key"];
> ```
>
> To fix the issue, you must append either `.as<T>()` or `.to<T>()`, depending on the situation.
>
> For example, if you are extracting values from a JSON document, you should update like this:
>
> ```diff
> - auto config = doc["config"];
> + auto config = doc["config"].as<JsonObject>();
> const char* name = config["name"];
> ```
>
> However, if you are building a JSON document, you should update like this:
>
> ```diff
> - auto config = doc["config"];
> + auto config = doc["config"].to<JsonObject>();
> config["name"] = "ArduinoJson";
> ```

v7.2.1 (2024-11-15)
------

* Forbid `deserializeJson(JsonArray|JsonObject, ...)` (issue #2135)
* Fix VLA support in `JsonDocument::set()`
* Fix `operator[](variant)` ignoring NUL characters

v7.2.0 (2024-09-18)
------

* Store object members with two slots: one for the key and one for the value
* Store 64-bit numbers (`double` and `long long`) in an additional slot
* Reduce the slot size (see table below)
* Improve message when user forgets third arg of `serializeJson()` et al.
* Set `ARDUINOJSON_USE_DOUBLE` to `0` by default on 8-bit architectures
* Deprecate `containsKey()` in favor of `doc["key"].is<T>()`
* Add support for escape sequence `\'` (issue #2124)

| Architecture | before   | after    |
|--------------|----------|----------|
| 8-bit        | 8 bytes  | 6 bytes  |
| 32-bit       | 16 bytes | 8 bytes  |
| 64-bit       | 24 bytes | 16 bytes |

> ### BREAKING CHANGES
>
> After being on the death row for years, the `containsKey()` method has finally been deprecated.
> You should replace `doc.containsKey("key")` with `doc["key"].is<T>()`, which not only checks that the key exists but also that the value is of the expected type.
>
> ```cpp
> // Before
> if (doc.containsKey("value")) {
>   int value = doc["value"];
>   // ...
> }
>
> // After
> if (doc["value"].is<int>()) {
>   int value = doc["value"];
>   // ...
> }
> ```

v7.1.0 (2024-06-27)
------

* Add `ARDUINOJSON_STRING_LENGTH_SIZE` to the namespace name
* Add support for MsgPack binary (PR #2078 by @Sanae6)
* Add support for MsgPack extension
* Make string support even more generic (PR #2084 by @d-a-v)
* Optimize `deserializeMsgPack()`
* Allow using a `JsonVariant` as a key or index (issue #2080)
  Note: works only for reading, not for writing
* Support `ElementProxy` and `MemberProxy` in `JsonDocument`'s constructor
* Don't add partial objects when allocation fails (issue #2081)
* Read MsgPack's 64-bit integers even if `ARDUINOJSON_USE_LONG_LONG` is `0`
  (they are set to `null` if they don't fit in a `long`)

v7.0.4 (2024-03-12)
------

* Make `JSON_STRING_SIZE(N)` return `N+1` to fix third-party code (issue #2054)

v7.0.3 (2024-02-05)
------

* Improve error messages when using `char` or `char*` (issue #2043)
* Reduce stack consumption (issue #2046)
* Fix compatibility with GCC 4.8 (issue #2045)

v7.0.2 (2024-01-19)
------

* Fix assertion `poolIndex < count_` after `JsonDocument::clear()` (issue #2034)

v7.0.1 (2024-01-10)
------

* Fix "no matching function" with `JsonObjectConst::operator[]` (issue #2019)
* Remove unused files in the PlatformIO package
* Fix `volatile bool` serialized as `1` or `0` instead of `true` or `false` (issue #2029)

v7.0.0 (2024-01-03)
------

* Remove `BasicJsonDocument`
* Remove `StaticJsonDocument`
* Add abstract `Allocator` class
* Merge `DynamicJsonDocument` with `JsonDocument`
* Remove `JSON_ARRAY_SIZE()`, `JSON_OBJECT_SIZE()`, and `JSON_STRING_SIZE()`
* Remove `ARDUINOJSON_ENABLE_STRING_DEDUPLICATION` (string deduplication cannot be disabled anymore)
* Remove `JsonDocument::capacity()`
* Store the strings in the heap
* Reference-count shared strings
* Always store `serialized("string")` by copy (#1915)
* Remove the zero-copy mode of `deserializeJson()` and `deserializeMsgPack()`
* Fix double lookup in `to<JsonVariant>()`
* Fix double call to `size()` in `serializeMsgPack()`
* Include `ARDUINOJSON_SLOT_OFFSET_SIZE` in the namespace name
* Remove `JsonVariant::shallowCopy()`
* `JsonDocument`'s capacity grows as needed, no need to pass it to the constructor anymore
* `JsonDocument`'s allocator is not monotonic anymore, removed values get recycled
* Show a link to the documentation when user passes an unsupported input type
* Remove `JsonDocument::memoryUsage()`
* Remove `JsonDocument::garbageCollect()`
* Add `deserializeJson(JsonVariant, ...)` and `deserializeMsgPack(JsonVariant, ...)` (#1226)
* Call `shrinkToFit()` in `deserializeJson()` and `deserializeMsgPack()`
* `serializeJson()` and `serializeMsgPack()` replace the content of `std::string` and `String` instead of appending to it
* Replace `add()` with `add<T>()` (`add(T)` is still supported)
* Remove `createNestedArray()` and `createNestedObject()` (use `to<JsonArray>()` and `to<JsonObject>()` instead)

> ### BREAKING CHANGES
>
> As every major release, ArduinoJson 7 introduces several breaking changes.
> I added some stubs so that most existing programs should compile, but I highty recommend you upgrade your code.
>
> #### `JsonDocument`
> 
> In ArduinoJson 6, you could allocate the memory pool on the stack (with `StaticJsonDocument`) or in the heap (with `DynamicJsonDocument`).  
> In ArduinoJson 7, the memory pool is always allocated in the heap, so `StaticJsonDocument` and `DynamicJsonDocument` have been merged into `JsonDocument`.
>
> In ArduinoJson 6, `JsonDocument` had a fixed capacity; in ArduinoJson 7, it has an elastic capacity that grows as needed.
> Therefore, you don't need to specify the capacity anymore, so the macros `JSON_ARRAY_SIZE()`, `JSON_OBJECT_SIZE()`, and `JSON_STRING_SIZE()` have been removed.
>
> ```c++
> // ArduinoJson 6
> StaticJsonDocument<256> doc;
> // or
> DynamicJsonDocument doc(256);
> 
> // ArduinoJson 7
> JsonDocument doc;
> ```
>
> In ArduinoJson 7, `JsonDocument` reuses released memory, so `garbageCollect()` has been removed.  
> `shrinkToFit()` is still available and releases the over-allocated memory.
>
> Due to a change in the implementation, it's not possible to store a pointer to a variant from another `JsonDocument`, so `shallowCopy()` has been removed.
> 
> In ArduinoJson 6, the meaning of `memoryUsage()` was clear: it returned the number of bytes used in the memory pool.  
> In ArduinoJson 7, the meaning of `memoryUsage()` would be ambiguous, so it has been removed.
>
> #### Custom allocators
>
> In ArduinoJson 6, you could specify a custom allocator class as a template parameter of `BasicJsonDocument`.  
> In ArduinoJson 7, you must inherit from `ArduinoJson::Allocator` and pass a pointer to an instance of your class to the constructor of `JsonDocument`.
>
> ```c++
> // ArduinoJson 6
> class MyAllocator {
>   // ...
> };
> BasicJsonDocument<MyAllocator> doc(256);
>
> // ArduinoJson 7
> class MyAllocator : public ArduinoJson::Allocator {
>   // ...
> };
> MyAllocator myAllocator;
> JsonDocument doc(&myAllocator);
> ```
>
> #### `createNestedArray()` and `createNestedObject()`
>
> In ArduinoJson 6, you could create a nested array or object with `createNestedArray()` and `createNestedObject()`.  
> In ArduinoJson 7, you must use `add<T>()` or `to<T>()` instead.
>
> For example, to create `[[],{}]`, you would write:
>
> ```c++
> // ArduinoJson 6
> arr.createNestedArray();
> arr.createNestedObject();
>
> // ArduinoJson 7
> arr.add<JsonArray>();
> arr.add<JsonObject>();
> ```
>
> And to create `{"array":[],"object":{}}`, you would write:
>
> ```c++
> // ArduinoJson 6
> obj.createNestedArray("array");
> obj.createNestedObject("object");
>
> // ArduinoJson 7
> obj["array"].to<JsonArray>();
> obj["object"].to<JsonObject>();
> ```


================================================
FILE: CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

cmake_minimum_required(VERSION 3.15)

if(ESP_PLATFORM)
	# Build ArduinoJson as an ESP-IDF component
	idf_component_register(INCLUDE_DIRS src)
	return()
endif()

project(ArduinoJson VERSION 7.4.2)

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
	include(CTest)
endif()

add_subdirectory(src)

if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME AND BUILD_TESTING)
	include(extras/CompileOptions.cmake)
	add_subdirectory(extras/tests)
	add_subdirectory(extras/fuzzing)
endif()


================================================
FILE: CONTRIBUTING.md
================================================
# Contribution to ArduinoJson

First, thank you for taking the time to contribute to this project.

You can submit changes via GitHub Pull Requests.

Please:

1. Update the test suite for any change of behavior
2. Use clang-format in "file" mode to format the code


================================================
FILE: LICENSE.txt
================================================
The MIT License (MIT)
---------------------

Copyright © 2014-2025, Benoit BLANCHON

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.


================================================
FILE: README.md
================================================
<p align="center">
  <a href="https://arduinojson.org/"><img alt="ArduinoJson" src="https://arduinojson.org/images/logo.svg" width="200" /></a>
</p>

---

[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/bblanchon/ArduinoJson/ci.yml?branch=7.x&logo=github)](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22+branch%3A7.x)
[![Continuous Integration](https://ci.appveyor.com/api/projects/status/m7s53wav1l0abssg/branch/7.x?svg=true)](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/7.x)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/arduinojson.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
[![Coveralls branch](https://img.shields.io/coveralls/github/bblanchon/ArduinoJson/7.x?logo=coveralls)](https://coveralls.io/github/bblanchon/ArduinoJson?branch=7.x)  
[![GitHub stars](https://img.shields.io/github/stars/bblanchon/ArduinoJson?style=flat&logo=github&color=orange)](https://github.com/bblanchon/ArduinoJson/stargazers)
[![GitHub Sponsors](https://img.shields.io/github/sponsors/bblanchon?logo=github&color=orange)](https://github.com/sponsors/bblanchon)

ArduinoJson is a C++ JSON library for Arduino and IoT (Internet Of Things).

## Features

* [JSON deserialization](https://arduinojson.org/v7/api/json/deserializejson/)
    * [Optionally decodes UTF-16 escape sequences to UTF-8](https://arduinojson.org/v7/api/config/decode_unicode/)
    * [Optionally supports comments in the input](https://arduinojson.org/v7/api/config/enable_comments/)
    * [Optionally filters the input to keep only desired values](https://arduinojson.org/v7/api/json/deserializejson/#filtering)
    * Supports single quotes as a string delimiter
    * Compatible with [NDJSON](http://ndjson.org/) and [JSON Lines](https://jsonlines.org/)
* [JSON serialization](https://arduinojson.org/v7/api/json/serializejson/)
    * [Can write to a buffer or a stream](https://arduinojson.org/v7/api/json/serializejson/)
    * [Optionally indents the document (prettified JSON)](https://arduinojson.org/v7/api/json/serializejsonpretty/)
* [MessagePack serialization](https://arduinojson.org/v7/api/msgpack/serializemsgpack/)
* [MessagePack deserialization](https://arduinojson.org/v7/api/msgpack/deserializemsgpack/)
* Efficient
    * [Twice smaller than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
    * [Almost 10% faster than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
    * [Consumes roughly 10% less RAM than the "official" Arduino_JSON library](https://arduinojson.org/2019/11/19/arduinojson-vs-arduino_json/)
    * [Deduplicates strings](https://arduinojson.org/news/2020/08/01/version-6-16-0/)
* Versatile
    * Supports [custom allocators (to use external RAM chip, for example)](https://arduinojson.org/v7/how-to/use-external-ram-on-esp32/)
    * Supports [`String`](https://arduinojson.org/v7/api/config/enable_arduino_string/), [`std::string`](https://arduinojson.org/v7/api/config/enable_std_string/), and [`std::string_view`](https://arduinojson.org/v7/api/config/enable_string_view/)
    * Supports [`Stream`](https://arduinojson.org/v7/api/config/enable_arduino_stream/) and [`std::istream`/`std::ostream`](https://arduinojson.org/v7/api/config/enable_std_stream/)
    * Supports [Flash strings](https://arduinojson.org/v7/api/config/enable_progmem/)
    * Supports [custom readers](https://arduinojson.org/v7/api/json/deserializejson/#custom-reader) and [custom writers](https://arduinojson.org/v7/api/json/serializejson/#custom-writer)
    * Supports [custom converters](https://arduinojson.org/news/2021/05/04/version-6-18-0/)
* Portable
    * Usable on any C++ project (not limited to Arduino)
    * Compatible with C++11, C++14 and C++17
    * Support for C++98/C++03 available on [ArduinoJson 6.20.x](https://github.com/bblanchon/ArduinoJson/tree/6.20.x)
    * Zero warnings with `-Wall -Wextra -pedantic` and `/W4`
    * [Header-only library](https://en.wikipedia.org/wiki/Header-only)
    * Works with virtually any board
        * Arduino boards: [Uno](https://amzn.to/38aL2ik), [Due](https://amzn.to/36YkWi2), [Micro](https://amzn.to/35WkdwG), [Nano](https://amzn.to/2QTvwRX), [Mega](https://amzn.to/36XWhuf), [Yun](https://amzn.to/30odURc), [Leonardo](https://amzn.to/36XWjlR)...
        * Espressif chips: [ESP8266](https://amzn.to/36YluV8), [ESP32](https://amzn.to/2G4pRCB)
        * Lolin (WeMos) boards: [D1 mini](https://amzn.to/2QUpz7q), [D1 Mini Pro](https://amzn.to/36UsGSs)...
        * Teensy boards: [4.0](https://amzn.to/30ljXGq), [3.2](https://amzn.to/2FT0EuC), [2.0](https://amzn.to/2QXUMXj)
        * Particle boards: [Argon](https://amzn.to/2FQHa9X), [Boron](https://amzn.to/36WgLUd), [Electron](https://amzn.to/30vEc4k), [Photon](https://amzn.to/387F9Cd)...
        * Texas Instruments boards: [MSP430](https://amzn.to/30nJWgg)...
        * Soft cores: [Nios II](https://en.wikipedia.org/wiki/Nios_II)...
    * Tested on all major development environments
        * [Arduino IDE](https://www.arduino.cc/en/Main/Software)
        * [Atmel Studio](http://www.atmel.com/microsite/atmel-studio/)
        * [Atollic TrueSTUDIO](https://atollic.com/truestudio/)
        * [Energia](http://energia.nu/)
        * [IAR Embedded Workbench](https://www.iar.com/iar-embedded-workbench/)
        * [Keil uVision](http://www.keil.com/)
        * [MPLAB X IDE](http://www.microchip.com/mplab/mplab-x-ide)
        * [Particle](https://www.particle.io/)
        * [PlatformIO](http://platformio.org/)
        * [Sloeber plugin for Eclipse](https://eclipse.baeyens.it/)
        * [Visual Micro](http://www.visualmicro.com/)
        * [Visual Studio](https://www.visualstudio.com/)
    * [Even works with online compilers like wandbox.org](https://wandbox.org/permlink/RlZSKy17DjJ6HcdN)
    * [CMake friendly](https://arduinojson.org/v7/how-to/use-arduinojson-with-cmake/)
* Well designed
    * [Elegant API](http://arduinojson.org/v7/example/)
    * [Thread-safe](https://en.wikipedia.org/wiki/Thread_safety)
    * Self-contained (no external dependency)
    * `const` friendly
    * [`for` friendly](https://arduinojson.org/v7/api/jsonobject/begin_end/)
    * [TMP friendly](https://en.wikipedia.org/wiki/Template_metaprogramming)
    * Handles [integer overflows](https://arduinojson.org/v7/api/jsonvariant/as/#integer-overflows)
* Well tested
    * [Unit test coverage close to 100%](https://coveralls.io/github/bblanchon/ArduinoJson?branch=7.x)
    * Continuously tested on
        * [Visual Studio 2017, 2019, 2022](https://ci.appveyor.com/project/bblanchon/arduinojson/branch/7.x)
        * [GCC 4.8, 5, 6, 7, 8, 9, 10, 11, 12](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22)
        * [Clang 7 to 19](https://github.com/bblanchon/ArduinoJson/actions?query=workflow%3A%22Continuous+Integration%22)
    * [Continuously fuzzed with Google OSS Fuzz](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:arduinojson)
    * Passes all default checks of [clang-tidy](https://releases.llvm.org/10.0.0/tools/clang/tools/extra/docs/clang-tidy/)
* Well documented
    * [Tutorials](https://arduinojson.org/v7/doc/deserialization/)
    * [Examples](https://arduinojson.org/v7/example/)
    * [How-tos](https://arduinojson.org/v7/example/)
    * [FAQ](https://arduinojson.org/v7/faq/)
    * [Troubleshooter](https://arduinojson.org/v7/troubleshooter/)
    * [Book](https://arduinojson.org/book/)
    * [Changelog](CHANGELOG.md)

## Quickstart

### Deserialization

Here is a program that parses a JSON document with ArduinoJson.

```c++
const char* json = "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";

JsonDocument doc;
deserializeJson(doc, json);

const char* sensor = doc["sensor"];
long time          = doc["time"];
double latitude    = doc["data"][0];
double longitude   = doc["data"][1];
```

See the [tutorial on arduinojson.org](https://arduinojson.org/v7/doc/deserialization/)

### Serialization

Here is a program that generates a JSON document with ArduinoJson:

```c++
JsonDocument doc;

doc["sensor"] = "gps";
doc["time"]   = 1351824120;
doc["data"][0] = 48.756080;
doc["data"][1] = 2.302038;

serializeJson(doc, Serial);
// This prints:
// {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}
```

See the [tutorial on arduinojson.org](https://arduinojson.org/v7/doc/serialization/)

## Sponsors

ArduinoJson is thankful to its sponsors. Please give them a visit; they deserve it!

<p>
  <a href="https://github.com/1technophile" rel="sponsored">
    <img alt="1technophile" src="https://avatars.githubusercontent.com/u/12672732?s=40&v=4">
  </a>
  <a href="https://github.com/LArkema" rel="sponsored">
    <img alt="LArkema" src="https://avatars.githubusercontent.com/u/38381313?s=40&v=4">
  </a>
</p>

If you run a commercial project that embeds ArduinoJson, think about [sponsoring the library's development](https://github.com/sponsors/bblanchon): it ensures the code that your products rely on stays actively maintained. It can also give your project some exposure to the makers' community.

If you are an individual user and want to support the development (or give a sign of appreciation), consider purchasing the book [Mastering ArduinoJson](https://arduinojson.org/book/)&nbsp;❤, or simply [cast a star](https://github.com/bblanchon/ArduinoJson/stargazers)&nbsp;⭐.


================================================
FILE: SUPPORT.md
================================================
# ArduinoJson Support

First off, thank you very much for using ArduinoJson.

We'll be very happy to help you, but first please read the following.

## Before asking for help

1. Read the [FAQ](https://arduinojson.org/faq/?utm_source=github&utm_medium=support)
2. Search in the [API Reference](https://arduinojson.org/api/?utm_source=github&utm_medium=support)

If you did not find the answer, please create a [new issue on GitHub](https://github.com/bblanchon/ArduinoJson/issues/new).

It is OK to add a comment to a currently opened issue, but please avoid adding comments to a closed issue.

## Before hitting the Submit button

Please provide all the relevant information:

* Good title
* Short description of the problem
* Target platform
* Compiler model and version
* [MVCE](https://stackoverflow.com/help/mcve)
* Compiler output

Good questions get fast answers!


================================================
FILE: appveyor.yml
================================================
version: 7.4.2.{build}
environment:
  matrix:
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
      CMAKE_GENERATOR: Visual Studio 17 2022
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
      CMAKE_GENERATOR: Visual Studio 16 2019
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
      CMAKE_GENERATOR: Visual Studio 15 2017
    - CMAKE_GENERATOR: Ninja
      MINGW32: i686-6.3.0-posix-dwarf-rt_v5-rev1 # MinGW-w64 6.3.0 i686
    - CMAKE_GENERATOR: Ninja
      MINGW64: x86_64-6.3.0-posix-seh-rt_v5-rev1 # MinGW-w64 6.3.0 x86_64
    - CMAKE_GENERATOR: Ninja
      MINGW64: x86_64-7.3.0-posix-seh-rt_v5-rev0 # MinGW-w64 7.3.0 x86_64
    - CMAKE_GENERATOR: Ninja
      MINGW64: x86_64-8.1.0-posix-seh-rt_v6-rev0 # MinGW-w64 8.1.0 x86_64
configuration: Debug
before_build:
  - set PATH=%PATH:C:\Program Files\Git\usr\bin;=% # Workaround for CMake not wanting sh.exe on PATH for MinGW
  - if defined MINGW set PATH=C:\%MINGW%\bin;%PATH%
  - if defined MINGW32 set PATH=C:\mingw-w64\%MINGW32%\mingw32\bin;%PATH%
  - if defined MINGW64 set PATH=C:\mingw-w64\%MINGW64%\mingw64\bin;%PATH%
  - cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -G "%CMAKE_GENERATOR%" .
build_script:
  - cmake --build . --config %CONFIGURATION%
test_script:
  - ctest -C %CONFIGURATION% --output-on-failure .


================================================
FILE: component.mk
================================================
COMPONENT_ADD_INCLUDEDIRS := src


================================================
FILE: examples/JsonConfigFile/JsonConfigFile.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to store your project configuration in a file.
// It uses the SD library but can be easily modified for any other file-system.
//
// The file contains a JSON document with the following content:
// {
//   "hostname": "examples.com",
//   "port": 2731
// }
//
// To run this program, you need an SD card connected to the SPI bus as follows:
// * MOSI <-> pin 11
// * MISO <-> pin 12
// * CLK  <-> pin 13
// * CS   <-> pin 4
//
// https://arduinojson.org/v7/example/config/

#include <ArduinoJson.h>
#include <SD.h>
#include <SPI.h>

// Our configuration structure.
struct Config {
  char hostname[64];
  int port;
};

const char* filename = "/config.txt";  // <- SD library uses 8.3 filenames
Config config;                         // <- global configuration object

// Loads the configuration from a file
void loadConfiguration(const char* filename, Config& config) {
  // Open file for reading
  File file = SD.open(filename);

  // Allocate a temporary JsonDocument
  JsonDocument doc;

  // Deserialize the JSON document
  DeserializationError error = deserializeJson(doc, file);
  if (error)
    Serial.println(F("Failed to read file, using default configuration"));

  // Copy values from the JsonDocument to the Config
  config.port = doc["port"] | 2731;
  strlcpy(config.hostname,                  // <- destination
          doc["hostname"] | "example.com",  // <- source
          sizeof(config.hostname));         // <- destination's capacity

  // Close the file (Curiously, File's destructor doesn't close the file)
  file.close();
}

// Saves the configuration to a file
void saveConfiguration(const char* filename, const Config& config) {
  // Delete existing file, otherwise the configuration is appended to the file
  SD.remove(filename);

  // Open file for writing
  File file = SD.open(filename, FILE_WRITE);
  if (!file) {
    Serial.println(F("Failed to create file"));
    return;
  }

  // Allocate a temporary JsonDocument
  JsonDocument doc;

  // Set the values in the document
  doc["hostname"] = config.hostname;
  doc["port"] = config.port;

  // Serialize JSON to file
  if (serializeJson(doc, file) == 0) {
    Serial.println(F("Failed to write to file"));
  }

  // Close the file
  file.close();
}

// Prints the content of a file to the Serial
void printFile(const char* filename) {
  // Open file for reading
  File file = SD.open(filename);
  if (!file) {
    Serial.println(F("Failed to read file"));
    return;
  }

  // Extract each characters by one by one
  while (file.available()) {
    Serial.print((char)file.read());
  }
  Serial.println();

  // Close the file
  file.close();
}

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Initialize SD library
  const int chipSelect = 4;
  while (!SD.begin(chipSelect)) {
    Serial.println(F("Failed to initialize SD library"));
    delay(1000);
  }

  // Should load default config if run for the first time
  Serial.println(F("Loading configuration..."));
  loadConfiguration(filename, config);

  // Create configuration file
  Serial.println(F("Saving configuration..."));
  saveConfiguration(filename, config);

  // Dump config file
  Serial.println(F("Print config file..."));
  printFile(filename);
}

void loop() {
  // not used in this example
}

// Performance issue?
// ------------------
//
// File is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// serialization or deserialization problem.
//
// The book "Mastering ArduinoJson" contains a case study of a project that has
// a complex configuration with nested members.
// Contrary to this example, the project in the book uses the SPIFFS filesystem.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/JsonFilterExample/JsonFilterExample.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to use DeserializationOption::Filter
//
// https://arduinojson.org/v7/example/filter/

#include <ArduinoJson.h>

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // The huge input: an extract from OpenWeatherMap response
  auto input_json = F(
      "{\"cod\":\"200\",\"message\":0,\"list\":[{\"dt\":1581498000,\"main\":{"
      "\"temp\":3.23,\"feels_like\":-3.63,\"temp_min\":3.23,\"temp_max\":4.62,"
      "\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1010,\"humidity\":"
      "58,\"temp_kf\":-1.39},\"weather\":[{\"id\":800,\"main\":\"Clear\","
      "\"description\":\"clear "
      "sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":6."
      "19,\"deg\":266},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 "
      "09:00:00\"},{\"dt\":1581508800,\"main\":{\"temp\":6.09,\"feels_like\":-"
      "1.07,\"temp_min\":6.09,\"temp_max\":7.13,\"pressure\":1015,\"sea_"
      "level\":1015,\"grnd_level\":1011,\"humidity\":48,\"temp_kf\":-1.04},"
      "\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear "
      "sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":9},\"wind\":{\"speed\":6."
      "64,\"deg\":268},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 "
      "12:00:00\"}],\"city\":{\"id\":2643743,\"name\":\"London\",\"coord\":{"
      "\"lat\":51.5085,\"lon\":-0.1257},\"country\":\"GB\",\"population\":"
      "1000000,\"timezone\":0,\"sunrise\":1581492085,\"sunset\":1581527294}}");

  // The filter: it contains "true" for each value we want to keep
  JsonDocument filter;
  filter["list"][0]["dt"] = true;
  filter["list"][0]["main"]["temp"] = true;

  // Deserialize the document
  JsonDocument doc;
  deserializeJson(doc, input_json, DeserializationOption::Filter(filter));

  // Print the result
  serializeJsonPretty(doc, Serial);
}

void loop() {
  // not used in this example
}

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// deserialization problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on deserialization.
// It begins with a simple example, like the one above, and then adds more
// features like deserializing directly from a file or an HTTP request.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/JsonGeneratorExample/JsonGeneratorExample.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.
//
// https://arduinojson.org/v7/example/generator/

#include <ArduinoJson.h>

void setup() {
  // Initialize Serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Allocate the JSON document
  JsonDocument doc;

  // Add values in the document
  doc["sensor"] = "gps";
  doc["time"] = 1351824120;

  // Add an array
  JsonArray data = doc["data"].to<JsonArray>();
  data.add(48.756080);
  data.add(2.302038);

  // Generate the minified JSON and send it to the Serial port
  serializeJson(doc, Serial);
  // The above line prints:
  // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}

  // Start a new line
  Serial.println();

  // Generate the prettified JSON and send it to the Serial port
  serializeJsonPretty(doc, Serial);
  // The above line prints:
  // {
  //   "sensor": "gps",
  //   "time": 1351824120,
  //   "data": [
  //     48.756080,
  //     2.302038
  //   ]
  // }
}

void loop() {
  // not used in this example
}

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// serialization problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
// It begins with a simple example, like the one above, and then adds more
// features like serializing directly to a file or an HTTP request.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/JsonHttpClient/JsonHttpClient.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to parse a JSON document in an HTTP response.
// It uses the Ethernet library, but can be easily adapted for Wifi.
//
// It performs a GET resquest on https://arduinojson.org/example.json
// Here is the expected response:
// {
//   "sensor": "gps",
//   "time": 1351824120,
//   "data": [
//     48.756080,
//     2.302038
//   ]
// }
//
// https://arduinojson.org/v7/example/http-client/

#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>

void setup() {
  // Initialize Serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Initialize Ethernet library
  byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
  if (!Ethernet.begin(mac)) {
    Serial.println(F("Failed to configure Ethernet"));
    return;
  }
  delay(1000);

  Serial.println(F("Connecting..."));

  // Connect to HTTP server
  EthernetClient client;
  client.setTimeout(10000);
  if (!client.connect("arduinojson.org", 80)) {
    Serial.println(F("Connection failed"));
    return;
  }

  Serial.println(F("Connected!"));

  // Send HTTP request
  client.println(F("GET /example.json HTTP/1.0"));
  client.println(F("Host: arduinojson.org"));
  client.println(F("Connection: close"));
  if (client.println() == 0) {
    Serial.println(F("Failed to send request"));
    client.stop();
    return;
  }

  // Check HTTP status
  char status[32] = {0};
  client.readBytesUntil('\r', status, sizeof(status));
  // It should be "HTTP/1.0 200 OK" or "HTTP/1.1 200 OK"
  if (strcmp(status + 9, "200 OK") != 0) {
    Serial.print(F("Unexpected response: "));
    Serial.println(status);
    client.stop();
    return;
  }

  // Skip HTTP headers
  char endOfHeaders[] = "\r\n\r\n";
  if (!client.find(endOfHeaders)) {
    Serial.println(F("Invalid response"));
    client.stop();
    return;
  }

  // Allocate the JSON document
  JsonDocument doc;

  // Parse JSON object
  DeserializationError error = deserializeJson(doc, client);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    client.stop();
    return;
  }

  // Extract values
  Serial.println(F("Response:"));
  Serial.println(doc["sensor"].as<const char*>());
  Serial.println(doc["time"].as<long>());
  Serial.println(doc["data"][0].as<float>(), 6);
  Serial.println(doc["data"][1].as<float>(), 6);

  // Disconnect
  client.stop();
}

void loop() {
  // not used in this example
}

// Performance issue?
// ------------------
//
// EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// serialization  problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on deserialization
// showing how to parse the response from GitHub's API. In the last chapter,
// it shows how to parse the huge documents from OpenWeatherMap
// and Reddit.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/JsonParserExample/JsonParserExample.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to deserialize a JSON document with ArduinoJson.
//
// https://arduinojson.org/v7/example/parser/

#include <ArduinoJson.h>

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Allocate the JSON document
  JsonDocument doc;

  // JSON input string.
  const char* json =
      "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";

  // Deserialize the JSON document
  DeserializationError error = deserializeJson(doc, json);

  // Test if parsing succeeds
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  // Fetch the values
  //
  // Most of the time, you can rely on the implicit casts.
  // In other case, you can do doc["time"].as<long>();
  const char* sensor = doc["sensor"];
  long time = doc["time"];
  double latitude = doc["data"][0];
  double longitude = doc["data"][1];

  // Print the values
  Serial.println(sensor);
  Serial.println(time);
  Serial.println(latitude, 6);
  Serial.println(longitude, 6);
}

void loop() {
  // not used in this example
}

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// deserialization problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on deserialization.
// It begins with a simple example, like the one above, and then adds more
// features like deserializing directly from a file or an HTTP request.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/JsonServer/JsonServer.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to implement an HTTP server that sends a JSON document
// in the response.
// It uses the Ethernet library but can be easily adapted for Wifi.
//
// The JSON document contains the values of the analog and digital pins.
// It looks like that:
// {
//   "analog": [0, 76, 123, 158, 192, 205],
//   "digital": [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
// }
//
// https://arduinojson.org/v7/example/http-server/

#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetServer server(80);

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Initialize Ethernet libary
  if (!Ethernet.begin(mac)) {
    Serial.println(F("Failed to initialize Ethernet library"));
    return;
  }

  // Start to listen
  server.begin();

  Serial.println(F("Server is ready."));
  Serial.print(F("Please connect to http://"));
  Serial.println(Ethernet.localIP());
}

void loop() {
  // Wait for an incomming connection
  EthernetClient client = server.available();

  // Do we have a client?
  if (!client)
    return;

  Serial.println(F("New client"));

  // Read the request (we ignore the content in this example)
  while (client.available())
    client.read();

  // Allocate a temporary JsonDocument
  JsonDocument doc;

  // Create the "analog" array
  JsonArray analogValues = doc["analog"].to<JsonArray>();
  for (int pin = 0; pin < 6; pin++) {
    // Read the analog input
    int value = analogRead(pin);

    // Add the value at the end of the array
    analogValues.add(value);
  }

  // Create the "digital" array
  JsonArray digitalValues = doc["digital"].to<JsonArray>();
  for (int pin = 0; pin < 14; pin++) {
    // Read the digital input
    int value = digitalRead(pin);

    // Add the value at the end of the array
    digitalValues.add(value);
  }

  Serial.print(F("Sending: "));
  serializeJson(doc, Serial);
  Serial.println();

  // Write response headers
  client.println(F("HTTP/1.0 200 OK"));
  client.println(F("Content-Type: application/json"));
  client.println(F("Connection: close"));
  client.print(F("Content-Length: "));
  client.println(measureJsonPretty(doc));
  client.println();

  // Write JSON document
  serializeJsonPretty(doc, client);

  // Disconnect
  client.stop();
}

// Performance issue?
// ------------------
//
// EthernetClient is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// serialization problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
// It begins with a simple example, then adds more features like serializing
// directly to a file or an HTTP client.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/JsonUdpBeacon/JsonUdpBeacon.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to send a JSON document to a UDP socket.
// At regular interval, it sends a UDP packet that contains the status of
// analog and digital pins.
// It looks like that:
// {
//   "analog": [0, 76, 123, 158, 192, 205],
//   "digital": [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
// }
//
// If you want to test this program, you need to be able to receive the UDP
// packets.
// For example, you can run netcat on your computer
// $ ncat -ulp 8888
// See https://nmap.org/ncat/
//
// https://arduinojson.org/v7/example/udp-beacon/

#include <ArduinoJson.h>
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress remoteIp(192, 168, 0, 108);  // <- EDIT!!!!
unsigned short remotePort = 8888;
unsigned short localPort = 8888;
EthernetUDP udp;

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Initialize Ethernet libary
  if (!Ethernet.begin(mac)) {
    Serial.println(F("Failed to initialize Ethernet library"));
    return;
  }

  // Enable UDP
  udp.begin(localPort);
}

void loop() {
  // Allocate a temporary JsonDocument
  JsonDocument doc;

  // Create the "analog" array
  JsonArray analogValues = doc["analog"].to<JsonArray>();
  for (int pin = 0; pin < 6; pin++) {
    // Read the analog input
    int value = analogRead(pin);

    // Add the value at the end of the array
    analogValues.add(value);
  }

  // Create the "digital" array
  JsonArray digitalValues = doc["digital"].to<JsonArray>();
  for (int pin = 0; pin < 14; pin++) {
    // Read the digital input
    int value = digitalRead(pin);

    // Add the value at the end of the array
    digitalValues.add(value);
  }

  // Log
  Serial.print(F("Sending to "));
  Serial.print(remoteIp);
  Serial.print(F(" on port "));
  Serial.println(remotePort);
  serializeJson(doc, Serial);

  // Send UDP packet
  udp.beginPacket(remoteIp, remotePort);
  serializeJson(doc, udp);
  udp.println();
  udp.endPacket();

  // Wait
  delay(10000);
}

// Performance issue?
// ------------------
//
// EthernetUDP is an unbuffered stream, which is not optimal for ArduinoJson.
// See: https://arduinojson.org/v7/how-to/improve-speed/

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any
// serialization problem.
//
// The book "Mastering ArduinoJson" contains a tutorial on serialization.
// It begins with a simple example, then adds more features like serializing
// directly to a file or any stream.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/MsgPackParser/MsgPackParser.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to deserialize a MessagePack document with
// ArduinoJson.
//
// https://arduinojson.org/v7/example/msgpack-parser/

#include <ArduinoJson.h>

void setup() {
  // Initialize serial port
  Serial.begin(9600);
  while (!Serial)
    continue;

  // Allocate the JSON document
  JsonDocument doc;

  // The MessagePack input string
  uint8_t input[] = {131, 166, 115, 101, 110, 115, 111, 114, 163, 103, 112, 115,
                     164, 116, 105, 109, 101, 206, 80,  147, 50,  248, 164, 100,
                     97,  116, 97,  146, 203, 64,  72,  96,  199, 58,  188, 148,
                     112, 203, 64,  2,   106, 146, 230, 33,  49,  169};
  // This MessagePack document contains:
  // {
  //   "sensor": "gps",
  //   "time": 1351824120,
  //   "data": [48.75608, 2.302038]
  // }

  // Parse the input
  DeserializationError error = deserializeMsgPack(doc, input);

  // Test if parsing succeeded
  if (error) {
    Serial.print("deserializeMsgPack() failed: ");
    Serial.println(error.f_str());
    return;
  }

  // Fetch the values
  //
  // Most of the time, you can rely on the implicit casts.
  // In other case, you can do doc["time"].as<long>();
  const char* sensor = doc["sensor"];
  long time = doc["time"];
  double latitude = doc["data"][0];
  double longitude = doc["data"][1];

  // Print the values
  Serial.println(sensor);
  Serial.println(time);
  Serial.println(latitude, 6);
  Serial.println(longitude, 6);
}

void loop() {
  // not used in this example
}


================================================
FILE: examples/ProgmemExample/ProgmemExample.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows the different ways you can use Flash strings with
// ArduinoJson.
//
// Use Flash strings sparingly, because ArduinoJson duplicates them in the
// JsonDocument. Prefer plain old char*, as they are more efficient in term of
// code size, speed, and memory usage.
//
// https://arduinojson.org/v7/example/progmem/

#include <ArduinoJson.h>

void setup() {
  JsonDocument doc;

  // You can use a Flash String as your JSON input.
  // WARNING: the strings in the input will be duplicated in the JsonDocument.
  deserializeJson(doc, F("{\"sensor\":\"gps\",\"time\":1351824120,"
                         "\"data\":[48.756080,2.302038]}"));

  // You can use a Flash String as a key to get a member from JsonDocument
  // No duplication is done.
  long time = doc[F("time")];

  // You can use a Flash String as a key to set a member of a JsonDocument
  // WARNING: the content of the Flash String will be duplicated in the
  // JsonDocument.
  doc[F("time")] = time;

  // You can set a Flash String as the content of a JsonVariant
  // WARNING: the content of the Flash String will be duplicated in the
  // JsonDocument.
  doc["sensor"] = F("gps");

  // It works with serialized() too:
  doc["sensor"] = serialized(F("\"gps\""));
  doc["sensor"] = serialized(F("\xA3gps"), 3);

  // You can compare the content of a JsonVariant to a Flash String
  if (doc["sensor"] == F("gps")) {
    // ...
  }
}

void loop() {
  // not used in this example
}

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any memory
// problem.
//
// The book "Mastering ArduinoJson" contains a quick C++ course that explains
// how your microcontroller stores strings in memory. It also tells why you
// should not abuse Flash strings with ArduinoJson.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: examples/StringExample/StringExample.ino
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows the different ways you can use String with ArduinoJson.
//
// Use String objects sparingly, because ArduinoJson duplicates them in the
// JsonDocument. Prefer plain old char[], as they are more efficient in term of
// code size, speed, and memory usage.
//
// https://arduinojson.org/v7/example/string/

#include <ArduinoJson.h>

void setup() {
  JsonDocument doc;

  // You can use a String as your JSON input.
  // WARNING: the string in the input  will be duplicated in the JsonDocument.
  String input =
      "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";
  deserializeJson(doc, input);

  // You can use a String as a key to get a member from JsonDocument
  // No duplication is done.
  long time = doc[String("time")];

  // You can use a String as a key to set a member of a JsonDocument
  // WARNING: the content of the String will be duplicated in the JsonDocument.
  doc[String("time")] = time;

  // You can get the content of a JsonVariant as a String
  // No duplication is done, at least not in the JsonDocument.
  String sensor = doc["sensor"];

  // Unfortunately, the following doesn't work (issue #118):
  // sensor = doc["sensor"]; // <-  error "ambiguous overload for 'operator='"
  // As a workaround, you need to replace by:
  sensor = doc["sensor"].as<String>();

  // You can set a String as the content of a JsonVariant
  // WARNING: the content of the String will be duplicated in the JsonDocument.
  doc["sensor"] = sensor;

  // It works with serialized() too:
  doc["sensor"] = serialized(sensor);

  // You can also concatenate strings
  // WARNING: the content of the String will be duplicated in the JsonDocument.
  doc[String("sen") + "sor"] = String("gp") + "s";

  // You can compare the content of a JsonObject with a String
  if (doc["sensor"] == sensor) {
    // ...
  }

  // Lastly, you can print the resulting JSON to a String
  String output;
  serializeJson(doc, output);
}

void loop() {
  // not used in this example
}

// See also
// --------
//
// https://arduinojson.org/ contains the documentation for all the functions
// used above. It also includes an FAQ that will help you solve any problem.
//
// The book "Mastering ArduinoJson" contains a quick C++ course that explains
// how your microcontroller stores strings in memory. On several occasions, it
// shows how you can avoid String in your program.
// Learn more at https://arduinojson.org/book/
// Use the coupon code TWENTY for a 20% discount ❤❤❤❤❤


================================================
FILE: extras/ArduinoJsonConfig.cmake.in
================================================
@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
check_required_components("@PROJECT_NAME@")


================================================
FILE: extras/CompileOptions.cmake
================================================
if(NOT DEFINED COVERAGE)
	set(COVERAGE OFF)
endif()

if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
	add_compile_options(
		-pedantic
		-Wall
		-Wcast-align
		-Wcast-qual
		-Wconversion
		-Wctor-dtor-privacy
		-Wdisabled-optimization
		-Werror
		-Wextra
		-Wformat=2
		-Winit-self
		-Wmissing-include-dirs
		-Wnon-virtual-dtor
		-Wold-style-cast
		-Woverloaded-virtual
		-Wparentheses
		-Wredundant-decls
		-Wshadow
		-Wsign-conversion
		-Wsign-promo
		-Wstrict-aliasing
		-Wundef
	)

	if(${COVERAGE})
		set(CMAKE_CXX_FLAGS "-fprofile-arcs -ftest-coverage")
	endif()
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
	if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9) AND(NOT ${COVERAGE}))
		add_compile_options(-g -Og)
	else() # GCC 4.8
		add_compile_options(
			-g
			-O0 # GCC 4.8 doesn't support -Og
			-Wno-shadow  # allow the same name for a function parameter and a member functions
			-Wp,-w  # Disable preprocessing warnings (see below)
		)
		# GCC 4.8 doesn't support __has_include, so we need to help him
		add_definitions(
			-DARDUINOJSON_ENABLE_STD_STRING=1
			-DARDUINOJSON_ENABLE_STD_STREAM=1
		)
	endif()

	add_compile_options(
		-Wstrict-null-sentinel
		-Wno-vla # Allow VLA in tests
	)
	add_definitions(-DHAS_VARIABLE_LENGTH_ARRAY)

	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.5)
		add_compile_options(-Wlogical-op) # the flag exists in 4.4 but is buggy
	endif()

	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.6)
		add_compile_options(-Wnoexcept)
	endif()
endif()

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
	add_compile_options(
		-Wc++11-compat
		-Wdeprecated-register
		-Wno-vla-extension # Allow VLA in tests
	)
	add_definitions(
		-DHAS_VARIABLE_LENGTH_ARRAY
		-DSUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR
	)
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
	add_compile_options(-stdlib=libc++)
	link_libraries(c++ m)

	if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.0) AND(NOT ${COVERAGE}))
		add_compile_options(-g -Og)
	else()
		add_compile_options(-g -O0)
	endif()
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
	if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 9.0) AND(NOT ${COVERAGE}))
		add_compile_options(-g -Og)
	else()
		add_compile_options(-g -O0)
	endif()
endif()

if(MSVC)
	add_definitions(-D_CRT_SECURE_NO_WARNINGS)
	add_compile_options(
		/W4 # Set warning level
		/WX # Treats all compiler warnings as errors.
		/Zc:__cplusplus # Enable updated __cplusplus macro
	)
endif()

if(MINGW)
	# Static link on MinGW to avoid linking with the wrong DLLs when multiple
	# versions are installed.
	add_link_options(-static)
endif()


================================================
FILE: extras/ci/espidf/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

cmake_minimum_required(VERSION 3.5)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(example)


================================================
FILE: extras/ci/espidf/main/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

idf_component_register(
	SRCS "main.cpp"
	INCLUDE_DIRS ""
)


================================================
FILE: extras/ci/espidf/main/component.mk
================================================
#
# "main" pseudo-component makefile.
#
# (Uses default behaviour of compiling all source files in directory, adding 'include' to include path.)


================================================
FILE: extras/ci/espidf/main/main.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>

extern "C" void app_main() {
  char buffer[256];
  JsonDocument doc;

  doc["hello"] = "world";
  serializeJson(doc, buffer);
  deserializeJson(doc, buffer);
  serializeMsgPack(doc, buffer);
  deserializeMsgPack(doc, buffer);
}


================================================
FILE: extras/ci/particle.sh
================================================
#!/bin/sh -ex

BOARD=$1

cd "$(dirname "$0")/../../"

cp extras/particle/src/smocktest.ino src/
cp extras/particle/project.properties ./

particle compile "$BOARD"


================================================
FILE: extras/conf_test/avr.cpp
================================================
#include <ArduinoJson.h>

static_assert(ARDUINOJSON_ENABLE_PROGMEM == 1, "ARDUINOJSON_ENABLE_PROGMEM");

static_assert(ARDUINOJSON_USE_LONG_LONG == 0, "ARDUINOJSON_USE_LONG_LONG");

static_assert(ARDUINOJSON_SLOT_ID_SIZE == 1, "ARDUINOJSON_SLOT_ID_SIZE");

static_assert(ARDUINOJSON_POOL_CAPACITY == 16, "ARDUINOJSON_POOL_CAPACITY");

static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");

static_assert(ARDUINOJSON_USE_DOUBLE == 0, "ARDUINOJSON_USE_DOUBLE");

static_assert(sizeof(ArduinoJson::detail::VariantData) == 6, "slot size");

void setup() {}
void loop() {}


================================================
FILE: extras/conf_test/esp8266.cpp
================================================
#include <ArduinoJson.h>

static_assert(ARDUINOJSON_USE_LONG_LONG == 1, "ARDUINOJSON_USE_LONG_LONG");

static_assert(ARDUINOJSON_SLOT_ID_SIZE == 2, "ARDUINOJSON_SLOT_ID_SIZE");

static_assert(ARDUINOJSON_POOL_CAPACITY == 128, "ARDUINOJSON_POOL_CAPACITY");

static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");

static_assert(ARDUINOJSON_USE_DOUBLE == 1, "ARDUINOJSON_USE_DOUBLE");

static_assert(sizeof(ArduinoJson::detail::VariantData) == 8, "slot size");

void setup() {}
void loop() {}


================================================
FILE: extras/conf_test/x64.cpp
================================================
#include <ArduinoJson.h>

static_assert(ARDUINOJSON_USE_LONG_LONG == 1, "ARDUINOJSON_USE_LONG_LONG");

static_assert(ARDUINOJSON_SLOT_ID_SIZE == 4, "ARDUINOJSON_SLOT_ID_SIZE");

static_assert(ARDUINOJSON_POOL_CAPACITY == 256, "ARDUINOJSON_POOL_CAPACITY");

static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");

static_assert(ARDUINOJSON_USE_DOUBLE == 1, "ARDUINOJSON_USE_DOUBLE");

static_assert(sizeof(ArduinoJson::detail::VariantData) == 16, "slot size");

int main() {}


================================================
FILE: extras/conf_test/x86.cpp
================================================
#include <ArduinoJson.h>

static_assert(ARDUINOJSON_USE_LONG_LONG == 1, "ARDUINOJSON_USE_LONG_LONG");

static_assert(ARDUINOJSON_SLOT_ID_SIZE == 2, "ARDUINOJSON_SLOT_ID_SIZE");

static_assert(ARDUINOJSON_POOL_CAPACITY == 128, "ARDUINOJSON_POOL_CAPACITY");

static_assert(ARDUINOJSON_LITTLE_ENDIAN == 1, "ARDUINOJSON_LITTLE_ENDIAN");

static_assert(ARDUINOJSON_USE_DOUBLE == 1, "ARDUINOJSON_USE_DOUBLE");

static_assert(sizeof(ArduinoJson::detail::VariantData) == 8, "slot size");

int main() {}


================================================
FILE: extras/fuzzing/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(MSVC)
	add_compile_options(-D_CRT_SECURE_NO_WARNINGS)
endif()

function(add_fuzzer name)
	set(FUZZER "${name}_fuzzer")
	set(REPRODUCER "${FUZZER}_reproducer")
	set(CORPUS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}_corpus")
	set(SEED_CORPUS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${name}_seed_corpus")

	add_executable("${FUZZER}"
		"${name}_fuzzer.cpp"
	)
	target_link_libraries("${FUZZER}"
		ArduinoJson
	)
	set_target_properties("${FUZZER}"
		PROPERTIES
			COMPILE_FLAGS "-fprofile-instr-generate -fcoverage-mapping -fsanitize=fuzzer -fno-sanitize-recover=all"
			LINK_FLAGS "-fprofile-instr-generate -fcoverage-mapping -fsanitize=fuzzer -fno-sanitize-recover=all"
	)

	add_test(
		NAME "${FUZZER}"
		COMMAND "${FUZZER}" "${CORPUS_DIR}" "${SEED_CORPUS_DIR}" -max_total_time=5 -timeout=1
	)
	set_tests_properties("${FUZZER}"
		PROPERTIES
		LABELS "Fuzzing"
	)

	add_executable("${REPRODUCER}"
		"${name}_fuzzer.cpp"
		reproducer.cpp
	)
	target_link_libraries("${REPRODUCER}"
		ArduinoJson
	)
endfunction()

# Needs Clang 6+ to compile
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6)
	if(DEFINED ENV{GITHUB_ACTIONS} AND CMAKE_CXX_COMPILER_VERSION MATCHES "^11\\.")
		# Clang 11 fails on GitHub Actions with the following error:
		# > ERROR: UndefinedBehaviorSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
		# > Sanitizer CHECK failed: /build/llvm-toolchain-11-mnvtwk/llvm-toolchain-11-11.1.0/compiler-rt/lib/sanitizer_common/sanitizer_common.cpp:54 ((0 && "unable to mmap")) != (0) (0, 0)
		message(WARNING "Fuzzing is disabled on GitHub Actions to workaround a bug in Clang 11")
		return()
	endif()

	add_fuzzer(json)
	add_fuzzer(msgpack)
	add_fuzzer(number)
endif()


================================================
FILE: extras/fuzzing/Makefile
================================================
# CAUTION: this file is invoked by https://github.com/google/oss-fuzz

CXXFLAGS += -I../../src -DARDUINOJSON_DEBUG=1 -std=c++11

all: \
	$(OUT)/json_fuzzer \
	$(OUT)/json_fuzzer_seed_corpus.zip \
	$(OUT)/json_fuzzer.options \
	$(OUT)/msgpack_fuzzer \
	$(OUT)/msgpack_fuzzer_seed_corpus.zip \
	$(OUT)/msgpack_fuzzer.options \
	$(OUT)/number_fuzzer \
	$(OUT)/number_fuzzer_seed_corpus.zip \
	$(OUT)/number_fuzzer.options

$(OUT)/%_fuzzer: %_fuzzer.cpp $(shell find ../../src -type f)
	$(CXX) $(CXXFLAGS) $< -o$@ $(LIB_FUZZING_ENGINE)

$(OUT)/%_fuzzer_seed_corpus.zip: %_seed_corpus/*
	zip -j $@ $?

$(OUT)/%_fuzzer.options:
	@echo "[libfuzzer]" > $@
	@echo "max_len = 4096" >> $@
	@echo "timeout = 10" >> $@


================================================
FILE: extras/fuzzing/json_corpus/.gitignore
================================================
*
!.gitignore


================================================
FILE: extras/fuzzing/json_fuzzer.cpp
================================================
#include <ArduinoJson.h>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  JsonDocument doc;
  DeserializationError error = deserializeJson(doc, data, size);
  if (!error) {
    std::string json;
    serializeJson(doc, json);
  }
  return 0;
}


================================================
FILE: extras/fuzzing/json_seed_corpus/Comments.json
================================================
//comment
/*comment*/
[ //comment
/*comment*/"comment"/*comment*/,//comment
/*comment*/{//comment
/* comment*/"key"//comment
: //comment
"value"//comment
}/*comment*/
]//comment

================================================
FILE: extras/fuzzing/json_seed_corpus/EmptyArray.json
================================================
[]

================================================
FILE: extras/fuzzing/json_seed_corpus/EmptyObject.json
================================================
{}

================================================
FILE: extras/fuzzing/json_seed_corpus/ExcessiveNesting.json
================================================
[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20,[21,[22,[23,[24,[25,[26,[27,[28,[29,[30,[31,[32,[33,[34,[35,[36,[37,[38,[39,[40,[41,[42,[43,[44,[45,[46,[47,[48,[49,[50,[51,[52,[53,[54,[55,[56,[57,[58,[59,[60,[61,[62,[63,[64,[65,[66,[67,[68,[69,[70,[71,[72,[73,[74,[75,[76,[77,[78,[79,[80,[81,[82,[83,[84,[85,[86,[87,[88,[89,[90,[91,[92,[93,[94,[95,[96,[97,[98,[99,[100,[101,[102,[103,[104,[105,[106,[107,[108,[109,[110,[111,[112,[113,[114,[115,[116,[117,[118,[119,[120]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

================================================
FILE: extras/fuzzing/json_seed_corpus/IntegerOverflow.json
================================================
9720730739393920739


================================================
FILE: extras/fuzzing/json_seed_corpus/Numbers.json
================================================
[
  123,
  -123,
  123.456,
  -123.456,
  12e34,
  12e-34,
  12e+34,
  12E34,
  12E-34,
  12E+34,
  12.34e56,
  12.34e-56,
  12.34e+56,
  12.34E56,
  12.34E-56,
  12.34E+56,
  NaN,
  -NaN,
  +NaN,
  Infinity,
  +Infinity,
  -Infinity
]

================================================
FILE: extras/fuzzing/json_seed_corpus/OpenWeatherMap.json
================================================
{
  "coord": {
    "lon": -0.13,
    "lat": 51.51
  },
  "weather": [
    {
      "id": 301,
      "main": "Drizzle",
      "description": "drizzle",
      "icon": "09n"
    },
    {
      "id": 701,
      "main": "Mist",
      "description": "mist",
      "icon": "50n"
    },
    {
      "id": 741,
      "main": "Fog",
      "description": "fog",
      "icon": "50n"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 281.87,
    "pressure": 1032,
    "humidity": 100,
    "temp_min": 281.15,
    "temp_max": 283.15
  },
  "visibility": 2900,
  "wind": {
    "speed": 1.5
  },
  "clouds": {
    "all": 90
  },
  "dt": 1483820400,
  "sys": {
    "type": 1,
    "id": 5091,
    "message": 0.0226,
    "country": "GB",
    "sunrise": 1483776245,
    "sunset": 1483805443
  },
  "id": 2643743,
  "name": "London",
  "cod": 200
}


================================================
FILE: extras/fuzzing/json_seed_corpus/Strings.json
================================================
[
  "hello",
  'hello',
  hello,
  {"hello":"world"},
  {'hello':'world'},
  {hello:world}
]

================================================
FILE: extras/fuzzing/json_seed_corpus/WeatherUnderground.json
================================================
{
  "response": {
    "version": "0.1",
    "termsofService": "http://www.wunderground.com/weather/api/d/terms.html",
    "features": {
      "conditions": 1
    }
  },
  "current_observation": {
    "image": {
      "url": "http://icons-ak.wxug.com/graphics/wu2/logo_130x80.png",
      "title": "Weather Underground",
      "link": "http://www.wunderground.com"
    },
    "display_location": {
      "full": "San Francisco, CA",
      "city": "San Francisco",
      "state": "CA",
      "state_name": "California",
      "country": "US",
      "country_iso3166": "US",
      "zip": "94101",
      "latitude": "37.77500916",
      "longitude": "-122.41825867",
      "elevation": "47.00000000"
    },
    "observation_location": {
      "full": "SOMA - Near Van Ness, San Francisco, California",
      "city": "SOMA - Near Van Ness, San Francisco",
      "state": "California",
      "country": "US",
      "country_iso3166": "US",
      "latitude": "37.773285",
      "longitude": "-122.417725",
      "elevation": "49 ft"
    },
    "estimated": {},
    "station_id": "KCASANFR58",
    "observation_time": "Last Updated on June 27, 5:27 PM PDT",
    "observation_time_rfc822": "Wed, 27 Jun 2012 17:27:13 -0700",
    "observation_epoch": "1340843233",
    "local_time_rfc822": "Wed, 27 Jun 2012 17:27:14 -0700",
    "local_epoch": "1340843234",
    "local_tz_short": "PDT",
    "local_tz_long": "America/Los_Angeles",
    "local_tz_offset": "-0700",
    "weather": "Partly Cloudy",
    "temperature_string": "66.3 F (19.1 C)",
    "temp_f": 66.3,
    "temp_c": 19.1,
    "relative_humidity": "65%",
    "wind_string": "From the NNW at 22.0 MPH Gusting to 28.0 MPH",
    "wind_dir": "NNW",
    "wind_degrees": 346,
    "wind_mph": 22,
    "wind_gust_mph": "28.0",
    "wind_kph": 35.4,
    "wind_gust_kph": "45.1",
    "pressure_mb": "1013",
    "pressure_in": "29.93",
    "pressure_trend": "+",
    "dewpoint_string": "54 F (12 C)",
    "dewpoint_f": 54,
    "dewpoint_c": 12,
    "heat_index_string": "NA",
    "heat_index_f": "NA",
    "heat_index_c": "NA",
    "windchill_string": "NA",
    "windchill_f": "NA",
    "windchill_c": "NA",
    "feelslike_string": "66.3 F (19.1 C)",
    "feelslike_f": "66.3",
    "feelslike_c": "19.1",
    "visibility_mi": "10.0",
    "visibility_km": "16.1",
    "solarradiation": "",
    "UV": "5",
    "precip_1hr_string": "0.00 in ( 0 mm)",
    "precip_1hr_in": "0.00",
    "precip_1hr_metric": " 0",
    "precip_today_string": "0.00 in (0 mm)",
    "precip_today_in": "0.00",
    "precip_today_metric": "0",
    "icon": "partlycloudy",
    "icon_url": "http://icons-ak.wxug.com/i/c/k/partlycloudy.gif",
    "forecast_url": "http://www.wunderground.com/US/CA/San_Francisco.html",
    "history_url": "http://www.wunderground.com/history/airport/KCASANFR58/2012/6/27/DailyHistory.html",
    "ob_url": "http://www.wunderground.com/cgi-bin/findweather/getForecast?query=37.773285,-122.417725"
  }
}


================================================
FILE: extras/fuzzing/msgpack_corpus/.gitignore
================================================
*
!.gitignore


================================================
FILE: extras/fuzzing/msgpack_fuzzer.cpp
================================================
#include <ArduinoJson.h>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  JsonDocument doc;
  DeserializationError error = deserializeMsgPack(doc, data, size);
  if (!error) {
    std::string json;
    serializeMsgPack(doc, json);
  }
  return 0;
}


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/false
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/fixarray
================================================
helloworld

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/fixint_negative
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/fixint_positive
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/fixmap
================================================
onetwo

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/fixstr
================================================
hello world

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/float32
================================================
@H

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/float64
================================================
@	!o

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/int16
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/int32
================================================
Ҷi.

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/int64
================================================
4Vx

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/int8
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/nil
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/str8
================================================
hello

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/true
================================================


================================================
FILE: extras/fuzzing/msgpack_seed_corpus/uint16
================================================
09

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/uint32
================================================
4Vx

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/uint64
================================================
4Vx

================================================
FILE: extras/fuzzing/msgpack_seed_corpus/uint8
================================================


================================================
FILE: extras/fuzzing/number_corpus/.gitignore
================================================
*
!.gitignore


================================================
FILE: extras/fuzzing/number_fuzzer.cpp
================================================
#include <ArduinoJson.h>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  // Make a copy to ensure the input is null-terminated
  std::string str(reinterpret_cast<const char*>(data), size);

  ArduinoJson::detail::parseNumber(str.c_str());

  return 0;
}


================================================
FILE: extras/fuzzing/number_seed_corpus/decimal_half
================================================
0.5


================================================
FILE: extras/fuzzing/number_seed_corpus/decimal_one_and_half
================================================
1.5


================================================
FILE: extras/fuzzing/number_seed_corpus/infinity
================================================
infinity


================================================
FILE: extras/fuzzing/number_seed_corpus/issue2220-1
================================================
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


================================================
FILE: extras/fuzzing/number_seed_corpus/issue2220-2
================================================
0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001


================================================
FILE: extras/fuzzing/number_seed_corpus/large_decimal
================================================
999999.999999


================================================
FILE: extras/fuzzing/number_seed_corpus/large_integer
================================================
9876543210


================================================
FILE: extras/fuzzing/number_seed_corpus/leading_zeros
================================================
0.00001


================================================
FILE: extras/fuzzing/number_seed_corpus/nan
================================================
nan


================================================
FILE: extras/fuzzing/number_seed_corpus/negative_decimal
================================================
-123.456


================================================
FILE: extras/fuzzing/number_seed_corpus/negative_one
================================================
-1


================================================
FILE: extras/fuzzing/number_seed_corpus/negative_scientific
================================================
-2.5e-3


================================================
FILE: extras/fuzzing/number_seed_corpus/negative_scientific_large_exp
================================================
-1.23456e+20


================================================
FILE: extras/fuzzing/number_seed_corpus/negative_zero
================================================
-0


================================================
FILE: extras/fuzzing/number_seed_corpus/one
================================================
1


================================================
FILE: extras/fuzzing/number_seed_corpus/pi_approximation
================================================
3.14159265359


================================================
FILE: extras/fuzzing/number_seed_corpus/scientific_e10
================================================
1e10


================================================
FILE: extras/fuzzing/number_seed_corpus/scientific_e_minus
================================================
1.5e-10


================================================
FILE: extras/fuzzing/number_seed_corpus/scientific_e_plus
================================================
1.23e+5


================================================
FILE: extras/fuzzing/number_seed_corpus/small_decimal
================================================
0.001


================================================
FILE: extras/fuzzing/number_seed_corpus/small_integer
================================================
42


================================================
FILE: extras/fuzzing/number_seed_corpus/trailing_zeros
================================================
1000000


================================================
FILE: extras/fuzzing/number_seed_corpus/very_small_positive
================================================
0.0000001


================================================
FILE: extras/fuzzing/number_seed_corpus/zero
================================================
0


================================================
FILE: extras/fuzzing/reproducer.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

// This file is NOT use by Google's OSS fuzz
// I only use it to reproduce the bugs found

#include <stdint.h>  // size_t
#include <stdio.h>   // fopen et al.
#include <stdlib.h>  // exit
#include <iostream>
#include <vector>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size);

std::vector<uint8_t> read(const char* path) {
  FILE* f = fopen(path, "rb");
  if (!f) {
    std::cerr << "Failed to open " << path << std::endl;
    exit(1);
  }

  fseek(f, 0, SEEK_END);
  size_t size = static_cast<size_t>(ftell(f));
  fseek(f, 0, SEEK_SET);

  std::vector<uint8_t> buffer(size);
  if (fread(buffer.data(), 1, size, f) != size) {
    fclose(f);
    std::cerr << "Failed to read " << path << std::endl;
    exit(1);
  }

  fclose(f);
  return buffer;
}

int main(int argc, const char* argv[]) {
  if (argc < 2) {
    std::cerr << "Usage: msgpack_fuzzer files" << std::endl;
    return 1;
  }

  for (int i = 1; i < argc; i++) {
    std::cout << "Loading " << argv[i] << std::endl;
    std::vector<uint8_t> buffer = read(argv[i]);
    LLVMFuzzerTestOneInput(buffer.data(), buffer.size());
  }
  return 0;
}


================================================
FILE: extras/particle/project.properties
================================================
name=ArduinoJsonCI


================================================
FILE: extras/particle/src/smocktest.ino
================================================
#include "ArduinoJson.h"

void setup() {}

void loop() {}


================================================
FILE: extras/scripts/build-single-header.sh
================================================
#!/bin/bash

set -e

RE_RELATIVE_INCLUDE='^#[[:space:]]*include[[:space:]]*"(.*)"'
RE_ABSOLUTE_INCLUDE='^#[[:space:]]*include[[:space:]]*<(ArduinoJson/.*)>'
RE_SYSTEM_INCLUDE='^#[[:space:]]*include[[:space:]]*<(.*)>'
RE_EMPTY='^(#[[:space:]]*pragma[[:space:]]+once)?[[:space:]]*(//.*)?$'
SRC_DIRECTORY="$(realpath "$(dirname $0)/../../src")"


declare -A INCLUDED

process()
{
	local PARENT=$1
	local FOLDER=$(dirname $1)
	local SHOW_COMMENT=$2
	while IFS= read -r LINE; do
		if [[ $LINE =~ $RE_ABSOLUTE_INCLUDE ]]; then
			local CHILD=${BASH_REMATCH[1]}
			local CHILD_PATH
			CHILD_PATH=$(realpath "$SRC_DIRECTORY/$CHILD")
			echo "$PARENT -> $CHILD" >&2
			if [[ ! ${INCLUDED[$CHILD_PATH]} ]]; then
				INCLUDED[$CHILD_PATH]=true
				process "$CHILD" false
			fi
		elif [[ $LINE =~ $RE_RELATIVE_INCLUDE ]]; then
			local CHILD=${BASH_REMATCH[1]}
			pushd "$FOLDER" > /dev/null
			local CHILD_PATH
			CHILD_PATH=$(realpath "$CHILD")
			echo "$PARENT -> $CHILD" >&2
			if [[ ! ${INCLUDED[$CHILD_PATH]} ]]; then
				INCLUDED[$CHILD_PATH]=true
				process "$CHILD" false
			fi
			popd > /dev/null
		elif [[ $LINE =~ $RE_SYSTEM_INCLUDE ]]; then
			local CHILD=${BASH_REMATCH[1]}
			echo "$PARENT -> <$CHILD>" >&2
			if [[ ! ${INCLUDED[$CHILD]} ]]; then
				echo "#include <$CHILD>"
				INCLUDED[$CHILD]=true
			fi
		elif [[ "${SHOW_COMMENT}" = "true" ]] ; then
			echo "$LINE"
		elif [[ ! $LINE =~ $RE_EMPTY ]]; then
			echo "$LINE"
		fi
	done < $PARENT
}

simplify_namespaces() {
	perl -p0i -e 's|ARDUINOJSON_END_PUBLIC_NAMESPACE\r?\nARDUINOJSON_BEGIN_PUBLIC_NAMESPACE\r?\n||igs' "$1"
	perl -p0i -e 's|ARDUINOJSON_END_PRIVATE_NAMESPACE\r?\nARDUINOJSON_BEGIN_PRIVATE_NAMESPACE\r?\n||igs' "$1"
	rm -f "$1.bak"
}

INCLUDED=()
INPUT=$1
OUTPUT=$2
process "$INPUT" true > "$OUTPUT"
simplify_namespaces "$OUTPUT"


================================================
FILE: extras/scripts/extract_changes.awk
================================================
#!/usr/bin/awk -f

# Start echoing after the first list item
/\* / {
    STARTED=1
    EMPTY_LINE=0
}

# Remember if we have seen an empty line
/^[[:space:]]*$/ {
    EMPTY_LINE=1
}

# Exit when seeing a new version number
/^v[[:digit:]]/ {
    if (STARTED) exit
}

# Print if the line is not empty
# and restore the empty line we have skipped
!/^[[:space:]]*$/ {
    if (STARTED) {
        if (EMPTY_LINE) {
            print ""
            EMPTY_LINE=0
        }
        print
    }
}


================================================
FILE: extras/scripts/get-release-page.sh
================================================
#!/bin/bash

set -eu

VERSION="$1"
CHANGELOG="$2"
ARDUINOJSON_H="$3"

cat << END
---
branch: v7
version: $VERSION
date: '$(date +'%Y-%m-%d')'
$(extras/scripts/wandbox/publish.sh "$ARDUINOJSON_H")
---

$(extras/scripts/extract_changes.awk "$CHANGELOG")
END


================================================
FILE: extras/scripts/publish-particle-library.sh
================================================
#!/usr/bin/env bash

set -eu

SOURCE_DIR="$(dirname "$0")/../.."
WORK_DIR=$(mktemp -d)
trap 'rm -rf "$WORK_DIR"' EXIT

cp "$SOURCE_DIR/README.md" "$WORK_DIR/README.md"
cp "$SOURCE_DIR/CHANGELOG.md" "$WORK_DIR/CHANGELOG.md"
cp "$SOURCE_DIR/library.properties" "$WORK_DIR/library.properties"
cp "$SOURCE_DIR/LICENSE.txt" "$WORK_DIR/LICENSE.txt"
cp -r "$SOURCE_DIR/src" "$WORK_DIR/"
cp -r "$SOURCE_DIR/examples" "$WORK_DIR/"

cd "$WORK_DIR"
particle library upload
particle library publish


================================================
FILE: extras/scripts/publish.sh
================================================
#!/usr/bin/env bash

set -eu

which awk sed jq curl perl >/dev/null

cd "$(dirname "$0")/../.."

if ! git diff --quiet --exit-code; then
	echo "Repository contains uncommitted changes"
	exit
fi

VERSION="$1"
DATE=$(date +%F)
TAG="v$VERSION"
VERSION_REGEX='[0-9]+\.[0-9]+\.[0-9]+(-[a-z0-9]+)?'
STARS=$(curl -s https://api.github.com/repos/bblanchon/ArduinoJson | jq '.stargazers_count')

update_version_in_source () {
	IFS=".-" read MAJOR MINOR REVISION EXTRA < <(echo "$VERSION")
	UNDERLINE=$(printf -- '-%.0s' $(seq 1 ${#TAG}))

	sed -i~ -bE "1,20{s/$VERSION_REGEX/$VERSION/g}" README.md
	rm README.md~

	sed -i~ -bE "4s/HEAD/$TAG ($DATE)/; 5s/-+/$UNDERLINE/" CHANGELOG.md
	rm CHANGELOG.md~

	sed -i~ -bE "s/(project\\s*\\(ArduinoJson\\s+VERSION\\s+).*?\\)/\\1$MAJOR.$MINOR.$REVISION)/" CMakeLists.txt
	rm CMakeLists.txt~

	sed -i~ -bE \
		-e "s/\"version\":.*$/\"version\": \"$VERSION\",/" \
		-e "s/[0-9]+ stars/$STARS stars/" \
		library.json
	rm library.json~

	sed -i~ -bE \
		-e "s/version=.*$/version=$VERSION/" \
		-e "s/[0-9]+ stars/$STARS stars/" \
		library.properties
	rm library.properties~

	sed -i~ -bE "s/version: .*$/version: $VERSION.{build}/" appveyor.yml
	rm appveyor.yml~

	sed -i~ -bE \
		-e "s/^version: .*$/version: \"$VERSION\"/" \
		-e "s/[0-9]+ stars/$STARS stars/" \
		idf_component.yml
	rm idf_component.yml~

	sed -i~ -bE \
		-e "s/ARDUINOJSON_VERSION .*$/ARDUINOJSON_VERSION \"$VERSION\"/" \
		-e "s/ARDUINOJSON_VERSION_MAJOR .*$/ARDUINOJSON_VERSION_MAJOR $MAJOR/" \
		-e "s/ARDUINOJSON_VERSION_MINOR .*$/ARDUINOJSON_VERSION_MINOR $MINOR/" \
		-e "s/ARDUINOJSON_VERSION_REVISION .*$/ARDUINOJSON_VERSION_REVISION $REVISION/" \
		-e "s/ARDUINOJSON_VERSION_MACRO .*$/ARDUINOJSON_VERSION_MACRO V$MAJOR$MINOR$REVISION/" \
		src/ArduinoJson/version.hpp
	rm src/ArduinoJson/version.hpp*~
}

commit_new_version () {
	git add src/ArduinoJson/version.hpp README.md CHANGELOG.md library.json library.properties appveyor.yml CMakeLists.txt idf_component.yml
	git commit -m "Set version to $VERSION"
}

add_tag () {
	CHANGES=$(awk '/\* /{ FOUND=1; print; next } { if (FOUND) exit}' CHANGELOG.md)
	git tag -m "ArduinoJson $VERSION"$'\n'"$CHANGES" "$TAG"
}

push () {
	git push --follow-tags
}

update_version_in_source
commit_new_version
add_tag
push

extras/scripts/build-single-header.sh "src/ArduinoJson.h" "../ArduinoJson-$TAG.h"
extras/scripts/build-single-header.sh "src/ArduinoJson.hpp" "../ArduinoJson-$TAG.hpp"
extras/scripts/get-release-page.sh "$VERSION" "CHANGELOG.md" "../ArduinoJson-$TAG.h" > "../ArduinoJson-$TAG.md"

echo "You can now copy ../ArduinoJson-$TAG.md into arduinojson.org/collections/_versions/$VERSION.md"


================================================
FILE: extras/scripts/wandbox/JsonGeneratorExample.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.

#include <iostream>
#include "ArduinoJson.h"

int main() {
  // Allocate the JSON document
  JsonDocument doc;

  // Add values in the document.
  doc["sensor"] = "gps";
  doc["time"] = 1351824120;

  // Add an array
  JsonArray data = doc["data"].to<JsonArray>();
  data.add(48.756080);
  data.add(2.302038);

  // Generate the minified JSON and send it to STDOUT
  serializeJson(doc, std::cout);
  // The above line prints:
  // {"sensor":"gps","time":1351824120,"data":[48.756080,2.302038]}

  // Start a new line
  std::cout << std::endl;

  // Generate the prettified JSON and send it to STDOUT
  serializeJsonPretty(doc, std::cout);
  // The above line prints:
  // {
  //   "sensor": "gps",
  //   "time": 1351824120,
  //   "data": [
  //     48.756080,
  //     2.302038
  //   ]
  // }
}


================================================
FILE: extras/scripts/wandbox/JsonParserExample.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to deserialize a JSON document with ArduinoJson.

#include <iostream>
#include "ArduinoJson.h"

int main() {
  // Allocate the JSON document
  JsonDocument doc;

  // JSON input string
  const char* json =
      "{\"sensor\":\"gps\",\"time\":1351824120,\"data\":[48.756080,2.302038]}";

  // Deserialize the JSON document
  DeserializationError error = deserializeJson(doc, json);

  // Test if parsing succeeds
  if (error) {
    std::cerr << "deserializeJson() failed: " << error.c_str() << std::endl;
    return 1;
  }

  // Fetch the values
  //
  // Most of the time, you can rely on the implicit casts.
  // In other case, you can do doc["time"].as<long>();
  const char* sensor = doc["sensor"];
  long time = doc["time"];
  double latitude = doc["data"][0];
  double longitude = doc["data"][1];

  // Print the values
  std::cout << sensor << std::endl;
  std::cout << time << std::endl;
  std::cout << latitude << std::endl;
  std::cout << longitude << std::endl;

  return 0;
}


================================================
FILE: extras/scripts/wandbox/MsgPackParserExample.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License
//
// This example shows how to generate a JSON document with ArduinoJson.

#include <iostream>
#include "ArduinoJson.h"

int main() {
  // Allocate the JSON document
  JsonDocument doc;

  // The MessagePack input string
  uint8_t input[] = {131, 166, 115, 101, 110, 115, 111, 114, 163, 103, 112, 115,
                     164, 116, 105, 109, 101, 206, 80,  147, 50,  248, 164, 100,
                     97,  116, 97,  146, 203, 64,  72,  96,  199, 58,  188, 148,
                     112, 203, 64,  2,   106, 146, 230, 33,  49,  169};
  // This MessagePack document contains:
  // {
  //   "sensor": "gps",
  //   "time": 1351824120,
  //   "data": [48.75608, 2.302038]
  // }

  // Parse the input
  DeserializationError error = deserializeMsgPack(doc, input);

  // Test if parsing succeeds
  if (error) {
    std::cerr << "deserializeMsgPack() failed: " << error.c_str() << std::endl;
    return 1;
  }

  // Fetch the values
  //
  // Most of the time, you can rely on the implicit casts.
  // In other case, you can do doc["time"].as<long>();
  const char* sensor = doc["sensor"];
  long time = doc["time"];
  double latitude = doc["data"][0];
  double longitude = doc["data"][1];

  // Print the values
  std::cout << sensor << std::endl;
  std::cout << time << std::endl;
  std::cout << latitude << std::endl;
  std::cout << longitude << std::endl;

  return 0;
}


================================================
FILE: extras/scripts/wandbox/publish.sh
================================================
#!/usr/bin/env bash

set -eu

ARDUINOJSON_H="$1"

read_string() {
	jq --slurp --raw-input '.' "$1"
}

compile() {
	FILE_PATH="$(dirname $0)/$1.cpp"
	cat >parameters.json <<END
{
  "code":$(read_string "$FILE_PATH"),
  "codes": [{"file":"ArduinoJson.h","code":$(read_string "$ARDUINOJSON_H")}],
  "options": "warning,c++11",
  "compiler": "gcc-head",
  "save": true
}
END
	URL=$(curl -sS -H "Content-type: application/json" -d @parameters.json  https://wandbox.org/api/compile.json | jq --raw-output .url)
	rm parameters.json
	[ -n "$URL" ] && echo "$1: $URL"
}

compile "JsonGeneratorExample"
compile "JsonParserExample"
compile "MsgPackParserExample"


================================================
FILE: extras/tests/.clang-tidy
================================================
Checks:              '-clang-analyzer-security.insecureAPI.*'


================================================
FILE: extras/tests/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

link_libraries(ArduinoJson)

# Failing builds should only link with ArduinoJson, not catch
add_subdirectory(FailingBuilds)

add_subdirectory(catch)
link_libraries(catch)

include_directories(Helpers)
add_subdirectory(Cpp17)
add_subdirectory(Cpp20)
add_subdirectory(Deprecated)
add_subdirectory(IntegrationTests)
add_subdirectory(JsonArray)
add_subdirectory(JsonArrayConst)
add_subdirectory(JsonDeserializer)
add_subdirectory(JsonDocument)
add_subdirectory(JsonObject)
add_subdirectory(JsonObjectConst)
add_subdirectory(JsonSerializer)
add_subdirectory(JsonVariant)
add_subdirectory(JsonVariantConst)
add_subdirectory(ResourceManager)
add_subdirectory(Misc)
add_subdirectory(MixedConfiguration)
add_subdirectory(MsgPackDeserializer)
add_subdirectory(MsgPackSerializer)
add_subdirectory(Numbers)
add_subdirectory(TextFormatter)


================================================
FILE: extras/tests/Cpp17/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

if(MSVC_VERSION LESS 1910)
	return()
endif()

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
	return()
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7)
	return()
endif()

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(Cpp17Tests
	string_view.cpp
)

add_test(Cpp17 Cpp17Tests)

set_tests_properties(Cpp17
	PROPERTIES
		LABELS "Catch"
)


================================================
FILE: extras/tests/Cpp17/string_view.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

// we expect ArduinoJson.h to include <string_view>
// but we don't want it to included accidentally
#undef ARDUINO
#define ARDUINOJSON_ENABLE_STD_STREAM 0
#define ARDUINOJSON_ENABLE_STD_STRING 0

#include <ArduinoJson.h>
#include <catch.hpp>

#include "Allocators.hpp"
#include "Literals.hpp"

#if !ARDUINOJSON_ENABLE_STRING_VIEW
#  error ARDUINOJSON_ENABLE_STRING_VIEW must be set to 1
#endif

using ArduinoJson::detail::sizeofArray;

TEST_CASE("string_view") {
  SpyingAllocator spy;
  JsonDocument doc(&spy);
  JsonVariant variant = doc.to<JsonVariant>();

  SECTION("deserializeJson()") {
    auto err = deserializeJson(doc, std::string_view("123", 2));
    REQUIRE(err == DeserializationError::Ok);
    REQUIRE(doc.as<int>() == 12);
  }

  SECTION("JsonDocument::set()") {
    doc.set(std::string_view("123", 2));
    REQUIRE(doc.as<std::string_view>() == "12");
  }

  SECTION("JsonDocument::operator[]() const") {
    doc["ab"] = "Yes";
    doc["abc"] = "No";
    REQUIRE(doc[std::string_view("abc", 2)] == "Yes");
  }

  SECTION("JsonDocument::operator[]()") {
    doc[std::string_view("abc", 2)] = "Yes";
    REQUIRE(doc["ab"] == "Yes");
  }

  SECTION("JsonVariant::operator==()") {
    variant.set("A");
    REQUIRE(variant == std::string_view("AX", 1));
    REQUIRE_FALSE(variant == std::string_view("BX", 1));
  }

  SECTION("JsonVariant::operator>()") {
    variant.set("B");
    REQUIRE(variant > std::string_view("AX", 1));
    REQUIRE_FALSE(variant > std::string_view("CX", 1));
  }

  SECTION("JsonVariant::operator<()") {
    variant.set("B");
    REQUIRE(variant < std::string_view("CX", 1));
    REQUIRE_FALSE(variant < std::string_view("AX", 1));
  }

  SECTION("String deduplication") {
    doc.add(std::string_view("example one", 7));
    doc.add(std::string_view("example two", 7));
    doc.add(std::string_view("example\0tree", 12));
    doc.add(std::string_view("example\0tree and a half", 12));

    REQUIRE(spy.log() == AllocatorLog{
                             Allocate(sizeofPool()),
                             Allocate(sizeofString("example")),
                             Allocate(sizeofString("example tree")),
                         });
  }

  SECTION("as<std::string_view>()") {
    doc["s"] = "Hello World";
    doc["i"] = 42;
    REQUIRE(doc["s"].as<std::string_view>() == std::string_view("Hello World"));
    REQUIRE(doc["i"].as<std::string_view>() == std::string_view());
  }

  SECTION("is<std::string_view>()") {
    doc["s"] = "Hello World";
    doc["i"] = 42;
    REQUIRE(doc["s"].is<std::string_view>() == true);
    REQUIRE(doc["i"].is<std::string_view>() == false);
  }

  SECTION("String containing NUL") {
    doc.set("hello\0world"_s);
    REQUIRE(doc.as<std::string_view>().size() == 11);
    REQUIRE(doc.as<std::string_view>() == std::string_view("hello\0world", 11));
  }
}

using ArduinoJson::detail::adaptString;

TEST_CASE("StringViewAdapter") {
  std::string_view str("bravoXXX", 5);
  auto adapter = adaptString(str);

  CHECK(stringCompare(adapter, adaptString("alpha", 5)) > 0);
  CHECK(stringCompare(adapter, adaptString("bravo", 5)) == 0);
  CHECK(stringCompare(adapter, adaptString("charlie", 7)) < 0);

  CHECK(adapter.size() == 5);
}


================================================
FILE: extras/tests/Cpp20/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

if(MSVC_VERSION LESS 1910)
	return()
endif()

if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
	return()
endif()

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10)
	return()
endif()

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(Cpp20Tests
	smoke_test.cpp
)

add_test(Cpp20 Cpp20Tests)

set_tests_properties(Cpp20
	PROPERTIES
		LABELS "Catch"
)


================================================
FILE: extras/tests/Cpp20/smoke_test.cpp
================================================
#include <ArduinoJson.h>

#include <catch.hpp>
#include <string>

TEST_CASE("C++20 smoke test") {
  JsonDocument doc;

  deserializeJson(doc, "{\"hello\":\"world\"}");
  REQUIRE(doc["hello"] == "world");

  std::string json;
  serializeJson(doc, json);
  REQUIRE(json == "{\"hello\":\"world\"}");
}


================================================
FILE: extras/tests/Deprecated/BasicJsonDocument.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

#include <string>

using ArduinoJson::detail::is_base_of;

static std::string allocatorLog;

struct CustomAllocator {
  CustomAllocator() {
    allocatorLog = "";
  }

  void* allocate(size_t n) {
    allocatorLog += "A";
    return malloc(n);
  }

  void deallocate(void* p) {
    free(p);
    allocatorLog += "D";
  }

  void* reallocate(void* p, size_t n) {
    allocatorLog += "R";
    return realloc(p, n);
  }
};

TEST_CASE("BasicJsonDocument") {
  allocatorLog.clear();

  SECTION("is a JsonDocument") {
    REQUIRE(
        is_base_of<JsonDocument, BasicJsonDocument<CustomAllocator>>::value ==
        true);
  }

  SECTION("deserialize / serialize") {
    BasicJsonDocument<CustomAllocator> doc(256);
    deserializeJson(doc, "{\"hello\":\"world\"}");
    REQUIRE(doc.as<std::string>() == "{\"hello\":\"world\"}");
    doc.clear();
    REQUIRE(allocatorLog == "AARARDDD");
  }

  SECTION("copy") {
    BasicJsonDocument<CustomAllocator> doc(256);
    doc["hello"] = "world";
    auto copy = doc;
    REQUIRE(copy.as<std::string>() == "{\"hello\":\"world\"}");
    REQUIRE(allocatorLog == "AAAAAA");
  }

  SECTION("capacity") {
    BasicJsonDocument<CustomAllocator> doc(256);
    REQUIRE(doc.capacity() == 256);
  }

  SECTION("garbageCollect()") {
    BasicJsonDocument<CustomAllocator> doc(256);
    doc.garbageCollect();
  }
}


================================================
FILE: extras/tests/Deprecated/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
	add_compile_options(
		-w
	)
endif()

if(MSVC)
	add_compile_options(
		/wd4996
	)
endif()

add_executable(DeprecatedTests
	add.cpp
	BasicJsonDocument.cpp
	containsKey.cpp
	createNestedArray.cpp
	createNestedObject.cpp
	DynamicJsonDocument.cpp
	macros.cpp
	memoryUsage.cpp
	shallowCopy.cpp
	StaticJsonDocument.cpp
)

add_test(Deprecated DeprecatedTests)

set_tests_properties(Deprecated
	PROPERTIES
	LABELS "Catch"
)


================================================
FILE: extras/tests/Deprecated/DynamicJsonDocument.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

using ArduinoJson::detail::is_base_of;

TEST_CASE("DynamicJsonDocument") {
  SECTION("is a JsonDocument") {
    REQUIRE(is_base_of<JsonDocument, DynamicJsonDocument>::value == true);
  }

  SECTION("deserialize / serialize") {
    DynamicJsonDocument doc(256);
    deserializeJson(doc, "{\"hello\":\"world\"}");
    REQUIRE(doc.as<std::string>() == "{\"hello\":\"world\"}");
  }

  SECTION("copy") {
    DynamicJsonDocument doc(256);
    doc["hello"] = "world";
    auto copy = doc;
    REQUIRE(copy.as<std::string>() == "{\"hello\":\"world\"}");
  }

  SECTION("capacity") {
    DynamicJsonDocument doc(256);
    REQUIRE(doc.capacity() == 256);
  }

  SECTION("garbageCollect()") {
    DynamicJsonDocument doc(256);
    doc.garbageCollect();
  }
}


================================================
FILE: extras/tests/Deprecated/StaticJsonDocument.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

using ArduinoJson::detail::is_base_of;

TEST_CASE("StaticJsonDocument") {
  SECTION("is a JsonDocument") {
    REQUIRE(is_base_of<JsonDocument, StaticJsonDocument<256>>::value == true);
  }

  SECTION("deserialize / serialize") {
    StaticJsonDocument<256> doc;
    deserializeJson(doc, "{\"hello\":\"world\"}");
    REQUIRE(doc.as<std::string>() == "{\"hello\":\"world\"}");
  }

  SECTION("copy") {
    StaticJsonDocument<256> doc;
    doc["hello"] = "world";
    auto copy = doc;
    REQUIRE(copy.as<std::string>() == "{\"hello\":\"world\"}");
  }

  SECTION("capacity") {
    StaticJsonDocument<256> doc;
    REQUIRE(doc.capacity() == 256);
  }
}


================================================
FILE: extras/tests/Deprecated/add.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

TEST_CASE("JsonArray::add()") {
  JsonDocument doc;
  JsonArray array = doc.to<JsonArray>();
  array.add().set(42);
  REQUIRE(doc.as<std::string>() == "[42]");
}

TEST_CASE("JsonDocument::add()") {
  JsonDocument doc;
  doc.add().set(42);
  REQUIRE(doc.as<std::string>() == "[42]");
}

TEST_CASE("ElementProxy::add()") {
  JsonDocument doc;
  doc[0].add().set(42);
  REQUIRE(doc.as<std::string>() == "[[42]]");
}

TEST_CASE("MemberProxy::add()") {
  JsonDocument doc;
  doc["x"].add().set(42);
  REQUIRE(doc.as<std::string>() == "{\"x\":[42]}");
}

TEST_CASE("JsonVariant::add()") {
  JsonDocument doc;
  JsonVariant v = doc.add();
  v.add().set(42);
  REQUIRE(doc.as<std::string>() == "[[42]]");
}


================================================
FILE: extras/tests/Deprecated/containsKey.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

#include "Literals.hpp"

TEST_CASE("JsonDocument::containsKey()") {
  JsonDocument doc;

  SECTION("returns true on object") {
    doc["hello"] = "world";

    REQUIRE(doc.containsKey("hello") == true);
  }

  SECTION("returns true when value is null") {
    doc["hello"] = static_cast<const char*>(0);

    REQUIRE(doc.containsKey("hello") == true);
  }

  SECTION("returns true when key is a std::string") {
    doc["hello"] = "world";

    REQUIRE(doc.containsKey("hello"_s) == true);
  }

  SECTION("returns false  on object") {
    doc["world"] = "hello";

    REQUIRE(doc.containsKey("hello") == false);
  }

  SECTION("returns false on array") {
    doc.add("hello");

    REQUIRE(doc.containsKey("hello") == false);
  }

  SECTION("returns false on null") {
    REQUIRE(doc.containsKey("hello") == false);
  }

  SECTION("supports JsonVariant") {
    doc["hello"] = "world";
    doc["key"] = "hello";

    REQUIRE(doc.containsKey(doc["key"]) == true);
    REQUIRE(doc.containsKey(doc["foo"]) == false);
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("supports VLAs") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "hello");

    doc["hello"] = "world";

    REQUIRE(doc.containsKey(vla) == true);
  }
#endif
}

TEST_CASE("MemberProxy::containsKey()") {
  JsonDocument doc;
  const auto& mp = doc["hello"];

  SECTION("containsKey(const char*)") {
    mp["key"] = "value";

    REQUIRE(mp.containsKey("key") == true);
    REQUIRE(mp.containsKey("key") == true);
  }

  SECTION("containsKey(std::string)") {
    mp["key"] = "value";

    REQUIRE(mp.containsKey("key"_s) == true);
    REQUIRE(mp.containsKey("key"_s) == true);
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("supports VLAs") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "hello");

    mp["hello"] = "world";

    REQUIRE(mp.containsKey(vla) == true);
  }
#endif
}

TEST_CASE("JsonObject::containsKey()") {
  JsonDocument doc;
  JsonObject obj = doc.to<JsonObject>();
  obj["hello"] = 42;

  SECTION("returns true only if key is present") {
    REQUIRE(false == obj.containsKey("world"));
    REQUIRE(true == obj.containsKey("hello"));
  }

  SECTION("returns false after remove()") {
    obj.remove("hello");

    REQUIRE(false == obj.containsKey("hello"));
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("key is a VLA") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "hello");

    REQUIRE(true == obj.containsKey(vla));
  }
#endif

  SECTION("key is a JsonVariant") {
    doc["key"] = "hello";
    REQUIRE(true == obj.containsKey(obj["key"]));
    REQUIRE(false == obj.containsKey(obj["hello"]));
  }

  SECTION("std::string") {
    REQUIRE(true == obj.containsKey("hello"_s));
  }

  SECTION("unsigned char[]") {
    unsigned char key[] = "hello";
    REQUIRE(true == obj.containsKey(key));
  }
}

TEST_CASE("JsonObjectConst::containsKey()") {
  JsonDocument doc;
  doc["hello"] = 42;
  auto obj = doc.as<JsonObjectConst>();

  SECTION("supports const char*") {
    REQUIRE(false == obj.containsKey("world"));
    REQUIRE(true == obj.containsKey("hello"));
  }

  SECTION("supports std::string") {
    REQUIRE(false == obj.containsKey("world"_s));
    REQUIRE(true == obj.containsKey("hello"_s));
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("supports VLA") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "hello");

    REQUIRE(true == obj.containsKey(vla));
  }
#endif

  SECTION("supports JsonVariant") {
    doc["key"] = "hello";
    REQUIRE(true == obj.containsKey(obj["key"]));
    REQUIRE(false == obj.containsKey(obj["hello"]));
  }
}

TEST_CASE("JsonVariant::containsKey()") {
  JsonDocument doc;
  JsonVariant var = doc.to<JsonVariant>();

  SECTION("returns false is unbound") {
    CHECK_FALSE(JsonVariant().containsKey("hello"));
  }

  SECTION("containsKey(const char*)") {
    var["hello"] = "world";

    REQUIRE(var.containsKey("hello") == true);
    REQUIRE(var.containsKey("world") == false);
  }

  SECTION("containsKey(std::string)") {
    var["hello"] = "world";

    REQUIRE(var.containsKey("hello"_s) == true);
    REQUIRE(var.containsKey("world"_s) == false);
  }

  SECTION("containsKey(JsonVariant)") {
    var["hello"] = "world";
    var["key"] = "hello";

    REQUIRE(var.containsKey(doc["key"]) == true);
    REQUIRE(var.containsKey(doc["foo"]) == false);
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("supports VLAs") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "hello");

    var["hello"] = "world";

    REQUIRE(var.containsKey(vla) == true);
  }
#endif
}

TEST_CASE("JsonVariantConst::containsKey()") {
  JsonDocument doc;
  doc["hello"] = "world";
  JsonVariantConst var = doc.as<JsonVariant>();

  SECTION("support const char*") {
    REQUIRE(var.containsKey("hello") == true);
    REQUIRE(var.containsKey("world") == false);
  }

  SECTION("support std::string") {
    REQUIRE(var.containsKey("hello"_s) == true);
    REQUIRE(var.containsKey("world"_s) == false);
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("supports VLA") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "hello");

    REQUIRE(true == var.containsKey(vla));
  }
#endif

  SECTION("support JsonVariant") {
    doc["key"] = "hello";
    REQUIRE(var.containsKey(var["key"]) == true);
    REQUIRE(var.containsKey(var["foo"]) == false);
  }
}


================================================
FILE: extras/tests/Deprecated/createNestedArray.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

#include <string>

#include "Literals.hpp"

TEST_CASE("JsonDocument::createNestedArray()") {
  JsonDocument doc;

  SECTION("createNestedArray()") {
    JsonArray array = doc.createNestedArray();
    array.add(42);
    REQUIRE(doc.as<std::string>() == "[[42]]");
  }

  SECTION("createNestedArray(const char*)") {
    JsonArray array = doc.createNestedArray("key");
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }

  SECTION("createNestedArray(std::string)") {
    JsonArray array = doc.createNestedArray("key"_s);
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("createNestedArray(VLA)") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "key");
    JsonArray array = doc.createNestedArray(vla);
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }
#endif
}

TEST_CASE("JsonArray::createNestedArray()") {
  JsonDocument doc;
  JsonArray array = doc.to<JsonArray>();
  JsonArray nestedArray = array.createNestedArray();
  nestedArray.add(42);
  REQUIRE(doc.as<std::string>() == "[[42]]");
}

TEST_CASE("JsonObject::createNestedArray()") {
  JsonDocument doc;
  JsonObject object = doc.to<JsonObject>();

  SECTION("createNestedArray(const char*)") {
    JsonArray array = object.createNestedArray("key");
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }

  SECTION("createNestedArray(std::string)") {
    JsonArray array = object.createNestedArray("key"_s);
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("createNestedArray(VLA)") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "key");
    JsonArray array = object.createNestedArray(vla);
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }
#endif
}

TEST_CASE("JsonVariant::createNestedArray()") {
  JsonDocument doc;
  JsonVariant variant = doc.to<JsonVariant>();

  SECTION("createNestedArray()") {
    JsonArray array = variant.createNestedArray();
    array.add(42);
    REQUIRE(doc.as<std::string>() == "[[42]]");
  }

  SECTION("createNestedArray(const char*)") {
    JsonArray array = variant.createNestedArray("key");
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }

  SECTION("createNestedArray(std::string)") {
    JsonArray array = variant.createNestedArray("key"_s);
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("createNestedArray(VLA)") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "key");
    JsonArray array = variant.createNestedArray(vla);
    array.add(42);
    REQUIRE(doc.as<std::string>() == "{\"key\":[42]}");
  }
#endif
}


================================================
FILE: extras/tests/Deprecated/createNestedObject.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

#include <string>

#include "Literals.hpp"

TEST_CASE("JsonDocument::createNestedObject()") {
  JsonDocument doc;

  SECTION("createNestedObject()") {
    JsonObject object = doc.createNestedObject();
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "[{\"hello\":\"world\"}]");
  }

  SECTION("createNestedObject(const char*)") {
    JsonObject object = doc.createNestedObject("key");
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }

  SECTION("createNestedObject(std::string)") {
    JsonObject object = doc.createNestedObject("key"_s);
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("createNestedObject(VLA)") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "key");
    JsonObject object = doc.createNestedObject(vla);
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }
#endif
}

TEST_CASE("JsonArray::createNestedObject()") {
  JsonDocument doc;
  JsonArray array = doc.to<JsonArray>();
  JsonObject object = array.createNestedObject();
  object["hello"] = "world";
  REQUIRE(doc.as<std::string>() == "[{\"hello\":\"world\"}]");
}

TEST_CASE("JsonObject::createNestedObject()") {
  JsonDocument doc;
  JsonObject object = doc.to<JsonObject>();

  SECTION("createNestedObject(const char*)") {
    JsonObject nestedObject = object.createNestedObject("key");
    nestedObject["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }

  SECTION("createNestedObject(std::string)") {
    JsonObject nestedObject = object.createNestedObject("key"_s);
    nestedObject["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("createNestedObject(VLA)") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "key");
    JsonObject nestedObject = object.createNestedObject(vla);
    nestedObject["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }
#endif
}

TEST_CASE("JsonVariant::createNestedObject()") {
  JsonDocument doc;
  JsonVariant variant = doc.to<JsonVariant>();

  SECTION("createNestedObject()") {
    JsonObject object = variant.createNestedObject();
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "[{\"hello\":\"world\"}]");
  }

  SECTION("createNestedObject(const char*)") {
    JsonObject object = variant.createNestedObject("key");
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }

  SECTION("createNestedObject(std::string)") {
    JsonObject object = variant.createNestedObject("key"_s);
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }

#ifdef HAS_VARIABLE_LENGTH_ARRAY
  SECTION("createNestedObject(VLA)") {
    size_t i = 16;
    char vla[i];
    strcpy(vla, "key");
    JsonObject object = variant.createNestedObject(vla);
    object["hello"] = "world";
    REQUIRE(doc.as<std::string>() == "{\"key\":{\"hello\":\"world\"}}");
  }
#endif
}


================================================
FILE: extras/tests/Deprecated/macros.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

TEST_CASE("JSON_ARRAY_SIZE") {
  REQUIRE(JSON_ARRAY_SIZE(10) == ArduinoJson::detail::sizeofArray(10));
}

TEST_CASE("JSON_OBJECT_SIZE") {
  REQUIRE(JSON_OBJECT_SIZE(10) == ArduinoJson::detail::sizeofObject(10));
}

TEST_CASE("JSON_STRING_SIZE") {
  REQUIRE(JSON_STRING_SIZE(10) == 11);  // issue #2054
}


================================================
FILE: extras/tests/Deprecated/memoryUsage.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

TEST_CASE("JsonArray::memoryUsage()") {
  JsonArray array;
  REQUIRE(array.memoryUsage() == 0);
}

TEST_CASE("JsonArrayConst::memoryUsage()") {
  JsonArrayConst array;
  REQUIRE(array.memoryUsage() == 0);
}

TEST_CASE("JsonDocument::memoryUsage()") {
  JsonDocument doc;
  REQUIRE(doc.memoryUsage() == 0);
}

TEST_CASE("JsonObject::memoryUsage()") {
  JsonObject array;
  REQUIRE(array.memoryUsage() == 0);
}

TEST_CASE("JsonObjectConst::memoryUsage()") {
  JsonObjectConst array;
  REQUIRE(array.memoryUsage() == 0);
}

TEST_CASE("JsonVariant::memoryUsage()") {
  JsonVariant doc;
  REQUIRE(doc.memoryUsage() == 0);
}

TEST_CASE("JsonVariantConst::memoryUsage()") {
  JsonVariantConst doc;
  REQUIRE(doc.memoryUsage() == 0);
}

TEST_CASE("ElementProxy::memoryUsage()") {
  JsonDocument doc;
  REQUIRE(doc[0].memoryUsage() == 0);
}

TEST_CASE("MemberProxy::memoryUsage()") {
  JsonDocument doc;
  REQUIRE(doc["hello"].memoryUsage() == 0);
}


================================================
FILE: extras/tests/Deprecated/shallowCopy.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

TEST_CASE("shallowCopy()") {
  JsonDocument doc1, doc2;
  doc1["b"] = "c";
  doc2["a"].shallowCopy(doc1);

  REQUIRE(doc2.as<std::string>() == "{\"a\":{\"b\":\"c\"}}");
}


================================================
FILE: extras/tests/FailingBuilds/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

macro(add_failing_build source_file)
	get_filename_component(target ${source_file} NAME_WE)

	add_executable(${target} ${source_file})

	set_target_properties(${target}
		PROPERTIES
			EXCLUDE_FROM_ALL TRUE
			EXCLUDE_FROM_DEFAULT_BUILD TRUE
	)
	add_test(
		NAME ${target}
			COMMAND ${CMAKE_COMMAND} --build . --target ${target} --config $<CONFIGURATION>
			WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
	)
	set_tests_properties(${target}
		PROPERTIES
			WILL_FAIL TRUE
			LABELS "WillFail"
	)
endmacro()

add_failing_build(Issue978.cpp)
add_failing_build(read_long_long.cpp)
add_failing_build(write_long_long.cpp)
add_failing_build(variant_as_char.cpp)
add_failing_build(assign_char.cpp)
add_failing_build(deserialize_object.cpp)


================================================
FILE: extras/tests/FailingBuilds/Issue978.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>

struct Stream {};

int main() {
  Stream* stream = 0;
  JsonDocument doc;
  deserializeJson(doc, stream);
}


================================================
FILE: extras/tests/FailingBuilds/assign_char.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>

// See issue #1498

int main() {
  JsonDocument doc;
  doc["dummy"] = 'A';
}


================================================
FILE: extras/tests/FailingBuilds/deserialize_object.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>

// See issue #2135

int main() {
  JsonObject obj;
  deserializeJson(obj, "");
}


================================================
FILE: extras/tests/FailingBuilds/read_long_long.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#define ARDUINOJSON_USE_LONG_LONG 0
#include <ArduinoJson.h>

#if defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ >= 8
#  error This test requires sizeof(long) < 8
#endif

ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(long long)
int main() {
  JsonDocument doc;
  doc["dummy"].as<long long>();
}


================================================
FILE: extras/tests/FailingBuilds/variant_as_char.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>

// See issue #1498

int main() {
  JsonDocument doc;
  doc["dummy"].as<char>();
}


================================================
FILE: extras/tests/FailingBuilds/write_long_long.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#define ARDUINOJSON_USE_LONG_LONG 0
#include <ArduinoJson.h>

#if defined(__SIZEOF_LONG__) && __SIZEOF_LONG__ >= 8
#  error This test requires sizeof(long) < 8
#endif

int main() {
  JsonDocument doc;
  doc["dummy"] = static_cast<long long>(42);
}


================================================
FILE: extras/tests/Helpers/Allocators.hpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include <ArduinoJson/Memory/Allocator.hpp>
#include <ArduinoJson/Memory/MemoryPool.hpp>
#include <ArduinoJson/Memory/StringBuilder.hpp>

#include <sstream>

namespace {

struct FailingAllocator : ArduinoJson::Allocator {
  static FailingAllocator* instance() {
    static FailingAllocator allocator;
    return &allocator;
  }

 private:
  FailingAllocator() = default;
  ~FailingAllocator() = default;

  void* allocate(size_t) override {
    return nullptr;
  }

  void deallocate(void*) override {}

  void* reallocate(void*, size_t) override {
    return nullptr;
  }
};

class AllocatorLogEntry {
 public:
  AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}

  const std::string& str() const {
    return str_;
  }

  size_t count() const {
    return count_;
  }

  AllocatorLogEntry operator*(size_t n) const {
    return AllocatorLogEntry(str_, n);
  }

 private:
  std::string str_;
  size_t count_;
};

inline AllocatorLogEntry Allocate(size_t s) {
  char buffer[32];
  snprintf(buffer, sizeof(buffer), "allocate(%zu)", s);
  return AllocatorLogEntry(buffer);
}

inline AllocatorLogEntry AllocateFail(size_t s) {
  char buffer[32];
  snprintf(buffer, sizeof(buffer), "allocate(%zu) -> nullptr", s);
  return AllocatorLogEntry(buffer);
}

inline AllocatorLogEntry Reallocate(size_t s1, size_t s2) {
  char buffer[32];
  snprintf(buffer, sizeof(buffer), "reallocate(%zu, %zu)", s1, s2);
  return AllocatorLogEntry(buffer);
}

inline AllocatorLogEntry ReallocateFail(size_t s1, size_t s2) {
  char buffer[32];
  snprintf(buffer, sizeof(buffer), "reallocate(%zu, %zu) -> nullptr", s1, s2);
  return AllocatorLogEntry(buffer);
}

inline AllocatorLogEntry Deallocate(size_t s) {
  char buffer[32];
  snprintf(buffer, sizeof(buffer), "deallocate(%zu)", s);
  return AllocatorLogEntry(buffer);
}

class AllocatorLog {
 public:
  AllocatorLog() = default;
  AllocatorLog(std::initializer_list<AllocatorLogEntry> list) {
    for (auto& entry : list)
      append(entry);
  }

  void clear() {
    log_.str("");
  }

  void append(const AllocatorLogEntry& entry) {
    for (size_t i = 0; i < entry.count(); i++)
      log_ << entry.str() << "\n";
  }

  std::string str() const {
    auto s = log_.str();
    if (s.empty())
      return "(empty)";
    s.pop_back();  // remove the trailing '\n'
    return s;
  }

  bool operator==(const AllocatorLog& other) const {
    return str() == other.str();
  }

  friend std::ostream& operator<<(std::ostream& os, const AllocatorLog& log) {
    os << log.str();
    return os;
  }

 private:
  std::ostringstream log_;
};

class SpyingAllocator : public ArduinoJson::Allocator {
 public:
  SpyingAllocator(
      Allocator* upstream = ArduinoJson::detail::DefaultAllocator::instance())
      : upstream_(upstream) {}
  virtual ~SpyingAllocator() {}

  size_t allocatedBytes() const {
    return allocatedBytes_;
  }

  void* allocate(size_t n) override {
    auto block = reinterpret_cast<AllocatedBlock*>(
        upstream_->allocate(sizeof(AllocatedBlock) + n - 1));
    if (block) {
      log_.append(Allocate(n));
      allocatedBytes_ += n;
      block->size = n;
      return block->payload;
    } else {
      log_.append(AllocateFail(n));
      return nullptr;
    }
  }

  void deallocate(void* p) override {
    auto block = AllocatedBlock::fromPayload(p);
    allocatedBytes_ -= block->size;
    log_.append(Deallocate(block ? block->size : 0));
    upstream_->deallocate(block);
  }

  void* reallocate(void* p, size_t n) override {
    auto block = AllocatedBlock::fromPayload(p);
    auto oldSize = block ? block->size : 0;
    block = reinterpret_cast<AllocatedBlock*>(
        upstream_->reallocate(block, sizeof(AllocatedBlock) + n - 1));
    if (block) {
      log_.append(Reallocate(oldSize, n));
      block->size = n;
      allocatedBytes_ += n - oldSize;
      return block->payload;
    } else {
      log_.append(ReallocateFail(oldSize, n));
      return nullptr;
    }
  }

  void clearLog() {
    log_.clear();
  }

  const AllocatorLog& log() const {
    return log_;
  }

 private:
  struct AllocatedBlock {
    size_t size;
    char payload[1];

    static AllocatedBlock* fromPayload(void* p) {
      if (!p)
        return nullptr;
      return reinterpret_cast<AllocatedBlock*>(
          // Cast to void* to silence "cast increases required alignment of
          // target type [-Werror=cast-align]"
          reinterpret_cast<void*>(reinterpret_cast<char*>(p) -
                                  offsetof(AllocatedBlock, payload)));
    }
  };

  AllocatorLog log_;
  Allocator* upstream_;
  size_t allocatedBytes_ = 0;
};

class KillswitchAllocator : public ArduinoJson::Allocator {
 public:
  KillswitchAllocator(
      Allocator* upstream = ArduinoJson::detail::DefaultAllocator::instance())
      : working_(true), upstream_(upstream) {}
  virtual ~KillswitchAllocator() {}

  void* allocate(size_t n) override {
    return working_ ? upstream_->allocate(n) : 0;
  }

  void deallocate(void* p) override {
    upstream_->deallocate(p);
  }

  void* reallocate(void* ptr, size_t n) override {
    return working_ ? upstream_->reallocate(ptr, n) : 0;
  }

  // Turn the killswitch on, so all allocation fail
  void on() {
    working_ = false;
  }

 private:
  bool working_;
  Allocator* upstream_;
};

class TimebombAllocator : public ArduinoJson::Allocator {
 public:
  TimebombAllocator(
      size_t initialCountdown,
      Allocator* upstream = ArduinoJson::detail::DefaultAllocator::instance())
      : countdown_(initialCountdown), upstream_(upstream) {}
  virtual ~TimebombAllocator() {}

  void* allocate(size_t n) override {
    if (!countdown_)
      return nullptr;
    countdown_--;
    return upstream_->allocate(n);
  }

  void deallocate(void* p) override {
    upstream_->deallocate(p);
  }

  void* reallocate(void* ptr, size_t n) override {
    if (!countdown_)
      return nullptr;
    countdown_--;
    return upstream_->reallocate(ptr, n);
  }

  void setCountdown(size_t value) {
    countdown_ = value;
  }

 private:
  size_t countdown_ = 0;
  Allocator* upstream_;
};
}  // namespace

inline size_t sizeofPoolList(size_t n = ARDUINOJSON_INITIAL_POOL_COUNT) {
  using namespace ArduinoJson::detail;
  return sizeof(MemoryPool<VariantData>) * n;
}

template <typename T = ArduinoJson::detail::VariantData>
inline size_t sizeofPool(
    ArduinoJson::detail::SlotCount n = ARDUINOJSON_POOL_CAPACITY) {
  return ArduinoJson::detail::MemoryPool<T>::slotsToBytes(n);
}

inline size_t sizeofStringBuffer(size_t iteration = 1) {
  // returns 31, 63, 127, 255, etc.
  auto capacity = ArduinoJson::detail::StringBuilder::initialCapacity;
  for (size_t i = 1; i < iteration; i++)
    capacity = capacity * 2 + 1;
  return ArduinoJson::detail::sizeofString(capacity);
}

inline size_t sizeofString(const char* s) {
  return ArduinoJson::detail::sizeofString(strlen(s));
}


================================================
FILE: extras/tests/Helpers/Arduino.h
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include "api/Print.h"
#include "api/Stream.h"
#include "api/String.h"
#include "avr/pgmspace.h"

#define ARDUINO
#define ARDUINO_H_INCLUDED 1


================================================
FILE: extras/tests/Helpers/CustomReader.hpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include <sstream>

class CustomReader {
  std::stringstream stream_;

 public:
  CustomReader(const char* input) : stream_(input) {}
  CustomReader(const CustomReader&) = delete;

  int read() {
    return stream_.get();
  }

  size_t readBytes(char* buffer, size_t length) {
    stream_.read(buffer, static_cast<std::streamsize>(length));
    return static_cast<size_t>(stream_.gcount());
  }
};


================================================
FILE: extras/tests/Helpers/Literals.hpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include <string>

// the space before _s is required by GCC 4.8
inline std::string operator"" _s(const char* str, size_t len) {
  return std::string(str, len);
}


================================================
FILE: extras/tests/Helpers/api/Print.h
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include <stdint.h>
#include <stdlib.h>
#include <string.h>

class Print {
 public:
  virtual ~Print() {}

  virtual size_t write(uint8_t) = 0;
  virtual size_t write(const uint8_t* buffer, size_t size) = 0;

  size_t write(const char* str) {
    if (!str)
      return 0;
    return write(reinterpret_cast<const uint8_t*>(str), strlen(str));
  }

  size_t write(const char* buffer, size_t size) {
    return write(reinterpret_cast<const uint8_t*>(buffer), size);
  }
};

class Printable {
 public:
  virtual ~Printable() {}
  virtual size_t printTo(Print& p) const = 0;
};


================================================
FILE: extras/tests/Helpers/api/Stream.h
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

// Reproduces Arduino's Stream class
class Stream  // : public Print
{
 public:
  virtual ~Stream() {}
  virtual int read() = 0;
  virtual size_t readBytes(char* buffer, size_t length) = 0;
};


================================================
FILE: extras/tests/Helpers/api/String.h
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include <string>

// Reproduces Arduino's String class
class String {
 public:
  String() = default;
  String(const char* s) {
    if (s)
      str_.assign(s);
  }

  void limitCapacityTo(size_t maxCapacity) {
    maxCapacity_ = maxCapacity;
  }

  unsigned char concat(const char* s) {
    return concat(s, strlen(s));
  }

  size_t length() const {
    return str_.size();
  }

  const char* c_str() const {
    return str_.c_str();
  }

  bool operator==(const char* s) const {
    return str_ == s;
  }

  String& operator=(const char* s) {
    if (s)
      str_.assign(s);
    else
      str_.clear();
    return *this;
  }

  char operator[](unsigned int index) const {
    if (index >= str_.size())
      return 0;
    return str_[index];
  }

  friend std::ostream& operator<<(std::ostream& lhs, const ::String& rhs) {
    lhs << rhs.str_;
    return lhs;
  }

 protected:
  // This function is protected in most Arduino cores
  unsigned char concat(const char* s, size_t n) {
    if (str_.size() + n > maxCapacity_)
      return 0;
    str_.append(s, n);
    return 1;
  }

 private:
  std::string str_;
  size_t maxCapacity_ = 1024;
};

class StringSumHelper : public ::String {};

inline bool operator==(const std::string& lhs, const ::String& rhs) {
  return lhs == rhs.c_str();
}


================================================
FILE: extras/tests/Helpers/avr/pgmspace.h
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#pragma once

#include <stdint.h>  // uint8_t

#define PROGMEM

class __FlashStringHelper;

inline const void* convertPtrToFlash(const void* s) {
  return reinterpret_cast<const char*>(s) + 42;
}

inline const void* convertFlashToPtr(const void* s) {
  return reinterpret_cast<const char*>(s) - 42;
}

#define PSTR(X) reinterpret_cast<const char*>(convertPtrToFlash(X))
#define F(X) reinterpret_cast<const __FlashStringHelper*>(PSTR(X))

inline uint8_t pgm_read_byte(const void* p) {
  return *reinterpret_cast<const uint8_t*>(convertFlashToPtr(p));
}

#define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, ...)                \
  static type const ARDUINOJSON_CONCAT2(name, _progmem)[] = __VA_ARGS__; \
  static type const* name = reinterpret_cast<type const*>(               \
      convertPtrToFlash(ARDUINOJSON_CONCAT2(name, _progmem)));


================================================
FILE: extras/tests/IntegrationTests/CMakeLists.txt
================================================
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2025, Benoit BLANCHON
# MIT License

add_executable(IntegrationTests
	gbathree.cpp
	issue772.cpp
	round_trip.cpp
	openweathermap.cpp
)

if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6)
	target_compile_options(IntegrationTests
		PUBLIC
			-fsingle-precision-constant # issue 544
	)
endif()

add_test(IntegrationTests IntegrationTests)

set_tests_properties(IntegrationTests
	PROPERTIES
		LABELS "Catch"
)


================================================
FILE: extras/tests/IntegrationTests/gbathree.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

TEST_CASE("Gbathree") {
  JsonDocument doc;

  DeserializationError error = deserializeJson(
      doc,
      "{\"protocol_name\":\"fluorescence\",\"repeats\":1,\"wait\":0,"
      "\"averages\":1,\"measurements\":3,\"meas2_light\":15,\"meas1_"
      "baseline\":0,\"act_light\":20,\"pulsesize\":25,\"pulsedistance\":"
      "10000,\"actintensity1\":50,\"actintensity2\":255,\"measintensity\":"
      "255,\"calintensity\":255,\"pulses\":[50,50,50],\"act\":[2,1,2,2],"
      "\"red\":[2,2,2,2],\"detectors\":[[34,34,34,34],[34,34,34,34],[34,"
      "34,34,34],[34,34,34,34]],\"alta\":[2,2,2,2],\"altb\":[2,2,2,2],"
      "\"measlights\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,"
      "15,15]],\"measlights2\":[[15,15,15,15],[15,15,15,15],[15,15,15,15],"
      "[15,15,15,15]],\"altc\":[2,2,2,2],\"altd\":[2,2,2,2]}");
  JsonObject root = doc.as<JsonObject>();

  SECTION("Success") {
    REQUIRE(error == DeserializationError::Ok);
  }

  SECTION("ProtocolName") {
    REQUIRE("fluorescence" == root["protocol_name"]);
  }

  SECTION("Repeats") {
    REQUIRE(1 == root["repeats"]);
  }

  SECTION("Wait") {
    REQUIRE(0 == root["wait"]);
  }

  SECTION("Measurements") {
    REQUIRE(3 == root["measurements"]);
  }

  SECTION("Meas2_Light") {
    REQUIRE(15 == root["meas2_light"]);
  }

  SECTION("Meas1_Baseline") {
    REQUIRE(0 == root["meas1_baseline"]);
  }

  SECTION("Act_Light") {
    REQUIRE(20 == root["act_light"]);
  }

  SECTION("Pulsesize") {
    REQUIRE(25 == root["pulsesize"]);
  }

  SECTION("Pulsedistance") {
    REQUIRE(10000 == root["pulsedistance"]);
  }

  SECTION("Actintensity1") {
    REQUIRE(50 == root["actintensity1"]);
  }

  SECTION("Actintensity2") {
    REQUIRE(255 == root["actintensity2"]);
  }

  SECTION("Measintensity") {
    REQUIRE(255 == root["measintensity"]);
  }

  SECTION("Calintensity") {
    REQUIRE(255 == root["calintensity"]);
  }

  SECTION("Pulses") {
    // "pulses":[50,50,50]

    JsonArray array = root["pulses"];
    REQUIRE(array.isNull() == false);

    REQUIRE(3 == array.size());

    for (size_t i = 0; i < 3; i++) {
      REQUIRE(50 == array[i]);
    }
  }

  SECTION("Act") {
    // "act":[2,1,2,2]

    JsonArray array = root["act"];
    REQUIRE(array.isNull() == false);

    REQUIRE(4 == array.size());
    REQUIRE(2 == array[0]);
    REQUIRE(1 == array[1]);
    REQUIRE(2 == array[2]);
    REQUIRE(2 == array[3]);
  }

  SECTION("Detectors") {
    // "detectors":[[34,34,34,34],[34,34,34,34],[34,34,34,34],[34,34,34,34]]

    JsonArray array = root["detectors"];
    REQUIRE(array.isNull() == false);
    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      JsonArray nestedArray = array[i];
      REQUIRE(4 == nestedArray.size());

      for (size_t j = 0; j < 4; j++) {
        REQUIRE(34 == nestedArray[j]);
      }
    }
  }

  SECTION("Alta") {
    // alta:[2,2,2,2]

    JsonArray array = root["alta"];
    REQUIRE(array.isNull() == false);

    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      REQUIRE(2 == array[i]);
    }
  }

  SECTION("Altb") {
    // altb:[2,2,2,2]

    JsonArray array = root["altb"];
    REQUIRE(array.isNull() == false);

    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      REQUIRE(2 == array[i]);
    }
  }

  SECTION("Measlights") {
    // "measlights":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]

    JsonArray array = root["measlights"];
    REQUIRE(array.isNull() == false);
    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      JsonArray nestedArray = array[i];

      REQUIRE(4 == nestedArray.size());

      for (size_t j = 0; j < 4; j++) {
        REQUIRE(15 == nestedArray[j]);
      }
    }
  }

  SECTION("Measlights2") {
    // "measlights2":[[15,15,15,15],[15,15,15,15],[15,15,15,15],[15,15,15,15]]

    JsonArray array = root["measlights2"];
    REQUIRE(array.isNull() == false);
    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      JsonArray nestedArray = array[i];
      REQUIRE(4 == nestedArray.size());

      for (size_t j = 0; j < 4; j++) {
        REQUIRE(15 == nestedArray[j]);
      }
    }
  }

  SECTION("Altc") {
    // altc:[2,2,2,2]

    JsonArray array = root["altc"];
    REQUIRE(array.isNull() == false);

    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      REQUIRE(2 == array[i]);
    }
  }

  SECTION("Altd") {
    // altd:[2,2,2,2]

    JsonArray array = root["altd"];
    REQUIRE(array.isNull() == false);

    REQUIRE(4 == array.size());

    for (size_t i = 0; i < 4; i++) {
      REQUIRE(2 == array[i]);
    }
  }
}


================================================
FILE: extras/tests/IntegrationTests/issue772.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

// https://github.com/bblanchon/ArduinoJson/issues/772

TEST_CASE("Issue772") {
  JsonDocument doc1;
  JsonDocument doc2;
  DeserializationError err;
  std::string data =
      "{\"state\":{\"reported\":{\"timestamp\":\"2018-07-02T09:40:12Z\","
      "\"mac\":\"2C3AE84FC076\",\"firmwareVersion\":\"v0.2.7-5-gf4d4d78\","
      "\"visibleLight\":261,\"infraRed\":255,\"ultraViolet\":0.02,"
      "\"Temperature\":26.63,\"Pressure\":101145.7,\"Humidity\":54.79883,"
      "\"Vbat\":4.171261,\"soilMoisture\":0,\"ActB\":0}}}";
  err = deserializeJson(doc1, data);
  REQUIRE(err == DeserializationError::Ok);

  data = "";
  serializeMsgPack(doc1, data);
  err = deserializeMsgPack(doc2, data);

  REQUIRE(err == DeserializationError::Ok);
}


================================================
FILE: extras/tests/IntegrationTests/openweathermap.cpp
================================================
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2025, Benoit BLANCHON
// MIT License

#include <ArduinoJson.h>
#include <catch.hpp>

TEST_CASE("OpenWeatherMap") {
  // clang-format off
  const char* input_json = "{\"cod\":\"200\",\"message\":0,\"cnt\":40,\"list\":[{\"dt\":1581498000,\"main\":{\"temp\":3.23,\"feels_like\":-3.63,\"temp_min\":3.23,\"temp_max\":4.62,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1010,\"humidity\":58,\"temp_kf\":-1.39},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":6.19,\"deg\":266},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 09:00:00\"},{\"dt\":1581508800,\"main\":{\"temp\":6.09,\"feels_like\":-1.07,\"temp_min\":6.09,\"temp_max\":7.13,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1011,\"humidity\":48,\"temp_kf\":-1.04},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],\"clouds\":{\"all\":9},\"wind\":{\"speed\":6.64,\"deg\":268},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 12:00:00\"},{\"dt\":1581519600,\"main\":{\"temp\":6.82,\"feels_like\":0.47,\"temp_min\":6.82,\"temp_max\":7.52,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1011,\"humidity\":47,\"temp_kf\":-0.7},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":97},\"wind\":{\"speed\":5.55,\"deg\":267},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-12 15:00:00\"},{\"dt\":1581530400,\"main\":{\"temp\":5.76,\"feels_like\":1.84,\"temp_min\":5.76,\"temp_max\":6.11,\"pressure\":1015,\"sea_level\":1015,\"grnd_level\":1010,\"humidity\":57,\"temp_kf\":-0.35},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":99},\"wind\":{\"speed\":2.35,\"deg\":232},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-12 18:00:00\"},{\"dt\":1581541200,\"main\":{\"temp\":5.7,\"feels_like\":1.34,\"temp_min\":5.7,\"temp_max\":5.7,\"pressure\":1012,\"sea_level\":1012,\"grnd_level\":1008,\"humidity\":71,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.57,\"deg\":198},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-12 21:00:00\"},{\"dt\":1581552000,\"main\":{\"temp\":5.82,\"feels_like\":1.39,\"temp_min\":5.82,\"temp_max\":5.82,\"pressure\":1009,\"sea_level\":1009,\"grnd_level\":1004,\"humidity\":86,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.35,\"deg\":169},\"rain\":{\"3h\":0.5},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-13 00:00:00\"},{\"dt\":1581562800,\"main\":{\"temp\":5.9,\"feels_like\":-0.85,\"temp_min\":5.9,\"temp_max\":5.9,\"pressure\":1000,\"sea_level\":1000,\"grnd_level\":997,\"humidity\":86,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":7.69,\"deg\":178},\"rain\":{\"3h\":1.75},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-13 03:00:00\"},{\"dt\":1581573600,\"main\":{\"temp\":7.52,\"feels_like\":1.74,\"temp_min\":7.52,\"temp_max\":7.52,\"pressure\":993,\"sea_level\":993,\"grnd_level\":988,\"humidity\":88,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":6.84,\"deg\":184},\"rain\":{\"3h\":7.06},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-13 06:00:00\"},{\"dt\":1581584400,\"main\":{\"temp\":7.23,\"feels_like\":0.81,\"temp_min\":7.23,\"temp_max\":7.23,\"pressure\":992,\"sea_level\":992,\"grnd_level\":988,\"humidity\":69,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":49},\"wind\":{\"speed\":6.77,\"deg\":239},\"rain\":{\"3h\":0.25},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-13 09:00:00\"},{\"dt\":1581595200,\"main\":{\"temp\":7.67,\"feels_like\":2.81,\"temp_min\":7.67,\"temp_max\":7.67,\"pressure\":991,\"sea_level\":991,\"grnd_level\":987,\"humidity\":75,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":73},\"wind\":{\"speed\":4.93,\"deg\":235},\"rain\":{\"3h\":0.75},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-13 12:00:00\"},{\"dt\":1581606000,\"main\":{\"temp\":8.83,\"feels_like\":3.23,\"temp_min\":8.83,\"temp_max\":8.83,\"pressure\":993,\"sea_level\":993,\"grnd_level\":990,\"humidity\":64,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":83},\"wind\":{\"speed\":5.7,\"deg\":293},\"rain\":{\"3h\":0.38},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-13 15:00:00\"},{\"dt\":1581616800,\"main\":{\"temp\":7.42,\"feels_like\":1.77,\"temp_min\":7.42,\"temp_max\":7.42,\"pressure\":1000,\"sea_level\":1000,\"grnd_level\":996,\"humidity\":71,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":54},\"wind\":{\"speed\":5.81,\"deg\":307},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-13 18:00:00\"},{\"dt\":1581627600,\"main\":{\"temp\":5.82,\"feels_like\":0.89,\"temp_min\":5.82,\"temp_max\":5.82,\"pressure\":1007,\"sea_level\":1007,\"grnd_level\":1003,\"humidity\":79,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":6},\"wind\":{\"speed\":4.76,\"deg\":300},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-13 21:00:00\"},{\"dt\":1581638400,\"main\":{\"temp\":5.58,\"feels_like\":2.09,\"temp_min\":5.58,\"temp_max\":5.58,\"pressure\":1011,\"sea_level\":1011,\"grnd_level\":1007,\"humidity\":81,\"temp_kf\":0},\"weather\":[{\"id\":802,\"main\":\"Clouds\",\"description\":\"scattered clouds\",\"icon\":\"03n\"}],\"clouds\":{\"all\":47},\"wind\":{\"speed\":2.73,\"deg\":326},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-14 00:00:00\"},{\"dt\":1581649200,\"main\":{\"temp\":4.27,\"feels_like\":1.72,\"temp_min\":4.27,\"temp_max\":4.27,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1010,\"humidity\":85,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":69},\"wind\":{\"speed\":1.24,\"deg\":295},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-14 03:00:00\"},{\"dt\":1581660000,\"main\":{\"temp\":3.91,\"feels_like\":1.54,\"temp_min\":3.91,\"temp_max\":3.91,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1012,\"humidity\":87,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":85},\"wind\":{\"speed\":0.98,\"deg\":211},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-14 06:00:00\"},{\"dt\":1581670800,\"main\":{\"temp\":4.77,\"feels_like\":0.74,\"temp_min\":4.77,\"temp_max\":4.77,\"pressure\":1017,\"sea_level\":1017,\"grnd_level\":1013,\"humidity\":78,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.19,\"deg\":184},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-14 09:00:00\"},{\"dt\":1581681600,\"main\":{\"temp\":9.03,\"feels_like\":4,\"temp_min\":9.03,\"temp_max\":9.03,\"pressure\":1016,\"sea_level\":1016,\"grnd_level\":1012,\"humidity\":73,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.43,\"deg\":206},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-14 12:00:00\"},{\"dt\":1581692400,\"main\":{\"temp\":9.86,\"feels_like\":4.22,\"temp_min\":9.86,\"temp_max\":9.86,\"pressure\":1014,\"sea_level\":1014,\"grnd_level\":1010,\"humidity\":74,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":6.58,\"deg\":209},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-14 15:00:00\"},{\"dt\":1581703200,\"main\":{\"temp\":9.48,\"feels_like\":4.8,\"temp_min\":9.48,\"temp_max\":9.48,\"pressure\":1013,\"sea_level\":1013,\"grnd_level\":1009,\"humidity\":83,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.6,\"deg\":206},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-14 18:00:00\"},{\"dt\":1581714000,\"main\":{\"temp\":10.03,\"feels_like\":6.48,\"temp_min\":10.03,\"temp_max\":10.03,\"pressure\":1013,\"sea_level\":1013,\"grnd_level\":1009,\"humidity\":93,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":4.75,\"deg\":226},\"rain\":{\"3h\":3.13},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-14 21:00:00\"},{\"dt\":1581724800,\"main\":{\"temp\":9.48,\"feels_like\":6.25,\"temp_min\":9.48,\"temp_max\":9.48,\"pressure\":1013,\"sea_level\":1013,\"grnd_level\":1009,\"humidity\":89,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":3.87,\"deg\":214},\"rain\":{\"3h\":2.38},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-15 00:00:00\"},{\"dt\":1581735600,\"main\":{\"temp\":9.12,\"feels_like\":7.08,\"temp_min\":9.12,\"temp_max\":9.12,\"pressure\":1011,\"sea_level\":1011,\"grnd_level\":1007,\"humidity\":96,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":2.43,\"deg\":194},\"rain\":{\"3h\":1},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-15 03:00:00\"},{\"dt\":1581746400,\"main\":{\"temp\":10.32,\"feels_like\":6.71,\"temp_min\":10.32,\"temp_max\":10.32,\"pressure\":1009,\"sea_level\":1009,\"grnd_level\":1004,\"humidity\":95,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":5.05,\"deg\":196},\"rain\":{\"3h\":1.75},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-15 06:00:00\"},{\"dt\":1581757200,\"main\":{\"temp\":11.57,\"feels_like\":5.85,\"temp_min\":11.57,\"temp_max\":11.57,\"pressure\":1006,\"sea_level\":1006,\"grnd_level\":1002,\"humidity\":85,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":7.91,\"deg\":205},\"rain\":{\"3h\":1.44},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-15 09:00:00\"},{\"dt\":1581768000,\"main\":{\"temp\":12.25,\"feels_like\":4.46,\"temp_min\":12.25,\"temp_max\":12.25,\"pressure\":1003,\"sea_level\":1003,\"grnd_level\":998,\"humidity\":78,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":10.65,\"deg\":201},\"rain\":{\"3h\":1.81},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-15 12:00:00\"},{\"dt\":1581778800,\"main\":{\"temp\":12.19,\"feels_like\":3.17,\"temp_min\":12.19,\"temp_max\":12.19,\"pressure\":998,\"sea_level\":998,\"grnd_level\":994,\"humidity\":80,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":12.52,\"deg\":204},\"rain\":{\"3h\":3.5},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-15 15:00:00\"},{\"dt\":1581789600,\"main\":{\"temp\":12.25,\"feels_like\":4.15,\"temp_min\":12.25,\"temp_max\":12.25,\"pressure\":996,\"sea_level\":996,\"grnd_level\":992,\"humidity\":83,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":11.42,\"deg\":215},\"rain\":{\"3h\":4.88},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-15 18:00:00\"},{\"dt\":1581800400,\"main\":{\"temp\":12.64,\"feels_like\":5.85,\"temp_min\":12.64,\"temp_max\":12.64,\"pressure\":994,\"sea_level\":994,\"grnd_level\":990,\"humidity\":76,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":9.22,\"deg\":217},\"rain\":{\"3h\":6.88},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-15 21:00:00\"},{\"dt\":1581811200,\"main\":{\"temp\":12.96,\"feels_like\":4.03,\"temp_min\":12.96,\"temp_max\":12.96,\"pressure\":988,\"sea_level\":988,\"grnd_level\":984,\"humidity\":83,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":12.88,\"deg\":211},\"rain\":{\"3h\":5.63},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-16 00:00:00\"},{\"dt\":1581822000,\"main\":{\"temp\":13.13,\"feels_like\":5.17,\"temp_min\":13.13,\"temp_max\":13.13,\"pressure\":987,\"sea_level\":987,\"grnd_level\":982,\"humidity\":82,\"temp_kf\":0},\"weather\":[{\"id\":501,\"main\":\"Rain\",\"description\":\"moderate rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":11.49,\"deg\":246},\"rain\":{\"3h\":7.25},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-16 03:00:00\"},{\"dt\":1581832800,\"main\":{\"temp\":9.07,\"feels_like\":0.79,\"temp_min\":9.07,\"temp_max\":9.07,\"pressure\":990,\"sea_level\":990,\"grnd_level\":986,\"humidity\":75,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10n\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":10.18,\"deg\":255},\"rain\":{\"3h\":2},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-16 06:00:00\"},{\"dt\":1581843600,\"main\":{\"temp\":8.05,\"feels_like\":-0.9,\"temp_min\":8.05,\"temp_max\":8.05,\"pressure\":994,\"sea_level\":994,\"grnd_level\":990,\"humidity\":51,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":100},\"wind\":{\"speed\":9.65,\"deg\":245},\"rain\":{\"3h\":1.19},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-16 09:00:00\"},{\"dt\":1581854400,\"main\":{\"temp\":9.54,\"feels_like\":0.13,\"temp_min\":9.54,\"temp_max\":9.54,\"pressure\":996,\"sea_level\":996,\"grnd_level\":991,\"humidity\":41,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04d\"}],\"clouds\":{\"all\":94},\"wind\":{\"speed\":10.03,\"deg\":243},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-16 12:00:00\"},{\"dt\":1581865200,\"main\":{\"temp\":9.08,\"feels_like\":-0.35,\"temp_min\":9.08,\"temp_max\":9.08,\"pressure\":996,\"sea_level\":996,\"grnd_level\":991,\"humidity\":44,\"temp_kf\":0},\"weather\":[{\"id\":500,\"main\":\"Rain\",\"description\":\"light rain\",\"icon\":\"10d\"}],\"clouds\":{\"all\":89},\"wind\":{\"speed\":10.15,\"deg\":246},\"rain\":{\"3h\":0.25},\"sys\":{\"pod\":\"d\"},\"dt_txt\":\"2020-02-16 15:00:00\"},{\"dt\":1581876000,\"main\":{\"temp\":7.41,\"feels_like\":-1.34,\"temp_min\":7.41,\"temp_max\":7.41,\"pressure\":996,\"sea_level\":996,\"grnd_level\":992,\"humidity\":50,\"temp_kf\":0},\"weather\":[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":94},\"wind\":{\"speed\":9.21,\"deg\":240},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-16 18:00:00\"},{\"dt\":1581886800,\"main\":{\"temp\":6.42,\"feels_like\":-1.7,\"temp_min\":6.42,\"temp_max\":6.42,\"pressure\":997,\"sea_level\":997,\"grnd_level\":993,\"humidity\":58,\"temp_kf\":0},\"weather\":[{\"id\":803,\"main\":\"Clouds\",\"description\":\"broken clouds\",\"icon\":\"04n\"}],\"clouds\":{\"all\":67},\"wind\":{\"speed\":8.52,\"deg\":236},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-16 21:00:00\"},{\"dt\":1581897600,\"main\":{\"temp\":6.03,\"feels_like\":-2.65,\"temp_min\":6.03,\"temp_max\":6.03,\"pressure\":996,\"sea_level\":996,\"grnd_level\":993,\"humidity\":51,\"temp_kf\":0},\"weather\":[{\"id\":802,\"main\":\"Clouds\",\"description\":\"scattered clouds\",\"icon\":\"03n\"}],\"clouds\":{\"all\":38},\"wind\":{\"speed\":8.94,\"deg\":240},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-17 00:00:00\"},{\"dt\":1581908400,\"main\":{\"temp\":5.62,\"feels_like\":-2.86,\"temp_min\":5.62,\"temp_max\":5.62,\"pressure\":995,\"sea_level\":995,\"grnd_level\":991,\"humidity\":53,\"temp_kf\":0},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01n\"}],\"clouds\":{\"all\":0},\"wind\":{\"speed\":8.67,\"deg\":241},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-17 03:00:00\"},{\"dt\":1581919200,\"main\":{\"temp\":5.51,\"feels_like\":-2.41,\"temp_min\":5.51,\"temp_max\":5.51,\"pressure\":995,\"sea_level\":995,\"grnd_level\":991,\"humidity\":61,\"temp_kf\":0},\"weather\":[{\"id\":802,\"main\":\"Clouds\",\"description\":\"scattered clouds\",\"icon\":\"03n\"}],\"clouds\":{\"all\":35},\"wind\":{\"speed\":8.2,\"deg\":244},\"sys\":{\"pod\":\"n\"},\"dt_txt\":\"2020-02-17 06:00:00\"}],\"city\":{\"id\":2643743,\"name\":\"London\",\"coord\":{\"lat\":51.5085,\"lon\":-0.1257},\"country\":\"GB\",\"population\":1000000,\"timezone\":0,\"sunrise\":1581492085,\"sunset\":1581527294}}";

  const char* expected_json = "{\"list\":["
      "{\"dt\":1581498000,\"main\":{\"temp\":3.23},\"weather\":[{\"description\":\"clear sky\"}]},"
      "{\"dt\":1581508800,\"main\":{\"temp\":6.09},\"weather\":[{\"description\":\"clear sky\"}]},"
      "{\"dt\":1581519600,\"main\":{\"temp\":6.82},\"weather\":[{\"description\":\"overcast clouds\"}]},"
      "{\"dt\":1581530400,\"main\":{\"temp\":5.76},\"weather\":[{\"description\":\"overcast clouds\"}]}
Download .txt
gitextract_077kgy9b/

├── .clang-format
├── .devcontainer/
│   ├── clang10/
│   │   └── devcontainer.json
│   ├── clang11/
│   │   └── devcontainer.json
│   ├── clang13/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang14/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang15/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang16/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang17/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── clang5/
│   │   └── devcontainer.json
│   ├── clang6/
│   │   └── devcontainer.json
│   ├── clang7/
│   │   └── devcontainer.json
│   ├── clang8/
│   │   └── devcontainer.json
│   ├── clang9/
│   │   └── devcontainer.json
│   ├── gcc10/
│   │   └── devcontainer.json
│   ├── gcc11/
│   │   └── devcontainer.json
│   ├── gcc12/
│   │   ├── Dockerfile
│   │   └── devcontainer.json
│   ├── gcc48/
│   │   └── devcontainer.json
│   ├── gcc5/
│   │   └── devcontainer.json
│   ├── gcc6/
│   │   └── devcontainer.json
│   ├── gcc7/
│   │   └── devcontainer.json
│   ├── gcc8/
│   │   └── devcontainer.json
│   └── gcc9/
│       └── devcontainer.json
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── config.yml
│   │   ├── feature_request.md
│   │   └── help.md
│   └── workflows/
│       ├── ci.yml
│       ├── lock.yml
│       └── release.yml
├── .gitignore
├── .mbedignore
├── .prettierignore
├── .vscode/
│   └── settings.json
├── ArduinoJson.h
├── CHANGELOG.md
├── CMakeLists.txt
├── CONTRIBUTING.md
├── LICENSE.txt
├── README.md
├── SUPPORT.md
├── appveyor.yml
├── component.mk
├── examples/
│   ├── JsonConfigFile/
│   │   └── JsonConfigFile.ino
│   ├── JsonFilterExample/
│   │   └── JsonFilterExample.ino
│   ├── JsonGeneratorExample/
│   │   └── JsonGeneratorExample.ino
│   ├── JsonHttpClient/
│   │   └── JsonHttpClient.ino
│   ├── JsonParserExample/
│   │   └── JsonParserExample.ino
│   ├── JsonServer/
│   │   └── JsonServer.ino
│   ├── JsonUdpBeacon/
│   │   └── JsonUdpBeacon.ino
│   ├── MsgPackParser/
│   │   └── MsgPackParser.ino
│   ├── ProgmemExample/
│   │   └── ProgmemExample.ino
│   └── StringExample/
│       └── StringExample.ino
├── extras/
│   ├── ArduinoJsonConfig.cmake.in
│   ├── CompileOptions.cmake
│   ├── ci/
│   │   ├── espidf/
│   │   │   ├── CMakeLists.txt
│   │   │   └── main/
│   │   │       ├── CMakeLists.txt
│   │   │       ├── component.mk
│   │   │       └── main.cpp
│   │   └── particle.sh
│   ├── conf_test/
│   │   ├── avr.cpp
│   │   ├── esp8266.cpp
│   │   ├── x64.cpp
│   │   └── x86.cpp
│   ├── fuzzing/
│   │   ├── CMakeLists.txt
│   │   ├── Makefile
│   │   ├── json_corpus/
│   │   │   └── .gitignore
│   │   ├── json_fuzzer.cpp
│   │   ├── json_seed_corpus/
│   │   │   ├── Comments.json
│   │   │   ├── EmptyArray.json
│   │   │   ├── EmptyObject.json
│   │   │   ├── ExcessiveNesting.json
│   │   │   ├── IntegerOverflow.json
│   │   │   ├── Numbers.json
│   │   │   ├── OpenWeatherMap.json
│   │   │   ├── Strings.json
│   │   │   └── WeatherUnderground.json
│   │   ├── msgpack_corpus/
│   │   │   └── .gitignore
│   │   ├── msgpack_fuzzer.cpp
│   │   ├── msgpack_seed_corpus/
│   │   │   ├── array16
│   │   │   ├── array32
│   │   │   ├── false
│   │   │   ├── fixarray
│   │   │   ├── fixint_negative
│   │   │   ├── fixint_positive
│   │   │   ├── fixmap
│   │   │   ├── fixstr
│   │   │   ├── float32
│   │   │   ├── float64
│   │   │   ├── int16
│   │   │   ├── int32
│   │   │   ├── int64
│   │   │   ├── int8
│   │   │   ├── map16
│   │   │   ├── map32
│   │   │   ├── nil
│   │   │   ├── str16
│   │   │   ├── str32
│   │   │   ├── str8
│   │   │   ├── true
│   │   │   ├── uint16
│   │   │   ├── uint32
│   │   │   ├── uint64
│   │   │   └── uint8
│   │   ├── number_corpus/
│   │   │   └── .gitignore
│   │   ├── number_fuzzer.cpp
│   │   ├── number_seed_corpus/
│   │   │   ├── decimal_half
│   │   │   ├── decimal_one_and_half
│   │   │   ├── infinity
│   │   │   ├── issue2220-1
│   │   │   ├── issue2220-2
│   │   │   ├── large_decimal
│   │   │   ├── large_integer
│   │   │   ├── leading_zeros
│   │   │   ├── nan
│   │   │   ├── negative_decimal
│   │   │   ├── negative_one
│   │   │   ├── negative_scientific
│   │   │   ├── negative_scientific_large_exp
│   │   │   ├── negative_zero
│   │   │   ├── one
│   │   │   ├── pi_approximation
│   │   │   ├── scientific_e10
│   │   │   ├── scientific_e_minus
│   │   │   ├── scientific_e_plus
│   │   │   ├── small_decimal
│   │   │   ├── small_integer
│   │   │   ├── trailing_zeros
│   │   │   ├── very_small_positive
│   │   │   └── zero
│   │   └── reproducer.cpp
│   ├── particle/
│   │   ├── project.properties
│   │   └── src/
│   │       └── smocktest.ino
│   ├── scripts/
│   │   ├── build-single-header.sh
│   │   ├── extract_changes.awk
│   │   ├── get-release-page.sh
│   │   ├── publish-particle-library.sh
│   │   ├── publish.sh
│   │   └── wandbox/
│   │       ├── JsonGeneratorExample.cpp
│   │       ├── JsonParserExample.cpp
│   │       ├── MsgPackParserExample.cpp
│   │       └── publish.sh
│   └── tests/
│       ├── .clang-tidy
│       ├── CMakeLists.txt
│       ├── Cpp17/
│       │   ├── CMakeLists.txt
│       │   └── string_view.cpp
│       ├── Cpp20/
│       │   ├── CMakeLists.txt
│       │   └── smoke_test.cpp
│       ├── Deprecated/
│       │   ├── BasicJsonDocument.cpp
│       │   ├── CMakeLists.txt
│       │   ├── DynamicJsonDocument.cpp
│       │   ├── StaticJsonDocument.cpp
│       │   ├── add.cpp
│       │   ├── containsKey.cpp
│       │   ├── createNestedArray.cpp
│       │   ├── createNestedObject.cpp
│       │   ├── macros.cpp
│       │   ├── memoryUsage.cpp
│       │   └── shallowCopy.cpp
│       ├── FailingBuilds/
│       │   ├── CMakeLists.txt
│       │   ├── Issue978.cpp
│       │   ├── assign_char.cpp
│       │   ├── deserialize_object.cpp
│       │   ├── read_long_long.cpp
│       │   ├── variant_as_char.cpp
│       │   └── write_long_long.cpp
│       ├── Helpers/
│       │   ├── Allocators.hpp
│       │   ├── Arduino.h
│       │   ├── CustomReader.hpp
│       │   ├── Literals.hpp
│       │   ├── api/
│       │   │   ├── Print.h
│       │   │   ├── Stream.h
│       │   │   └── String.h
│       │   └── avr/
│       │       └── pgmspace.h
│       ├── IntegrationTests/
│       │   ├── CMakeLists.txt
│       │   ├── gbathree.cpp
│       │   ├── issue772.cpp
│       │   ├── openweathermap.cpp
│       │   └── round_trip.cpp
│       ├── JsonArray/
│       │   ├── CMakeLists.txt
│       │   ├── add.cpp
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── copyArray.cpp
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── remove.cpp
│       │   ├── size.cpp
│       │   ├── subscript.cpp
│       │   └── unbound.cpp
│       ├── JsonArrayConst/
│       │   ├── CMakeLists.txt
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── size.cpp
│       │   └── subscript.cpp
│       ├── JsonDeserializer/
│       │   ├── CMakeLists.txt
│       │   ├── DeserializationError.cpp
│       │   ├── array.cpp
│       │   ├── destination_types.cpp
│       │   ├── errors.cpp
│       │   ├── filter.cpp
│       │   ├── input_types.cpp
│       │   ├── misc.cpp
│       │   ├── nestingLimit.cpp
│       │   ├── number.cpp
│       │   ├── object.cpp
│       │   └── string.cpp
│       ├── JsonDocument/
│       │   ├── CMakeLists.txt
│       │   ├── ElementProxy.cpp
│       │   ├── MemberProxy.cpp
│       │   ├── add.cpp
│       │   ├── assignment.cpp
│       │   ├── cast.cpp
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── constructor.cpp
│       │   ├── isNull.cpp
│       │   ├── issue1120.cpp
│       │   ├── nesting.cpp
│       │   ├── overflowed.cpp
│       │   ├── remove.cpp
│       │   ├── set.cpp
│       │   ├── shrinkToFit.cpp
│       │   ├── size.cpp
│       │   ├── subscript.cpp
│       │   └── swap.cpp
│       ├── JsonObject/
│       │   ├── CMakeLists.txt
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── remove.cpp
│       │   ├── set.cpp
│       │   ├── size.cpp
│       │   ├── std_string.cpp
│       │   ├── subscript.cpp
│       │   └── unbound.cpp
│       ├── JsonObjectConst/
│       │   ├── CMakeLists.txt
│       │   ├── equals.cpp
│       │   ├── isNull.cpp
│       │   ├── iterator.cpp
│       │   ├── nesting.cpp
│       │   ├── size.cpp
│       │   └── subscript.cpp
│       ├── JsonSerializer/
│       │   ├── CMakeLists.txt
│       │   ├── CustomWriter.cpp
│       │   ├── JsonArray.cpp
│       │   ├── JsonArrayPretty.cpp
│       │   ├── JsonObject.cpp
│       │   ├── JsonObjectPretty.cpp
│       │   ├── JsonVariant.cpp
│       │   ├── misc.cpp
│       │   ├── std_stream.cpp
│       │   └── std_string.cpp
│       ├── JsonVariant/
│       │   ├── CMakeLists.txt
│       │   ├── add.cpp
│       │   ├── as.cpp
│       │   ├── clear.cpp
│       │   ├── compare.cpp
│       │   ├── converters.cpp
│       │   ├── copy.cpp
│       │   ├── is.cpp
│       │   ├── isnull.cpp
│       │   ├── misc.cpp
│       │   ├── nesting.cpp
│       │   ├── nullptr.cpp
│       │   ├── or.cpp
│       │   ├── overflow.cpp
│       │   ├── remove.cpp
│       │   ├── set.cpp
│       │   ├── size.cpp
│       │   ├── stl_containers.cpp
│       │   ├── subscript.cpp
│       │   ├── types.cpp
│       │   └── unbound.cpp
│       ├── JsonVariantConst/
│       │   ├── CMakeLists.txt
│       │   ├── as.cpp
│       │   ├── is.cpp
│       │   ├── isnull.cpp
│       │   ├── nesting.cpp
│       │   ├── size.cpp
│       │   └── subscript.cpp
│       ├── Misc/
│       │   ├── CMakeLists.txt
│       │   ├── JsonString.cpp
│       │   ├── NoArduinoHeader.cpp
│       │   ├── Readers.cpp
│       │   ├── StringAdapters.cpp
│       │   ├── StringWriter.cpp
│       │   ├── TypeTraits.cpp
│       │   ├── Utf16.cpp
│       │   ├── Utf8.cpp
│       │   ├── arithmeticCompare.cpp
│       │   ├── conflicts.cpp
│       │   ├── custom_string.hpp
│       │   ├── issue1967.cpp
│       │   ├── issue2129.cpp
│       │   ├── issue2166.cpp
│       │   ├── issue2181.cpp
│       │   ├── printable.cpp
│       │   ├── unsigned_char.cpp
│       │   ├── version.cpp
│       │   └── weird_strcmp.hpp
│       ├── MixedConfiguration/
│       │   ├── CMakeLists.txt
│       │   ├── decode_unicode_0.cpp
│       │   ├── decode_unicode_1.cpp
│       │   ├── enable_alignment_0.cpp
│       │   ├── enable_alignment_1.cpp
│       │   ├── enable_comments_0.cpp
│       │   ├── enable_comments_1.cpp
│       │   ├── enable_infinity_0.cpp
│       │   ├── enable_infinity_1.cpp
│       │   ├── enable_nan_0.cpp
│       │   ├── enable_nan_1.cpp
│       │   ├── enable_progmem_1.cpp
│       │   ├── issue1707.cpp
│       │   ├── string_length_size_1.cpp
│       │   ├── string_length_size_2.cpp
│       │   ├── string_length_size_4.cpp
│       │   ├── use_double_0.cpp
│       │   ├── use_double_1.cpp
│       │   ├── use_long_long_0.cpp
│       │   └── use_long_long_1.cpp
│       ├── MsgPackDeserializer/
│       │   ├── CMakeLists.txt
│       │   ├── deserializeArray.cpp
│       │   ├── deserializeObject.cpp
│       │   ├── deserializeVariant.cpp
│       │   ├── destination_types.cpp
│       │   ├── doubleToFloat.cpp
│       │   ├── errors.cpp
│       │   ├── filter.cpp
│       │   ├── input_types.cpp
│       │   └── nestingLimit.cpp
│       ├── MsgPackSerializer/
│       │   ├── CMakeLists.txt
│       │   ├── destination_types.cpp
│       │   ├── measure.cpp
│       │   ├── misc.cpp
│       │   ├── serializeArray.cpp
│       │   ├── serializeObject.cpp
│       │   └── serializeVariant.cpp
│       ├── Numbers/
│       │   ├── CMakeLists.txt
│       │   ├── convertNumber.cpp
│       │   ├── decomposeFloat.cpp
│       │   ├── parseDouble.cpp
│       │   ├── parseFloat.cpp
│       │   ├── parseInteger.cpp
│       │   └── parseNumber.cpp
│       ├── ResourceManager/
│       │   ├── CMakeLists.txt
│       │   ├── StringBuffer.cpp
│       │   ├── StringBuilder.cpp
│       │   ├── allocVariant.cpp
│       │   ├── clear.cpp
│       │   ├── saveString.cpp
│       │   ├── shrinkToFit.cpp
│       │   ├── size.cpp
│       │   └── swap.cpp
│       ├── TextFormatter/
│       │   ├── CMakeLists.txt
│       │   ├── writeFloat.cpp
│       │   ├── writeInteger.cpp
│       │   └── writeString.cpp
│       └── catch/
│           ├── .clang-format
│           ├── CMakeLists.txt
│           ├── catch.cpp
│           └── catch.hpp
├── idf_component.yml
├── keywords.txt
├── library.json
├── library.properties
└── src/
    ├── ArduinoJson/
    │   ├── Array/
    │   │   ├── ArrayImpl.hpp
    │   │   ├── ElementProxy.hpp
    │   │   ├── JsonArray.hpp
    │   │   ├── JsonArrayConst.hpp
    │   │   ├── JsonArrayIterator.hpp
    │   │   └── Utilities.hpp
    │   ├── Collection/
    │   │   ├── CollectionImpl.hpp
    │   │   └── CollectionIterator.hpp
    │   ├── Configuration.hpp
    │   ├── Deserialization/
    │   │   ├── DeserializationError.hpp
    │   │   ├── DeserializationOptions.hpp
    │   │   ├── Filter.hpp
    │   │   ├── NestingLimit.hpp
    │   │   ├── Reader.hpp
    │   │   ├── Readers/
    │   │   │   ├── ArduinoStreamReader.hpp
    │   │   │   ├── ArduinoStringReader.hpp
    │   │   │   ├── FlashReader.hpp
    │   │   │   ├── IteratorReader.hpp
    │   │   │   ├── RamReader.hpp
    │   │   │   ├── StdStreamReader.hpp
    │   │   │   └── VariantReader.hpp
    │   │   └── deserialize.hpp
    │   ├── Document/
    │   │   └── JsonDocument.hpp
    │   ├── Json/
    │   │   ├── EscapeSequence.hpp
    │   │   ├── JsonDeserializer.hpp
    │   │   ├── JsonSerializer.hpp
    │   │   ├── Latch.hpp
    │   │   ├── PrettyJsonSerializer.hpp
    │   │   ├── TextFormatter.hpp
    │   │   ├── Utf16.hpp
    │   │   └── Utf8.hpp
    │   ├── Memory/
    │   │   ├── Alignment.hpp
    │   │   ├── Allocator.hpp
    │   │   ├── MemoryPool.hpp
    │   │   ├── MemoryPoolList.hpp
    │   │   ├── ResourceManager.hpp
    │   │   ├── StringBuffer.hpp
    │   │   ├── StringBuilder.hpp
    │   │   ├── StringNode.hpp
    │   │   └── StringPool.hpp
    │   ├── Misc/
    │   │   └── SerializedValue.hpp
    │   ├── MsgPack/
    │   │   ├── MsgPackBinary.hpp
    │   │   ├── MsgPackDeserializer.hpp
    │   │   ├── MsgPackExtension.hpp
    │   │   ├── MsgPackSerializer.hpp
    │   │   ├── endianness.hpp
    │   │   └── ieee754.hpp
    │   ├── Namespace.hpp
    │   ├── Numbers/
    │   │   ├── FloatParts.hpp
    │   │   ├── FloatTraits.hpp
    │   │   ├── JsonFloat.hpp
    │   │   ├── JsonInteger.hpp
    │   │   ├── arithmeticCompare.hpp
    │   │   ├── convertNumber.hpp
    │   │   └── parseNumber.hpp
    │   ├── Object/
    │   │   ├── JsonObject.hpp
    │   │   ├── JsonObjectConst.hpp
    │   │   ├── JsonObjectIterator.hpp
    │   │   ├── JsonPair.hpp
    │   │   ├── MemberProxy.hpp
    │   │   └── ObjectImpl.hpp
    │   ├── Polyfills/
    │   │   ├── alias_cast.hpp
    │   │   ├── assert.hpp
    │   │   ├── attributes.hpp
    │   │   ├── ctype.hpp
    │   │   ├── integer.hpp
    │   │   ├── limits.hpp
    │   │   ├── math.hpp
    │   │   ├── mpl/
    │   │   │   └── max.hpp
    │   │   ├── pgmspace.hpp
    │   │   ├── pgmspace_generic.hpp
    │   │   ├── preprocessor.hpp
    │   │   ├── type_traits/
    │   │   │   ├── conditional.hpp
    │   │   │   ├── decay.hpp
    │   │   │   ├── declval.hpp
    │   │   │   ├── enable_if.hpp
    │   │   │   ├── function_traits.hpp
    │   │   │   ├── integral_constant.hpp
    │   │   │   ├── is_array.hpp
    │   │   │   ├── is_base_of.hpp
    │   │   │   ├── is_class.hpp
    │   │   │   ├── is_const.hpp
    │   │   │   ├── is_convertible.hpp
    │   │   │   ├── is_enum.hpp
    │   │   │   ├── is_floating_point.hpp
    │   │   │   ├── is_integral.hpp
    │   │   │   ├── is_pointer.hpp
    │   │   │   ├── is_same.hpp
    │   │   │   ├── is_signed.hpp
    │   │   │   ├── is_unsigned.hpp
    │   │   │   ├── make_unsigned.hpp
    │   │   │   ├── remove_const.hpp
    │   │   │   ├── remove_cv.hpp
    │   │   │   ├── remove_reference.hpp
    │   │   │   ├── type_identity.hpp
    │   │   │   └── void_t.hpp
    │   │   ├── type_traits.hpp
    │   │   └── utility.hpp
    │   ├── Serialization/
    │   │   ├── CountingDecorator.hpp
    │   │   ├── Writer.hpp
    │   │   ├── Writers/
    │   │   │   ├── ArduinoStringWriter.hpp
    │   │   │   ├── DummyWriter.hpp
    │   │   │   ├── PrintWriter.hpp
    │   │   │   ├── StaticStringWriter.hpp
    │   │   │   ├── StdStreamWriter.hpp
    │   │   │   └── StdStringWriter.hpp
    │   │   ├── measure.hpp
    │   │   └── serialize.hpp
    │   ├── Strings/
    │   │   ├── Adapters/
    │   │   │   ├── FlashString.hpp
    │   │   │   ├── RamString.hpp
    │   │   │   └── StringObject.hpp
    │   │   ├── IsString.hpp
    │   │   ├── JsonString.hpp
    │   │   ├── StringAdapter.hpp
    │   │   ├── StringAdapters.hpp
    │   │   └── StringTraits.hpp
    │   ├── Variant/
    │   │   ├── Converter.hpp
    │   │   ├── ConverterImpl.hpp
    │   │   ├── JsonVariant.hpp
    │   │   ├── JsonVariantConst.hpp
    │   │   ├── JsonVariantCopier.hpp
    │   │   ├── JsonVariantVisitor.hpp
    │   │   ├── VariantAttorney.hpp
    │   │   ├── VariantCompare.hpp
    │   │   ├── VariantContent.hpp
    │   │   ├── VariantData.hpp
    │   │   ├── VariantDataVisitor.hpp
    │   │   ├── VariantImpl.hpp
    │   │   ├── VariantOperators.hpp
    │   │   ├── VariantRefBase.hpp
    │   │   ├── VariantRefBaseImpl.hpp
    │   │   └── VariantTag.hpp
    │   ├── compatibility.hpp
    │   └── version.hpp
    ├── ArduinoJson.h
    ├── ArduinoJson.hpp
    └── CMakeLists.txt
Copy disabled (too large) Download .txt
Showing preview only (376,847K chars total). Download the full file to get everything.
SYMBOL INDEX (2431 symbols across 192 files)

FILE: extras/ci/espidf/main/main.cpp
  function app_main (line 7) | void app_main() {

FILE: extras/conf_test/avr.cpp
  function setup (line 17) | void setup() {}
  function loop (line 18) | void loop() {}

FILE: extras/conf_test/esp8266.cpp
  function setup (line 15) | void setup() {}
  function loop (line 16) | void loop() {}

FILE: extras/conf_test/x64.cpp
  function main (line 15) | int main() {}

FILE: extras/conf_test/x86.cpp
  function main (line 15) | int main() {}

FILE: extras/fuzzing/json_fuzzer.cpp
  function LLVMFuzzerTestOneInput (line 3) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: extras/fuzzing/msgpack_fuzzer.cpp
  function LLVMFuzzerTestOneInput (line 3) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: extras/fuzzing/number_fuzzer.cpp
  function LLVMFuzzerTestOneInput (line 3) | int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {

FILE: extras/fuzzing/reproducer.cpp
  function read (line 16) | std::vector<uint8_t> read(const char* path) {
  function main (line 38) | int main(int argc, const char* argv[]) {

FILE: extras/scripts/wandbox/JsonGeneratorExample.cpp
  function main (line 10) | int main() {

FILE: extras/scripts/wandbox/JsonParserExample.cpp
  function main (line 10) | int main() {

FILE: extras/scripts/wandbox/MsgPackParserExample.cpp
  function main (line 10) | int main() {

FILE: extras/tests/Deprecated/BasicJsonDocument.cpp
  type CustomAllocator (line 14) | struct CustomAllocator {
    method CustomAllocator (line 15) | CustomAllocator() {
    method deallocate (line 24) | void deallocate(void* p) {

FILE: extras/tests/FailingBuilds/Issue978.cpp
  type Stream (line 7) | struct Stream {}
  function main (line 9) | int main() {

FILE: extras/tests/FailingBuilds/assign_char.cpp
  function main (line 9) | int main() {

FILE: extras/tests/FailingBuilds/deserialize_object.cpp
  function main (line 9) | int main() {

FILE: extras/tests/FailingBuilds/read_long_long.cpp
  function main (line 13) | int main() {

FILE: extras/tests/FailingBuilds/variant_as_char.cpp
  function main (line 9) | int main() {

FILE: extras/tests/FailingBuilds/write_long_long.cpp
  function main (line 12) | int main() {

FILE: extras/tests/Helpers/Allocators.hpp
  type FailingAllocator (line 15) | struct FailingAllocator : ArduinoJson::Allocator {
    method FailingAllocator (line 16) | static FailingAllocator* instance() {
    method FailingAllocator (line 22) | FailingAllocator() = default;
    method deallocate (line 29) | void deallocate(void*) override {}
  class AllocatorLogEntry (line 36) | class AllocatorLogEntry {
    method AllocatorLogEntry (line 38) | AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}
    method count (line 44) | size_t count() const {
    method AllocatorLogEntry (line 48) | AllocatorLogEntry operator*(size_t n) const {
  function AllocatorLogEntry (line 57) | inline AllocatorLogEntry Allocate(size_t s) {
    method AllocatorLogEntry (line 38) | AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}
    method count (line 44) | size_t count() const {
    method AllocatorLogEntry (line 48) | AllocatorLogEntry operator*(size_t n) const {
  function AllocatorLogEntry (line 63) | inline AllocatorLogEntry AllocateFail(size_t s) {
    method AllocatorLogEntry (line 38) | AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}
    method count (line 44) | size_t count() const {
    method AllocatorLogEntry (line 48) | AllocatorLogEntry operator*(size_t n) const {
  function AllocatorLogEntry (line 69) | inline AllocatorLogEntry Reallocate(size_t s1, size_t s2) {
    method AllocatorLogEntry (line 38) | AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}
    method count (line 44) | size_t count() const {
    method AllocatorLogEntry (line 48) | AllocatorLogEntry operator*(size_t n) const {
  function AllocatorLogEntry (line 75) | inline AllocatorLogEntry ReallocateFail(size_t s1, size_t s2) {
    method AllocatorLogEntry (line 38) | AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}
    method count (line 44) | size_t count() const {
    method AllocatorLogEntry (line 48) | AllocatorLogEntry operator*(size_t n) const {
  function AllocatorLogEntry (line 81) | inline AllocatorLogEntry Deallocate(size_t s) {
    method AllocatorLogEntry (line 38) | AllocatorLogEntry(std::string s, size_t n = 1) : str_(s), count_(n) {}
    method count (line 44) | size_t count() const {
    method AllocatorLogEntry (line 48) | AllocatorLogEntry operator*(size_t n) const {
  class AllocatorLog (line 87) | class AllocatorLog {
    method AllocatorLog (line 89) | AllocatorLog() = default;
    method AllocatorLog (line 90) | AllocatorLog(std::initializer_list<AllocatorLogEntry> list) {
    method clear (line 95) | void clear() {
    method append (line 99) | void append(const AllocatorLogEntry& entry) {
    method str (line 104) | std::string str() const {
  class SpyingAllocator (line 125) | class SpyingAllocator : public ArduinoJson::Allocator {
    method SpyingAllocator (line 127) | SpyingAllocator(
    method allocatedBytes (line 132) | size_t allocatedBytes() const {
    method deallocate (line 150) | void deallocate(void* p) override {
    method clearLog (line 173) | void clearLog() {
    method AllocatorLog (line 177) | const AllocatorLog& log() const {
    type AllocatedBlock (line 182) | struct AllocatedBlock {
      method AllocatedBlock (line 186) | static AllocatedBlock* fromPayload(void* p) {
  class KillswitchAllocator (line 202) | class KillswitchAllocator : public ArduinoJson::Allocator {
    method KillswitchAllocator (line 204) | KillswitchAllocator(
    method deallocate (line 213) | void deallocate(void* p) override {
    method on (line 222) | void on() {
  class TimebombAllocator (line 231) | class TimebombAllocator : public ArduinoJson::Allocator {
    method TimebombAllocator (line 233) | TimebombAllocator(
    method deallocate (line 246) | void deallocate(void* p) override {
    method setCountdown (line 257) | void setCountdown(size_t value) {
  function sizeofPoolList (line 267) | inline size_t sizeofPoolList(size_t n = ARDUINOJSON_INITIAL_POOL_COUNT) {
  function sizeofPool (line 273) | inline size_t sizeofPool(
  function sizeofStringBuffer (line 278) | inline size_t sizeofStringBuffer(size_t iteration = 1) {
  function sizeofString (line 286) | inline size_t sizeofString(const char* s) {

FILE: extras/tests/Helpers/CustomReader.hpp
  class CustomReader (line 9) | class CustomReader {
    method CustomReader (line 13) | CustomReader(const char* input) : stream_(input) {}
    method CustomReader (line 14) | CustomReader(const CustomReader&) = delete;
    method read (line 16) | int read() {
    method readBytes (line 20) | size_t readBytes(char* buffer, size_t length) {

FILE: extras/tests/Helpers/api/Print.h
  function class (line 11) | class Print {
  function class (line 29) | class Printable {

FILE: extras/tests/Helpers/api/Stream.h
  function class (line 8) | class Stream  // : public Print

FILE: extras/tests/Helpers/api/String.h
  function class (line 10) | class String {
  function const (line 46) | char operator[](unsigned int index) const {
  function class (line 71) | class StringSumHelper : public ::String {}

FILE: extras/tests/Helpers/avr/pgmspace.h
  function pgm_read_byte (line 24) | inline uint8_t pgm_read_byte(const void* p) {

FILE: extras/tests/IntegrationTests/round_trip.cpp
  function check (line 8) | void check(std::string originalJson) {

FILE: extras/tests/JsonDeserializer/DeserializationError.cpp
  function testStringification (line 10) | void testStringification(DeserializationError error, std::string expecte...
  function testBoolification (line 14) | void testBoolification(DeserializationError error, bool expected) {

FILE: extras/tests/JsonDeserializer/errors.cpp
  function SECTION (line 45) | SECTION(input) {
  function SECTION (line 65) | SECTION(input) {
  function SECTION (line 81) | SECTION(input) {

FILE: extras/tests/JsonDeserializer/filter.cpp
  type TestCase (line 19) | struct TestCase {

FILE: extras/tests/JsonDeserializer/number.cpp
  type my (line 13) | namespace my {

FILE: extras/tests/JsonDeserializer/string.cpp
  type TestCase (line 15) | struct TestCase {

FILE: extras/tests/JsonDocument/shrinkToFit.cpp
  class ArmoredAllocator (line 17) | class ArmoredAllocator : public Allocator {
    method deallocate (line 25) | void deallocate(void* ptr) override {

FILE: extras/tests/JsonObject/std_string.cpp
  function eraseString (line 10) | static void eraseString(std::string& str) {

FILE: extras/tests/JsonSerializer/CustomWriter.cpp
  class CustomWriter (line 8) | class CustomWriter {
    method CustomWriter (line 10) | CustomWriter() {}
    method CustomWriter (line 11) | CustomWriter(const CustomWriter&) = delete;
    method CustomWriter (line 12) | CustomWriter& operator=(const CustomWriter&) = delete;
    method write (line 14) | size_t write(uint8_t c) {
    method write (line 19) | size_t write(const uint8_t* s, size_t n) {

FILE: extras/tests/JsonSerializer/JsonArray.cpp
  function check (line 8) | static void check(JsonArray array, std::string expected) {

FILE: extras/tests/JsonSerializer/JsonArrayPretty.cpp
  function checkArray (line 8) | static void checkArray(JsonArray array, std::string expected) {

FILE: extras/tests/JsonSerializer/JsonObject.cpp
  function checkObject (line 9) | static void checkObject(const JsonObject obj, const std::string& expecte...

FILE: extras/tests/JsonSerializer/JsonObjectPretty.cpp
  function checkObjectPretty (line 9) | static void checkObjectPretty(const JsonObject obj,

FILE: extras/tests/JsonSerializer/JsonVariant.cpp
  function check (line 12) | void check(T value, const std::string& expected) {

FILE: extras/tests/JsonVariant/as.cpp
  type my (line 11) | namespace my {
  type MY_ENUM (line 15) | enum MY_ENUM { ONE = 1, TWO = 2 }

FILE: extras/tests/JsonVariant/converters.cpp
  type Date (line 10) | struct Date {
  function convertToJson (line 16) | void convertToJson(const Date& src, JsonVariant dst) {
  function convertFromJson (line 22) | void convertFromJson(JsonVariantConst src, Date& dst) {
  function canConvertFromJson (line 28) | bool canConvertFromJson(JsonVariantConst src, const Date&) {
  class Complex (line 75) | class Complex {
    method Complex (line 77) | explicit Complex(double r, double i) : real_(r), imag_(i) {}
    method real (line 79) | double real() const {
    method imag (line 83) | double imag() const {
  type ArduinoJson (line 91) | namespace ArduinoJson {
    type Converter<Complex> (line 93) | struct Converter<Complex> {
      method toJson (line 94) | static void toJson(const Complex& src, JsonVariant dst) {
      method Complex (line 99) | static Complex fromJson(JsonVariantConst src) {
      method checkJson (line 103) | static bool checkJson(JsonVariantConst src) {

FILE: extras/tests/JsonVariant/is.cpp
  type MYENUM2 (line 8) | enum MYENUM2 { ONE = 1, TWO = 2 }

FILE: extras/tests/JsonVariant/overflow.cpp
  function shouldBeOk (line 9) | void shouldBeOk(TIn value) {
  function shouldOverflow (line 17) | void shouldOverflow(TIn value) {

FILE: extras/tests/JsonVariant/set.cpp
  type ErrorCode (line 13) | enum ErrorCode { ERROR_01 = 1, ERROR_10 = 10 }

FILE: extras/tests/JsonVariant/stl_containers.cpp
  type ArduinoJson (line 13) | namespace ArduinoJson {
    type Converter<std::vector<T>> (line 15) | struct Converter<std::vector<T>> {
      method toJson (line 16) | static void toJson(const std::vector<T>& src, JsonVariant dst) {
      method fromJson (line 22) | static std::vector<T> fromJson(JsonVariantConst src) {
      method checkJson (line 29) | static bool checkJson(JsonVariantConst src) {
    type Converter<std::array<T, N>> (line 39) | struct Converter<std::array<T, N>> {
      method toJson (line 40) | static void toJson(const std::array<T, N>& src, JsonVariant dst) {
      method fromJson (line 46) | static std::array<T, N> fromJson(JsonVariantConst src) {
      method checkJson (line 55) | static bool checkJson(JsonVariantConst src) {

FILE: extras/tests/JsonVariant/types.cpp
  function checkReference (line 14) | void checkReference(T& expected) {
  function checkNumericType (line 20) | void checkNumericType() {

FILE: extras/tests/JsonVariantConst/is.cpp
  type MYENUM2 (line 8) | enum MYENUM2 { ONE = 1, TWO = 2 }

FILE: extras/tests/Misc/Readers.cpp
  class StreamStub (line 171) | class StreamStub : public Stream {
    method StreamStub (line 173) | StreamStub(const char* s) : stream_(s) {}
    method read (line 175) | int read() {
    method readBytes (line 179) | size_t readBytes(char* buffer, size_t length) {

FILE: extras/tests/Misc/StringAdapters.cpp
  type EmptyStruct (line 103) | struct EmptyStruct {}

FILE: extras/tests/Misc/StringWriter.cpp
  function print (line 18) | static size_t print(StringWriter& writer, const char* s) {
  function print (line 23) | static size_t print(StringWriter& writer, char c) {
  function common_tests (line 28) | void common_tests(StringWriter& writer, const String& output) {

FILE: extras/tests/Misc/TypeTraits.cpp
  class EmptyClass (line 12) | class EmptyClass {}
  type EmptyEnum (line 13) | enum EmptyEnum {}

FILE: extras/tests/Misc/Utf16.cpp
  function testUtf16Codepoint (line 10) | static void testUtf16Codepoint(uint16_t codeunit, uint32_t expectedCodep...
  function testUtf16Codepoint (line 16) | static void testUtf16Codepoint(uint16_t codeunit1, uint16_t codeunit2,

FILE: extras/tests/Misc/Utf8.cpp
  function testCodepoint (line 12) | static void testCodepoint(uint32_t codepoint, std::string expected) {

FILE: extras/tests/Misc/custom_string.hpp
  type custom_char_traits (line 9) | struct custom_char_traits : std::char_traits<char> {}

FILE: extras/tests/Misc/issue2129.cpp
  class Nullable (line 9) | class Nullable {
    method Nullable (line 11) | Nullable() : value_{} {}
    method Nullable (line 12) | Nullable(T value) : value_{value} {}
    method is_valid (line 22) | bool is_valid() const {
    method T (line 26) | T value() const {
  function convertToJson (line 39) | void convertToJson(const Nullable<T>& src, JsonVariant dst) {

FILE: extras/tests/Misc/issue2166.cpp
  type CCLASS (line 8) | struct CCLASS {

FILE: extras/tests/Misc/printable.cpp
  type PrintOneCharacterAtATime (line 15) | struct PrintOneCharacterAtATime {
    method printStringTo (line 16) | static size_t printStringTo(const std::string& s, Print& p) {
  type PrintAllAtOnce (line 28) | struct PrintAllAtOnce {
    method printStringTo (line 29) | static size_t printStringTo(const std::string& s, Print& p) {
  type PrintableString (line 35) | struct PrintableString : public Printable {
    method PrintableString (line 36) | PrintableString(const char* s) : str_(s), total_(0) {}
    method printTo (line 38) | virtual size_t printTo(Print& p) const {
    method totalBytesWritten (line 44) | size_t totalBytesWritten() const {

FILE: extras/tests/Misc/weird_strcmp.hpp
  function ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE (line 11) | ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
  function strncmp (line 22) | int strncmp(const char* a, const char* b, size_t n) {

FILE: extras/tests/MixedConfiguration/enable_infinity_0.cpp
  function assertParseFails (line 7) | static void assertParseFails(const char* json) {
  function assertJsonEquals (line 14) | static void assertJsonEquals(const JsonDocument& doc,

FILE: extras/tests/MixedConfiguration/enable_infinity_1.cpp
  type my (line 7) | namespace my {

FILE: extras/tests/MixedConfiguration/enable_nan_1.cpp
  type my (line 7) | namespace my {

FILE: extras/tests/MixedConfiguration/enable_progmem_1.cpp
  function testStringification (line 175) | static void testStringification(DeserializationError error,

FILE: extras/tests/MixedConfiguration/use_double_0.cpp
  type my (line 6) | namespace my {
  function checkFloat (line 10) | void checkFloat(const char* input, float expected) {

FILE: extras/tests/MsgPackDeserializer/deserializeVariant.cpp
  function checkValue (line 12) | static void checkValue(const char* input, T expected) {
  function checkError (line 22) | static void checkError(size_t timebombCountDown, const char* input,

FILE: extras/tests/MsgPackDeserializer/doubleToFloat.cpp
  function check (line 11) | static void check(const char* input, T expected) {

FILE: extras/tests/MsgPackDeserializer/errors.cpp
  function testIncompleteInput (line 39) | static void testIncompleteInput(const char* input, size_t len) {

FILE: extras/tests/MsgPackSerializer/misc.cpp
  function check (line 6) | void check(T value, const std::string& expected) {

FILE: extras/tests/MsgPackSerializer/serializeArray.cpp
  function check (line 12) | static void check(const JsonArray array, const char* expected_data,
  function check (line 23) | static void check(const JsonArray array, const char (&expected_data)[N]) {
  function check (line 28) | static void check(const JsonArray array, const std::string& expected) {

FILE: extras/tests/MsgPackSerializer/serializeObject.cpp
  function check (line 11) | static void check(const JsonObject object, const char* expected_data,
  function check (line 22) | static void check(const JsonObject object, const char (&expected_data)[N...

FILE: extras/tests/MsgPackSerializer/serializeVariant.cpp
  function checkVariant (line 11) | static void checkVariant(T value, const char* expected_data,
  function checkVariant (line 25) | static void checkVariant(T value, const char (&expected_data)[N]) {
  function checkVariant (line 31) | static void checkVariant(T value, const std::string& expected) {

FILE: extras/tests/Numbers/parseDouble.cpp
  function checkDouble (line 14) | void checkDouble(const char* input, double expected) {
  function checkDoubleNaN (line 19) | void checkDoubleNaN(const char* input) {
  function checkDoubleInf (line 25) | void checkDoubleInf(const char* input, bool negative) {

FILE: extras/tests/Numbers/parseFloat.cpp
  function checkFloat (line 13) | void checkFloat(const char* input, float expected) {
  function checkFloatNaN (line 20) | void checkFloatNaN(const char* input) {
  function checkFloatInf (line 26) | void checkFloatInf(const char* input, bool negative) {

FILE: extras/tests/Numbers/parseInteger.cpp
  function checkInteger (line 12) | void checkInteger(const char* input, T expected) {

FILE: extras/tests/ResourceManager/StringBuilder.cpp
  function VariantData (line 120) | static VariantData saveString(StringBuilder& builder, const char* s) {

FILE: extras/tests/ResourceManager/saveString.cpp
  function StringNode (line 13) | static StringNode* saveString(ResourceManager& resources, const char* s) {
  function StringNode (line 17) | static StringNode* saveString(ResourceManager& resources, const char* s,

FILE: extras/tests/ResourceManager/swap.cpp
  function fullPreallocatedPools (line 14) | static void fullPreallocatedPools(ResourceManager& resources) {

FILE: extras/tests/TextFormatter/writeFloat.cpp
  function check (line 17) | void check(TFloat input, const std::string& expected) {

FILE: extras/tests/TextFormatter/writeInteger.cpp
  function checkWriteInteger (line 15) | void checkWriteInteger(T value, std::string expected) {

FILE: extras/tests/TextFormatter/writeString.cpp
  function check (line 12) | void check(const char* input, std::string expected) {

FILE: extras/tests/catch/catch.hpp
  type Catch (line 98) | namespace Catch {
    type CaseSensitive (line 486) | struct CaseSensitive { enum Choice {
      type Choice (line 486) | enum Choice {
    class NonCopyable (line 491) | class NonCopyable {
      method NonCopyable (line 492) | NonCopyable( NonCopyable const& )              = delete;
      method NonCopyable (line 493) | NonCopyable( NonCopyable && )                  = delete;
      method NonCopyable (line 494) | NonCopyable& operator = ( NonCopyable const& ) = delete;
      method NonCopyable (line 495) | NonCopyable& operator = ( NonCopyable && )     = delete;
    type SourceLineInfo (line 502) | struct SourceLineInfo {
      method SourceLineInfo (line 504) | SourceLineInfo() = delete;
      method SourceLineInfo (line 505) | SourceLineInfo( char const* _file, std::size_t _line ) noexcept
      method SourceLineInfo (line 510) | SourceLineInfo( SourceLineInfo const& other )            = default;
      method SourceLineInfo (line 511) | SourceLineInfo& operator = ( SourceLineInfo const& )     = default;
      method SourceLineInfo (line 512) | SourceLineInfo( SourceLineInfo&& )              noexcept = default;
      method SourceLineInfo (line 513) | SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
      method empty (line 515) | bool empty() const noexcept { return file[0] == '\0'; }
    type StreamEndStop (line 534) | struct StreamEndStop {
    function T (line 538) | T const& operator + ( T const& value, StreamEndStop ) {
    type RegistrarForTagAliases (line 549) | struct RegistrarForTagAliases {
    class TestSpec (line 570) | class TestSpec
      class Pattern (line 5112) | class Pattern {
      class NamePattern (line 5123) | class NamePattern : public Pattern {
      class TagPattern (line 5131) | class TagPattern : public Pattern {
      class ExcludedPattern (line 5139) | class ExcludedPattern : public Pattern {
      type Filter (line 5147) | struct Filter {
      type FilterMatch (line 5155) | struct FilterMatch {
    type ITestInvoker (line 572) | struct ITestInvoker {
    class TestCase (line 577) | class TestCase
    type IConfig (line 578) | struct IConfig
    type ITestCaseRegistry (line 580) | struct ITestCaseRegistry {
    class StringRef (line 606) | class StringRef {
      method StringRef (line 618) | constexpr StringRef() noexcept = default;
      method StringRef (line 622) | constexpr StringRef( char const* rawChars, size_type size ) noexcept
      method StringRef (line 627) | StringRef( std::string const& stdString ) noexcept
      method empty (line 648) | constexpr auto empty() const noexcept -> bool {
      method size (line 651) | constexpr auto size() const noexcept -> size_type {
      method isNullTerminated (line 668) | constexpr auto isNullTerminated() const noexcept -> bool {
      method const_iterator (line 673) | constexpr const_iterator begin() const { return m_start; }
      method const_iterator (line 674) | constexpr const_iterator end() const { return m_start + m_size; }
    type always_false (line 925) | struct always_false : std::false_type {}
    type true_given (line 927) | struct true_given : std::true_type {}
    type is_callable_tester (line 928) | struct is_callable_tester {
    type is_callable (line 936) | struct is_callable
    class TestInvokerAsMethod (line 962) | class TestInvokerAsMethod : public ITestInvoker {
      method TestInvokerAsMethod (line 965) | TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAs...
      method invoke (line 967) | void invoke() const override {
    function makeTestInvoker (line 976) | auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInv...
    type NameAndTags (line 980) | struct NameAndTags {
    type AutoReg (line 986) | struct AutoReg : NonCopyable {
    type ResultWas (line 1353) | struct ResultWas { enum OfType {
      type OfType (line 1353) | enum OfType {
    type ResultDisposition (line 1377) | struct ResultDisposition { enum Flags {
      type Flags (line 1377) | enum Flags {
    function isFalseTest (line 1388) | inline bool isFalseTest( int flags ) { return ( flags & ResultDisposit...
    type AssertionInfo (line 1396) | struct AssertionInfo
    class StringRef (line 1431) | class StringRef
      method StringRef (line 618) | constexpr StringRef() noexcept = default;
      method StringRef (line 622) | constexpr StringRef( char const* rawChars, size_type size ) noexcept
      method StringRef (line 627) | StringRef( std::string const& stdString ) noexcept
      method empty (line 648) | constexpr auto empty() const noexcept -> bool {
      method size (line 651) | constexpr auto size() const noexcept -> size_type {
      method isNullTerminated (line 668) | constexpr auto isNullTerminated() const noexcept -> bool {
      method const_iterator (line 673) | constexpr const_iterator begin() const { return m_start; }
      method const_iterator (line 674) | constexpr const_iterator end() const { return m_start + m_size; }
    type IStream (line 1433) | struct IStream {
    class ReusableStringStream (line 1440) | class ReusableStringStream : NonCopyable {
      method get (line 1454) | auto get() -> std::ostream& { return *m_oss; }
    type Detail (line 1465) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type IMutableEnumValuesRegistry (line 1476) | struct IMutableEnumValuesRegistry {
    type Detail (line 1552) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker (line 1615) | struct StringMaker {
      method convert (line 1617) | static
      method convert (line 1628) | static
    type Detail (line 1639) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<std::string> (line 1665) | struct StringMaker<std::string> {
    type StringMaker<std::string_view> (line 1671) | struct StringMaker<std::string_view> {
    type StringMaker<char const *> (line 1677) | struct StringMaker<char const *> {
    type StringMaker<char *> (line 1681) | struct StringMaker<char *> {
    type StringMaker<std::wstring> (line 1687) | struct StringMaker<std::wstring> {
    type StringMaker<std::wstring_view> (line 1693) | struct StringMaker<std::wstring_view> {
    type StringMaker<wchar_t const *> (line 1699) | struct StringMaker<wchar_t const *> {
    type StringMaker<wchar_t *> (line 1703) | struct StringMaker<wchar_t *> {
    type StringMaker<char[SZ]> (line 1711) | struct StringMaker<char[SZ]> {
      method convert (line 1712) | static std::string convert(char const* str) {
    type StringMaker<signed char[SZ]> (line 1717) | struct StringMaker<signed char[SZ]> {
      method convert (line 1718) | static std::string convert(signed char const* str) {
    type StringMaker<unsigned char[SZ]> (line 1723) | struct StringMaker<unsigned char[SZ]> {
      method convert (line 1724) | static std::string convert(unsigned char const* str) {
    type StringMaker<std::byte> (line 1731) | struct StringMaker<std::byte> {
    type StringMaker<int> (line 1736) | struct StringMaker<int> {
    type StringMaker<long> (line 1740) | struct StringMaker<long> {
    type StringMaker<long long> (line 1744) | struct StringMaker<long long> {
    type StringMaker<unsigned int> (line 1748) | struct StringMaker<unsigned int> {
    type StringMaker<unsigned long> (line 1752) | struct StringMaker<unsigned long> {
    type StringMaker<unsigned long long> (line 1756) | struct StringMaker<unsigned long long> {
    type StringMaker<bool> (line 1761) | struct StringMaker<bool> {
    type StringMaker<char> (line 1766) | struct StringMaker<char> {
    type StringMaker<signed char> (line 1770) | struct StringMaker<signed char> {
    type StringMaker<unsigned char> (line 1774) | struct StringMaker<unsigned char> {
    type StringMaker<std::nullptr_t> (line 1779) | struct StringMaker<std::nullptr_t> {
    type StringMaker<float> (line 1784) | struct StringMaker<float> {
    type StringMaker<double> (line 1790) | struct StringMaker<double> {
    type StringMaker<T*> (line 1796) | struct StringMaker<T*> {
      method convert (line 1798) | static std::string convert(U* p) {
    type StringMaker<R C::*> (line 1808) | struct StringMaker<R C::*> {
      method convert (line 1809) | static std::string convert(R C::* p) {
    type StringMaker<T^> (line 1820) | struct StringMaker<T^> {
      method convert (line 1821) | static std::string convert( T^ ref ) {
    type Detail (line 1827) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<NSString*> (line 1844) | struct StringMaker<NSString*> {
      method convert (line 1845) | static std::string convert(NSString * nsstring) {
    type StringMaker<NSObject*> (line 1852) | struct StringMaker<NSObject*> {
      method convert (line 1853) | static std::string convert(NSObject* nsObject) {
    type Detail (line 1858) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<std::pair<T1, T2> > (line 1885) | struct StringMaker<std::pair<T1, T2> > {
      method convert (line 1886) | static std::string convert(const std::pair<T1, T2>& pair) {
    type StringMaker<std::optional<T> > (line 1903) | struct StringMaker<std::optional<T> > {
      method convert (line 1904) | static std::string convert(const std::optional<T>& optional) {
    type Detail (line 1921) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<std::monostate> (line 1962) | struct StringMaker<std::monostate> {
      method convert (line 1963) | static std::string convert(const std::monostate&) {
    type detail (line 1991) | namespace detail {
      type void_type (line 1993) | struct void_type {
      type is_range_impl (line 1998) | struct is_range_impl : std::false_type {
      type is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> (line 2002) | struct is_range_impl<T, typename void_type<decltype(begin(std::declv...
    type is_range (line 2007) | struct is_range : detail::is_range_impl<T> {
    type is_range<T^> (line 2012) | struct is_range<T^> {
    function rangeToString (line 2018) | std::string rangeToString( Range const& range ) {
    function rangeToString (line 2024) | std::string rangeToString( std::vector<bool, Allocator> const& v ) {
    type StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> (line 2040) | struct StringMaker<R, typename std::enable_if<is_range<R>::value && !:...
      method convert (line 2041) | static std::string convert( R const& range ) {
    type StringMaker<T[SZ]> (line 2047) | struct StringMaker<T[SZ]> {
      method convert (line 2048) | static std::string convert(T const(&arr)[SZ]) {
    type ratio_string (line 2064) | struct ratio_string {
    type ratio_string<std::atto> (line 2076) | struct ratio_string<std::atto> {
    type ratio_string<std::femto> (line 2080) | struct ratio_string<std::femto> {
    type ratio_string<std::pico> (line 2084) | struct ratio_string<std::pico> {
    type ratio_string<std::nano> (line 2088) | struct ratio_string<std::nano> {
    type ratio_string<std::micro> (line 2092) | struct ratio_string<std::micro> {
    type ratio_string<std::milli> (line 2096) | struct ratio_string<std::milli> {
    type StringMaker<std::chrono::duration<Value, Ratio>> (line 2103) | struct StringMaker<std::chrono::duration<Value, Ratio>> {
      method convert (line 2104) | static std::string convert(std::chrono::duration<Value, Ratio> const...
    type StringMaker<std::chrono::duration<Value, std::ratio<1>>> (line 2111) | struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {
      method convert (line 2112) | static std::string convert(std::chrono::duration<Value, std::ratio<1...
    type StringMaker<std::chrono::duration<Value, std::ratio<60>>> (line 2119) | struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {
      method convert (line 2120) | static std::string convert(std::chrono::duration<Value, std::ratio<6...
    type StringMaker<std::chrono::duration<Value, std::ratio<3600>>> (line 2127) | struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {
      method convert (line 2128) | static std::string convert(std::chrono::duration<Value, std::ratio<3...
    type StringMaker<std::chrono::time_point<Clock, Duration>> (line 2139) | struct StringMaker<std::chrono::time_point<Clock, Duration>> {
      method convert (line 2140) | static std::string convert(std::chrono::time_point<Clock, Duration> ...
    type StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> (line 2146) | struct StringMaker<std::chrono::time_point<std::chrono::system_clock, ...
      method convert (line 2147) | static std::string convert(std::chrono::time_point<std::chrono::syst...
    type ITransientExpression (line 2202) | struct ITransientExpression {
      method isBinaryExpression (line 2203) | auto isBinaryExpression() const -> bool { return m_isBinaryExpressio...
      method getResult (line 2204) | auto getResult() const -> bool { return m_result; }
      method ITransientExpression (line 2207) | ITransientExpression( bool isBinaryExpression, bool result )
    class BinaryExpr (line 2224) | class BinaryExpr  : public ITransientExpression {
      method streamReconstructedExpression (line 2229) | void streamReconstructedExpression( std::ostream &os ) const override {
      method BinaryExpr (line 2235) | BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs )
    class UnaryExpr (line 2300) | class UnaryExpr : public ITransientExpression {
      method streamReconstructedExpression (line 2303) | void streamReconstructedExpression( std::ostream &os ) const override {
      method UnaryExpr (line 2308) | explicit UnaryExpr( LhsT lhs )
    function compareEqual (line 2316) | auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return...
    function compareEqual (line 2318) | auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == re...
    function compareEqual (line 2320) | auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == r...
    function compareEqual (line 2322) | auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpr...
    function compareEqual (line 2324) | auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterp...
    function compareNotEqual (line 2327) | auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return s...
    function compareNotEqual (line 2329) | auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs !=...
    function compareNotEqual (line 2331) | auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs !...
    function compareNotEqual (line 2333) | auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinte...
    function compareNotEqual (line 2335) | auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reint...
    class ExprLhs (line 2338) | class ExprLhs {
      method ExprLhs (line 2341) | explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}
      method makeUnaryExpr (line 2402) | auto makeUnaryExpr() const -> UnaryExpr<LhsT> {
    function handleExpression (line 2410) | void handleExpression( ExprLhs<T> const& expr ) {
    type Decomposer (line 2414) | struct Decomposer {
    class AssertionResult (line 2439) | class AssertionResult
      method AssertionResult (line 5399) | AssertionResult() = delete;
    type AssertionInfo (line 2440) | struct AssertionInfo
    type SectionInfo (line 2441) | struct SectionInfo
      method SectionInfo (line 2866) | SectionInfo
    type SectionEndInfo (line 2442) | struct SectionEndInfo
    type MessageInfo (line 2443) | struct MessageInfo
    type MessageBuilder (line 2444) | struct MessageBuilder
      method MessageBuilder (line 2633) | MessageBuilder& operator << ( T const& value ) {
    type Counts (line 2445) | struct Counts
    type AssertionReaction (line 2446) | struct AssertionReaction
    type SourceLineInfo (line 2447) | struct SourceLineInfo
      method SourceLineInfo (line 504) | SourceLineInfo() = delete;
      method SourceLineInfo (line 505) | SourceLineInfo( char const* _file, std::size_t _line ) noexcept
      method SourceLineInfo (line 510) | SourceLineInfo( SourceLineInfo const& other )            = default;
      method SourceLineInfo (line 511) | SourceLineInfo& operator = ( SourceLineInfo const& )     = default;
      method SourceLineInfo (line 512) | SourceLineInfo( SourceLineInfo&& )              noexcept = default;
      method SourceLineInfo (line 513) | SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
      method empty (line 515) | bool empty() const noexcept { return file[0] == '\0'; }
    type ITransientExpression (line 2449) | struct ITransientExpression
      method isBinaryExpression (line 2203) | auto isBinaryExpression() const -> bool { return m_isBinaryExpressio...
      method getResult (line 2204) | auto getResult() const -> bool { return m_result; }
      method ITransientExpression (line 2207) | ITransientExpression( bool isBinaryExpression, bool result )
    type IGeneratorTracker (line 2450) | struct IGeneratorTracker
    type BenchmarkInfo (line 2453) | struct BenchmarkInfo
    type BenchmarkStats (line 2455) | struct BenchmarkStats
    type IResultCapture (line 2458) | struct IResultCapture {
    type TestFailureException (line 2521) | struct TestFailureException{}
    type AssertionResultData (line 2522) | struct AssertionResultData
      method AssertionResultData (line 5385) | AssertionResultData() = delete;
    type IResultCapture (line 2523) | struct IResultCapture
    class RunContext (line 2524) | class RunContext
      method RunContext (line 8062) | RunContext( RunContext const& ) = delete;
      method RunContext (line 8063) | RunContext& operator =( RunContext const& ) = delete;
    class LazyExpression (line 2526) | class LazyExpression {
      method LazyExpression (line 2536) | LazyExpression& operator = ( LazyExpression const& ) = delete;
    type AssertionReaction (line 2543) | struct AssertionReaction {
    class AssertionHandler (line 2548) | class AssertionHandler {
      method handleExpr (line 2567) | void handleExpr( ExprLhs<T> const& expr ) {
    type MessageInfo (line 2599) | struct MessageInfo {
    type MessageStream (line 2616) | struct MessageStream {
      method MessageStream (line 2619) | MessageStream& operator << ( T const& value ) {
    type MessageBuilder (line 2627) | struct MessageBuilder : MessageStream {
      method MessageBuilder (line 2633) | MessageBuilder& operator << ( T const& value ) {
    class ScopedMessage (line 2641) | class ScopedMessage {
      method ScopedMessage (line 2644) | ScopedMessage( ScopedMessage& duplicate ) = delete;
    class Capturer (line 2652) | class Capturer {
      method captureValues (line 2663) | void captureValues( size_t index, T const& value ) {
      method captureValues (line 2668) | void captureValues( size_t index, T const& value, Ts const&... value...
    type Counts (line 2829) | struct Counts {
    type Totals (line 2842) | struct Totals {
    type SectionInfo (line 2860) | struct SectionInfo {
      method SectionInfo (line 2866) | SectionInfo
    type SectionEndInfo (line 2876) | struct SectionEndInfo {
    class Timer (line 2894) | class Timer {
    class Section (line 2911) | class Section : NonCopyable {
    class TestCase (line 2952) | class TestCase
    type ITestCaseRegistry (line 2953) | struct ITestCaseRegistry
    type IExceptionTranslatorRegistry (line 2954) | struct IExceptionTranslatorRegistry
    type IExceptionTranslator (line 2955) | struct IExceptionTranslator
    type IReporterRegistry (line 2956) | struct IReporterRegistry
    type IReporterFactory (line 2957) | struct IReporterFactory
    type ITagAliasRegistry (line 2958) | struct ITagAliasRegistry
    type IMutableEnumValuesRegistry (line 2959) | struct IMutableEnumValuesRegistry
    class StartupExceptionRegistry (line 2961) | class StartupExceptionRegistry
    type IRegistryHub (line 2965) | struct IRegistryHub {
    type IMutableRegistryHub (line 2976) | struct IMutableRegistryHub {
    type IExceptionTranslator (line 3007) | struct IExceptionTranslator
    type IExceptionTranslator (line 3010) | struct IExceptionTranslator {
    type IExceptionTranslatorRegistry (line 3015) | struct IExceptionTranslatorRegistry {
    class ExceptionTranslatorRegistrar (line 3021) | class ExceptionTranslatorRegistrar {
      class ExceptionTranslator (line 3023) | class ExceptionTranslator : public IExceptionTranslator {
        method ExceptionTranslator (line 3026) | ExceptionTranslator( std::string(*translateFunction)( T& ) )
        method translate (line 3030) | std::string translate( ExceptionTranslators::const_iterator it, Ex...
      method ExceptionTranslatorRegistrar (line 3052) | ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
    type Detail (line 3076) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7883) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7887) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10565) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10592) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10602) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10614) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10622) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10636) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13647) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13652) | StreamBufImpl() {
        method overflow (line 13661) | int overflow( int c ) override {
        method sync (line 13673) | int sync() override {
      type OutputDebugWriter (line 13684) | struct OutputDebugWriter {
      class FileStream (line 13693) | class FileStream : public IStream {
        method FileStream (line 13696) | FileStream( StringRef filename ) {
      class CoutStream (line 13709) | class CoutStream : public IStream {
        method CoutStream (line 13714) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13723) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13727) | DebugOutStream()
      type Endianness (line 15027) | struct Endianness {
        type Arch (line 15028) | enum Arch { Big, Little }
        method Arch (line 15030) | static Arch which() {
      function rawMemoryToString (line 15040) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type literals (line 3179) | namespace literals {
    type StringMaker<Catch::Detail::Approx> (line 3185) | struct StringMaker<Catch::Detail::Approx> {
    type pluralise (line 3216) | struct pluralise {
    type Matchers (line 3236) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11404) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11426) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11437) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11561) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11661) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11665) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11669) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11673) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11677) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11681) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11685) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11709) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11784) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11787) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11790) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11793) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11797) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3396) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11404) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11426) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11437) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11561) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11661) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11665) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11669) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11673) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11677) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11681) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11685) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11709) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11784) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11787) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11790) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11793) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11797) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3423) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11404) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11426) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11437) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11561) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11661) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11665) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11669) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11673) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11677) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11681) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11685) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11709) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11784) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11787) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11790) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11793) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11797) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3487) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11404) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11426) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11437) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11561) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11661) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11665) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11669) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11673) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11677) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11681) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11685) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11709) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11784) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11787) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11790) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11793) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11797) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3534) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11404) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11426) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11437) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11561) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11661) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11665) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11669) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11673) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11677) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11681) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11685) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11709) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11784) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11787) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11790) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11793) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11797) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3603) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11404) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11426) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11437) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11561) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11563) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11661) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11665) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11669) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11673) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11677) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11681) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11685) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11709) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11784) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11787) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11790) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11793) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11797) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    class MatchExpr (line 3770) | class MatchExpr : public ITransientExpression {
      method MatchExpr (line 3775) | MatchExpr( ArgT const& arg, MatcherT const& matcher, StringRef const...
      method streamReconstructedExpression (line 3782) | void streamReconstructedExpression( std::ostream &os ) const override {
    function makeMatchExpr (line 3797) | auto makeMatchExpr( ArgT const& arg, MatcherT const& matcher, StringRe...
    type Generators (line 3844) | namespace Generators {
      class GeneratorUntypedBase (line 3845) | class GeneratorUntypedBase {
        method GeneratorUntypedBase (line 3847) | GeneratorUntypedBase() = default;
      type pf (line 3933) | namespace pf{
        function make_unique (line 3935) | std::unique_ptr<T> make_unique( Args&&... args ) {
      type IGenerator (line 3941) | struct IGenerator : GeneratorUntypedBase {
      class SingleValueGenerator (line 3953) | class SingleValueGenerator final : public IGenerator<T> {
        method SingleValueGenerator (line 3956) | SingleValueGenerator(T&& value) : m_value(std::move(value)) {}
        method T (line 3958) | T const& get() const override {
        method next (line 3961) | bool next() override {
      class FixedValuesGenerator (line 3967) | class FixedValuesGenerator final : public IGenerator<T> {
        method FixedValuesGenerator (line 3974) | FixedValuesGenerator( std::initializer_list<T> values ) : m_values...
        method T (line 3976) | T const& get() const override {
        method next (line 3979) | bool next() override {
      class GeneratorWrapper (line 3986) | class GeneratorWrapper final {
        method GeneratorWrapper (line 3989) | GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):
        method T (line 3992) | T const& get() const {
        method next (line 3995) | bool next() {
      function value (line 4001) | GeneratorWrapper<T> value(T&& value) {
      function values (line 4005) | GeneratorWrapper<T> values(std::initializer_list<T> values) {
      class Generators (line 4010) | class Generators : public IGenerator<T> {
        method populate (line 4014) | void populate(GeneratorWrapper<T>&& generator) {
        method populate (line 4017) | void populate(T&& val) {
        method populate (line 4021) | void populate(U&& val) {
        method populate (line 4025) | void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
        method Generators (line 4032) | Generators(Gs &&... moreGenerators) {
        method T (line 4037) | T const& get() const override {
        method next (line 4041) | bool next() override {
      function table (line 4054) | GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std...
      type as (line 4060) | struct as {}
      function makeGenerators (line 4063) | auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreG...
      function makeGenerators (line 4067) | auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators...
      function makeGenerators (line 4071) | auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generator...
      function makeGenerators (line 4075) | auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Ge...
      function generate (line 4085) | auto generate( StringRef generatorName, SourceLineInfo const& lineIn...
      class TakeGenerator (line 4120) | class TakeGenerator : public IGenerator<T> {
        method TakeGenerator (line 4125) | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):
        method T (line 4131) | T const& get() const override {
        method next (line 4134) | bool next() override {
      function take (line 4151) | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& genera...
      class FilterGenerator (line 4156) | class FilterGenerator : public IGenerator<T> {
        method FilterGenerator (line 4161) | FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):
        method T (line 4175) | T const& get() const override {
        method next (line 4179) | bool next() override {
        method nextImpl (line 4184) | bool nextImpl() {
      function filter (line 4195) | GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& g...
      class RepeatGenerator (line 4200) | class RepeatGenerator : public IGenerator<T> {
        method RepeatGenerator (line 4210) | RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
        method T (line 4217) | T const& get() const override {
        method next (line 4225) | bool next() override {
      function repeat (line 4251) | GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& gen...
      class MapGenerator (line 4256) | class MapGenerator : public IGenerator<T> {
        method MapGenerator (line 4264) | MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
        method T (line 4270) | T const& get() const override {
        method next (line 4273) | bool next() override {
      function map (line 4283) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      function map (line 4290) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      class ChunkGenerator (line 4297) | class ChunkGenerator final : public IGenerator<std::vector<T>> {
        method ChunkGenerator (line 4303) | ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
        method next (line 4320) | bool next() override {
      function chunk (line 4333) | GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper...
      class RandomFloatingGenerator (line 4603) | class RandomFloatingGenerator final : public IGenerator<Float> {
        method RandomFloatingGenerator (line 4609) | RandomFloatingGenerator(Float a, Float b):
        method Float (line 4615) | Float const& get() const override {
        method next (line 4618) | bool next() override {
      class RandomIntegerGenerator (line 4625) | class RandomIntegerGenerator final : public IGenerator<Integer> {
        method RandomIntegerGenerator (line 4631) | RandomIntegerGenerator(Integer a, Integer b):
        method Integer (line 4637) | Integer const& get() const override {
        method next (line 4640) | bool next() override {
      function random (line 4649) | typename std::enable_if<std::is_integral<T>::value && !std::is_same<...
      function random (line 4658) | typename std::enable_if<std::is_floating_point<T>::value,
      class RangeGenerator (line 4667) | class RangeGenerator final : public IGenerator<T> {
        method RangeGenerator (line 4674) | RangeGenerator(T const& start, T const& end, T const& step):
        method RangeGenerator (line 4685) | RangeGenerator(T const& start, T const& end):
        method T (line 4689) | T const& get() const override {
        method next (line 4693) | bool next() override {
      function range (line 4700) | GeneratorWrapper<T> range(T const& start, T const& end, T const& ste...
      function range (line 4706) | GeneratorWrapper<T> range(T const& start, T const& end) {
      class IteratorGenerator (line 4712) | class IteratorGenerator final : public IGenerator<T> {
        method IteratorGenerator (line 4721) | IteratorGenerator(InputIterator first, InputSentinel last):m_elems...
        method T (line 4727) | T const& get() const override {
        method next (line 4731) | bool next() override {
      function from_range (line 4740) | GeneratorWrapper<ResultType> from_range(InputIterator from, InputSen...
      function from_range (line 4746) | GeneratorWrapper<ResultType> from_range(Container const& cnt) {
      function acquireGeneratorTracker (line 10980) | auto acquireGeneratorTracker( StringRef generatorName, SourceLineInf...
      type GeneratorTracker (line 12586) | struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorT...
        method GeneratorTracker (line 12589) | GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAnd...
        method GeneratorTracker (line 12594) | static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTra...
        method isGeneratorTracker (line 12631) | bool isGeneratorTracker() const override { return true; }
        method hasGenerator (line 12632) | auto hasGenerator() const -> bool override {
        method close (line 12635) | void close() override {
        method getGenerator (line 12705) | auto getGenerator() const -> GeneratorBasePtr const& override {
        method setGenerator (line 12708) | void setGenerator( GeneratorBasePtr&& generator ) override {
    type IGeneratorTracker (line 3859) | struct IGeneratorTracker {
    function throw_exception (line 3876) | [[noreturn]]
    class GeneratorException (line 3919) | class GeneratorException : public std::exception {
      method GeneratorException (line 3923) | GeneratorException(const char* msg):
    type Generators (line 3930) | namespace Generators {
      class GeneratorUntypedBase (line 3845) | class GeneratorUntypedBase {
        method GeneratorUntypedBase (line 3847) | GeneratorUntypedBase() = default;
      type pf (line 3933) | namespace pf{
        function make_unique (line 3935) | std::unique_ptr<T> make_unique( Args&&... args ) {
      type IGenerator (line 3941) | struct IGenerator : GeneratorUntypedBase {
      class SingleValueGenerator (line 3953) | class SingleValueGenerator final : public IGenerator<T> {
        method SingleValueGenerator (line 3956) | SingleValueGenerator(T&& value) : m_value(std::move(value)) {}
        method T (line 3958) | T const& get() const override {
        method next (line 3961) | bool next() override {
      class FixedValuesGenerator (line 3967) | class FixedValuesGenerator final : public IGenerator<T> {
        method FixedValuesGenerator (line 3974) | FixedValuesGenerator( std::initializer_list<T> values ) : m_values...
        method T (line 3976) | T const& get() const override {
        method next (line 3979) | bool next() override {
      class GeneratorWrapper (line 3986) | class GeneratorWrapper final {
        method GeneratorWrapper (line 3989) | GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):
        method T (line 3992) | T const& get() const {
        method next (line 3995) | bool next() {
      function value (line 4001) | GeneratorWrapper<T> value(T&& value) {
      function values (line 4005) | GeneratorWrapper<T> values(std::initializer_list<T> values) {
      class Generators (line 4010) | class Generators : public IGenerator<T> {
        method populate (line 4014) | void populate(GeneratorWrapper<T>&& generator) {
        method populate (line 4017) | void populate(T&& val) {
        method populate (line 4021) | void populate(U&& val) {
        method populate (line 4025) | void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
        method Generators (line 4032) | Generators(Gs &&... moreGenerators) {
        method T (line 4037) | T const& get() const override {
        method next (line 4041) | bool next() override {
      function table (line 4054) | GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std...
      type as (line 4060) | struct as {}
      function makeGenerators (line 4063) | auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreG...
      function makeGenerators (line 4067) | auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators...
      function makeGenerators (line 4071) | auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generator...
      function makeGenerators (line 4075) | auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Ge...
      function generate (line 4085) | auto generate( StringRef generatorName, SourceLineInfo const& lineIn...
      class TakeGenerator (line 4120) | class TakeGenerator : public IGenerator<T> {
        method TakeGenerator (line 4125) | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):
        method T (line 4131) | T const& get() const override {
        method next (line 4134) | bool next() override {
      function take (line 4151) | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& genera...
      class FilterGenerator (line 4156) | class FilterGenerator : public IGenerator<T> {
        method FilterGenerator (line 4161) | FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):
        method T (line 4175) | T const& get() const override {
        method next (line 4179) | bool next() override {
        method nextImpl (line 4184) | bool nextImpl() {
      function filter (line 4195) | GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& g...
      class RepeatGenerator (line 4200) | class RepeatGenerator : public IGenerator<T> {
        method RepeatGenerator (line 4210) | RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
        method T (line 4217) | T const& get() const override {
        method next (line 4225) | bool next() override {
      function repeat (line 4251) | GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& gen...
      class MapGenerator (line 4256) | class MapGenerator : public IGenerator<T> {
        method MapGenerator (line 4264) | MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
        method T (line 4270) | T const& get() const override {
        method next (line 4273) | bool next() override {
      function map (line 4283) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      function map (line 4290) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      class ChunkGenerator (line 4297) | class ChunkGenerator final : public IGenerator<std::vector<T>> {
        method ChunkGenerator (line 4303) | ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
        method next (line 4320) | bool next() override {
      function chunk (line 4333) | GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper...
      class RandomFloatingGenerator (line 4603) | class RandomFloatingGenerator final : public IGenerator<Float> {
        method RandomFloatingGenerator (line 4609) | RandomFloatingGenerator(Float a, Float b):
        method Float (line 4615) | Float const& get() const override {
        method next (line 4618) | bool next() override {
      class RandomIntegerGenerator (line 4625) | class RandomIntegerGenerator final : public IGenerator<Integer> {
        method RandomIntegerGenerator (line 4631) | RandomIntegerGenerator(Integer a, Integer b):
        method Integer (line 4637) | Integer const& get() const override {
        method next (line 4640) | bool next() override {
      function random (line 4649) | typename std::enable_if<std::is_integral<T>::value && !std::is_same<...
      function random (line 4658) | typename std::enable_if<std::is_floating_point<T>::value,
      class RangeGenerator (line 4667) | class RangeGenerator final : public IGenerator<T> {
        method RangeGenerator (line 4674) | RangeGenerator(T const& start, T const& end, T const& step):
        method RangeGenerator (line 4685) | RangeGenerator(T const& start, T const& end):
        method T (line 4689) | T const& get() const override {
        method next (line 4693) | bool next() override {
      function range (line 4700) | GeneratorWrapper<T> range(T const& start, T const& end, T const& ste...
      function range (line 4706) | GeneratorWrapper<T> range(T const& start, T const& end) {
      class IteratorGenerator (line 4712) | class IteratorGenerator final : public IGenerator<T> {
        method IteratorGenerator (line 4721) | IteratorGenerator(InputIterator first, InputSentinel last):m_elems...
        method T (line 4727) | T const& get() const override {
        method next (line 4731) | bool next() override {
      function from_range (line 4740) | GeneratorWrapper<ResultType> from_range(InputIterator from, InputSen...
      function from_range (line 4746) | GeneratorWrapper<ResultType> from_range(Container const& cnt) {
      function acquireGeneratorTracker (line 10980) | auto acquireGeneratorTracker( StringRef generatorName, SourceLineInf...
      type GeneratorTracker (line 12586) | struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorT...
        method GeneratorTracker (line 12589) | GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAnd...
        method GeneratorTracker (line 12594) | static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTra...
        method isGeneratorTracker (line 12631) | bool isGeneratorTracker() const override { return true; }
        method hasGenerator (line 12632) | auto hasGenerator() const -> bool override {
        method close (line 12635) | void close() override {
        method getGenerator (line 12705) | auto getGenerator() const -> GeneratorBasePtr const& override {
        method setGenerator (line 12708) | void setGenerator( GeneratorBasePtr&& generator ) override {
    type Generators (line 4117) | namespace Generators {
      class GeneratorUntypedBase (line 3845) | class GeneratorUntypedBase {
        method GeneratorUntypedBase (line 3847) | GeneratorUntypedBase() = default;
      type pf (line 3933) | namespace pf{
        function make_unique (line 3935) | std::unique_ptr<T> make_unique( Args&&... args ) {
      type IGenerator (line 3941) | struct IGenerator : GeneratorUntypedBase {
      class SingleValueGenerator (line 3953) | class SingleValueGenerator final : public IGenerator<T> {
        method SingleValueGenerator (line 3956) | SingleValueGenerator(T&& value) : m_value(std::move(value)) {}
        method T (line 3958) | T const& get() const override {
        method next (line 3961) | bool next() override {
      class FixedValuesGenerator (line 3967) | class FixedValuesGenerator final : public IGenerator<T> {
        method FixedValuesGenerator (line 3974) | FixedValuesGenerator( std::initializer_list<T> values ) : m_values...
        method T (line 3976) | T const& get() const override {
        method next (line 3979) | bool next() override {
      class GeneratorWrapper (line 3986) | class GeneratorWrapper final {
        method GeneratorWrapper (line 3989) | GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):
        method T (line 3992) | T const& get() const {
        method next (line 3995) | bool next() {
      function value (line 4001) | GeneratorWrapper<T> value(T&& value) {
      function values (line 4005) | GeneratorWrapper<T> values(std::initializer_list<T> values) {
      class Generators (line 4010) | class Generators : public IGenerator<T> {
        method populate (line 4014) | void populate(GeneratorWrapper<T>&& generator) {
        method populate (line 4017) | void populate(T&& val) {
        method populate (line 4021) | void populate(U&& val) {
        method populate (line 4025) | void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
        method Generators (line 4032) | Generators(Gs &&... moreGenerators) {
        method T (line 4037) | T const& get() const override {
        method next (line 4041) | bool next() override {
      function table (line 4054) | GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std...
      type as (line 4060) | struct as {}
      function makeGenerators (line 4063) | auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreG...
      function makeGenerators (line 4067) | auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators...
      function makeGenerators (line 4071) | auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generator...
      function makeGenerators (line 4075) | auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Ge...
      function generate (line 4085) | auto generate( StringRef generatorName, SourceLineInfo const& lineIn...
      class TakeGenerator (line 4120) | class TakeGenerator : public IGenerator<T> {
        method TakeGenerator (line 4125) | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):
        method T (line 4131) | T const& get() const override {
        method next (line 4134) | bool next() override {
      function take (line 4151) | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& genera...
      class FilterGenerator (line 4156) | class FilterGenerator : public IGenerator<T> {
        method FilterGenerator (line 4161) | FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):
        method T (line 4175) | T const& get() const override {
        method next (line 4179) | bool next() override {
        method nextImpl (line 4184) | bool nextImpl() {
      function filter (line 4195) | GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& g...
      class RepeatGenerator (line 4200) | class RepeatGenerator : public IGenerator<T> {
        method RepeatGenerator (line 4210) | RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
        method T (line 4217) | T const& get() const override {
        method next (line 4225) | bool next() override {
      function repeat (line 4251) | GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& gen...
      class MapGenerator (line 4256) | class MapGenerator : public IGenerator<T> {
        method MapGenerator (line 4264) | MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
        method T (line 4270) | T const& get() const override {
        method next (line 4273) | bool next() override {
      function map (line 4283) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      function map (line 4290) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      class ChunkGenerator (line 4297) | class ChunkGenerator final : public IGenerator<std::vector<T>> {
        method ChunkGenerator (line 4303) | ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
        method next (line 4320) | bool next() override {
      function chunk (line 4333) | GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper...
      class RandomFloatingGenerator (line 4603) | class RandomFloatingGenerator final : public IGenerator<Float> {
        method RandomFloatingGenerator (line 4609) | RandomFloatingGenerator(Float a, Float b):
        method Float (line 4615) | Float const& get() const override {
        method next (line 4618) | bool next() override {
      class RandomIntegerGenerator (line 4625) | class RandomIntegerGenerator final : public IGenerator<Integer> {
        method RandomIntegerGenerator (line 4631) | RandomIntegerGenerator(Integer a, Integer b):
        method Integer (line 4637) | Integer const& get() const override {
        method next (line 4640) | bool next() override {
      function random (line 4649) | typename std::enable_if<std::is_integral<T>::value && !std::is_same<...
      function random (line 4658) | typename std::enable_if<std::is_floating_point<T>::value,
      class RangeGenerator (line 4667) | class RangeGenerator final : public IGenerator<T> {
        method RangeGenerator (line 4674) | RangeGenerator(T const& start, T const& end, T const& step):
        method RangeGenerator (line 4685) | RangeGenerator(T const& start, T const& end):
        method T (line 4689) | T const& get() const override {
        method next (line 4693) | bool next() override {
      function range (line 4700) | GeneratorWrapper<T> range(T const& start, T const& end, T const& ste...
      function range (line 4706) | GeneratorWrapper<T> range(T const& start, T const& end) {
      class IteratorGenerator (line 4712) | class IteratorGenerator final : public IGenerator<T> {
        method IteratorGenerator (line 4721) | IteratorGenerator(InputIterator first, InputSentinel last):m_elems...
        method T (line 4727) | T const& get() const override {
        method next (line 4731) | bool next() override {
      function from_range (line 4740) | GeneratorWrapper<ResultType> from_range(InputIterator from, InputSen...
      function from_range (line 4746) | GeneratorWrapper<ResultType> from_range(Container const& cnt) {
      function acquireGeneratorTracker (line 10980) | auto acquireGeneratorTracker( StringRef generatorName, SourceLineInf...
      type GeneratorTracker (line 12586) | struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorT...
        method GeneratorTracker (line 12589) | GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAnd...
        method GeneratorTracker (line 12594) | static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTra...
        method isGeneratorTracker (line 12631) | bool isGeneratorTracker() const override { return true; }
        method hasGenerator (line 12632) | auto hasGenerator() const -> bool override {
        method close (line 12635) | void close() override {
        method getGenerator (line 12705) | auto getGenerator() const -> GeneratorBasePtr const& override {
        method setGenerator (line 12708) | void setGenerator( GeneratorBasePtr&& generator ) override {
    type IResultCapture (line 4351) | struct IResultCapture
    type IRunner (line 4352) | struct IRunner
    type IConfig (line 4353) | struct IConfig
    type IMutableContext (line 4354) | struct IMutableContext
    type IContext (line 4358) | struct IContext
    type IMutableContext (line 4367) | struct IMutableContext : IContext
    function IMutableContext (line 4381) | inline IMutableContext& getCurrentMutableContext()
    function IContext (line 4389) | inline IContext& getCurrentContext()
    class SimplePcg32 (line 4396) | class SimplePcg32
      method SimplePcg32 (line 4570) | SimplePcg32():SimplePcg32(0xed743cc4U) {}
    class Option (line 4409) | class Option {
      method Option (line 4411) | Option() : nullableValue( nullptr ) {}
      method Option (line 4412) | Option( T const& _value )
      method Option (line 4415) | Option( Option const& _other )
      method Option (line 4423) | Option& operator= ( Option const& _other ) {
      method Option (line 4431) | Option& operator = ( T const& _value ) {
      method reset (line 4437) | void reset() {
      method T (line 4443) | T& operator*() { return *nullableValue; }
      method T (line 4444) | T const& operator*() const { return *nullableValue; }
      method T (line 4445) | T* operator->() { return nullableValue; }
      method T (line 4446) | const T* operator->() const { return nullableValue; }
      method T (line 4448) | T valueOr( T const& defaultValue ) const {
      method some (line 4452) | bool some() const { return nullableValue != nullptr; }
      method none (line 4453) | bool none() const { return nullableValue == nullptr; }
    type Verbosity (line 4476) | enum class Verbosity {
    type WarnAbout (line 4482) | struct WarnAbout { enum What {
      type What (line 4482) | enum What {
    type ShowDurations (line 4488) | struct ShowDurations { enum OrNot {
      type OrNot (line 4488) | enum OrNot {
    type RunTests (line 4493) | struct RunTests { enum InWhatOrder {
      type InWhatOrder (line 4493) | enum InWhatOrder {
    type UseColour (line 4498) | struct UseColour { enum YesOrNo {
      type YesOrNo (line 4498) | enum YesOrNo {
    type WaitForKeypress (line 4503) | struct WaitForKeypress { enum When {
      type When (line 4503) | enum When {
    class TestSpec (line 4510) | class TestSpec
      class Pattern (line 5112) | class Pattern {
      class NamePattern (line 5123) | class NamePattern : public Pattern {
      class TagPattern (line 5131) | class TagPattern : public Pattern {
      class ExcludedPattern (line 5139) | class ExcludedPattern : public Pattern {
      type Filter (line 5147) | struct Filter {
      type FilterMatch (line 5155) | struct FilterMatch {
    type IConfig (line 4512) | struct IConfig : NonCopyable {
    class SimplePcg32 (line 4558) | class SimplePcg32 {
      method SimplePcg32 (line 4570) | SimplePcg32():SimplePcg32(0xed743cc4U) {}
    type Generators (line 4600) | namespace Generators {
      class GeneratorUntypedBase (line 3845) | class GeneratorUntypedBase {
        method GeneratorUntypedBase (line 3847) | GeneratorUntypedBase() = default;
      type pf (line 3933) | namespace pf{
        function make_unique (line 3935) | std::unique_ptr<T> make_unique( Args&&... args ) {
      type IGenerator (line 3941) | struct IGenerator : GeneratorUntypedBase {
      class SingleValueGenerator (line 3953) | class SingleValueGenerator final : public IGenerator<T> {
        method SingleValueGenerator (line 3956) | SingleValueGenerator(T&& value) : m_value(std::move(value)) {}
        method T (line 3958) | T const& get() const override {
        method next (line 3961) | bool next() override {
      class FixedValuesGenerator (line 3967) | class FixedValuesGenerator final : public IGenerator<T> {
        method FixedValuesGenerator (line 3974) | FixedValuesGenerator( std::initializer_list<T> values ) : m_values...
        method T (line 3976) | T const& get() const override {
        method next (line 3979) | bool next() override {
      class GeneratorWrapper (line 3986) | class GeneratorWrapper final {
        method GeneratorWrapper (line 3989) | GeneratorWrapper(std::unique_ptr<IGenerator<T>> generator):
        method T (line 3992) | T const& get() const {
        method next (line 3995) | bool next() {
      function value (line 4001) | GeneratorWrapper<T> value(T&& value) {
      function values (line 4005) | GeneratorWrapper<T> values(std::initializer_list<T> values) {
      class Generators (line 4010) | class Generators : public IGenerator<T> {
        method populate (line 4014) | void populate(GeneratorWrapper<T>&& generator) {
        method populate (line 4017) | void populate(T&& val) {
        method populate (line 4021) | void populate(U&& val) {
        method populate (line 4025) | void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
        method Generators (line 4032) | Generators(Gs &&... moreGenerators) {
        method T (line 4037) | T const& get() const override {
        method next (line 4041) | bool next() override {
      function table (line 4054) | GeneratorWrapper<std::tuple<Ts...>> table( std::initializer_list<std...
      type as (line 4060) | struct as {}
      function makeGenerators (line 4063) | auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreG...
      function makeGenerators (line 4067) | auto makeGenerators( GeneratorWrapper<T>&& generator ) -> Generators...
      function makeGenerators (line 4071) | auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generator...
      function makeGenerators (line 4075) | auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Ge...
      function generate (line 4085) | auto generate( StringRef generatorName, SourceLineInfo const& lineIn...
      class TakeGenerator (line 4120) | class TakeGenerator : public IGenerator<T> {
        method TakeGenerator (line 4125) | TakeGenerator(size_t target, GeneratorWrapper<T>&& generator):
        method T (line 4131) | T const& get() const override {
        method next (line 4134) | bool next() override {
      function take (line 4151) | GeneratorWrapper<T> take(size_t target, GeneratorWrapper<T>&& genera...
      class FilterGenerator (line 4156) | class FilterGenerator : public IGenerator<T> {
        method FilterGenerator (line 4161) | FilterGenerator(P&& pred, GeneratorWrapper<T>&& generator):
        method T (line 4175) | T const& get() const override {
        method next (line 4179) | bool next() override {
        method nextImpl (line 4184) | bool nextImpl() {
      function filter (line 4195) | GeneratorWrapper<T> filter(Predicate&& pred, GeneratorWrapper<T>&& g...
      class RepeatGenerator (line 4200) | class RepeatGenerator : public IGenerator<T> {
        method RepeatGenerator (line 4210) | RepeatGenerator(size_t repeats, GeneratorWrapper<T>&& generator):
        method T (line 4217) | T const& get() const override {
        method next (line 4225) | bool next() override {
      function repeat (line 4251) | GeneratorWrapper<T> repeat(size_t repeats, GeneratorWrapper<T>&& gen...
      class MapGenerator (line 4256) | class MapGenerator : public IGenerator<T> {
        method MapGenerator (line 4264) | MapGenerator(F2&& function, GeneratorWrapper<U>&& generator) :
        method T (line 4270) | T const& get() const override {
        method next (line 4273) | bool next() override {
      function map (line 4283) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      function map (line 4290) | GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& gener...
      class ChunkGenerator (line 4297) | class ChunkGenerator final : public IGenerator<std::vector<T>> {
        method ChunkGenerator (line 4303) | ChunkGenerator(size_t size, GeneratorWrapper<T> generator) :
        method next (line 4320) | bool next() override {
      function chunk (line 4333) | GeneratorWrapper<std::vector<T>> chunk(size_t size, GeneratorWrapper...
      class RandomFloatingGenerator (line 4603) | class RandomFloatingGenerator final : public IGenerator<Float> {
        method RandomFloatingGenerator (line 4609) | RandomFloatingGenerator(Float a, Float b):
        method Float (line 4615) | Float const& get() const override {
        method next (line 4618) | bool next() override {
      class RandomIntegerGenerator (line 4625) | class RandomIntegerGenerator final : public IGenerator<Integer> {
        method RandomIntegerGenerator (line 4631) | RandomIntegerGenerator(Integer a, Integer b):
        method Integer (line 4637) | Integer const& get() const override {
        method next (line 4640) | bool next() override {
      function random (line 4649) | typename std::enable_if<std::is_integral<T>::value && !std::is_same<...
      function random (line 4658) | typename std::enable_if<std::is_floating_point<T>::value,
      class RangeGenerator (line 4667) | class RangeGenerator final : public IGenerator<T> {
        method RangeGenerator (line 4674) | RangeGenerator(T const& start, T const& end, T const& step):
        method RangeGenerator (line 4685) | RangeGenerator(T const& start, T const& end):
        method T (line 4689) | T const& get() const override {
        method next (line 4693) | bool next() override {
      function range (line 4700) | GeneratorWrapper<T> range(T const& start, T const& end, T const& ste...
      function range (line 4706) | GeneratorWrapper<T> range(T const& start, T const& end) {
      class IteratorGenerator (line 4712) | class IteratorGenerator final : public IGenerator<T> {
        method IteratorGenerator (line 4721) | IteratorGenerator(InputIterator first, InputSentinel last):m_elems...
        method T (line 4727) | T const& get() const override {
        method next (line 4731) | bool next() override {
      function from_range (line 4740) | GeneratorWrapper<ResultType> from_range(InputIterator from, InputSen...
      function from_range (line 4746) | GeneratorWrapper<ResultType> from_range(Container const& cnt) {
      function acquireGeneratorTracker (line 10980) | auto acquireGeneratorTracker( StringRef generatorName, SourceLineInf...
      type GeneratorTracker (line 12586) | struct GeneratorTracker : TestCaseTracking::TrackerBase, IGeneratorT...
        method GeneratorTracker (line 12589) | GeneratorTracker( TestCaseTracking::NameAndLocation const& nameAnd...
        method GeneratorTracker (line 12594) | static GeneratorTracker& acquire( TrackerContext& ctx, TestCaseTra...
        method isGeneratorTracker (line 12631) | bool isGeneratorTracker() const override { return true; }
        method hasGenerator (line 12632) | auto hasGenerator() const -> bool override {
        method close (line 12635) | void close() override {
        method getGenerator (line 12705) | auto getGenerator() const -> GeneratorBasePtr const& override {
        method setGenerator (line 12708) | void setGenerator( GeneratorBasePtr&& generator ) override {
    type ITestInvoker (line 4770) | struct ITestInvoker
    type TestCaseInfo (line 4772) | struct TestCaseInfo {
      type SpecialProperties (line 4773) | enum SpecialProperties{
    class TestCase (line 4807) | class TestCase : public TestCaseInfo {
    type IRunner (line 4840) | struct IRunner {
    class WildcardPattern (line 5080) | class WildcardPattern {
      type WildcardPosition (line 5081) | enum WildcardPosition {
    type IConfig (line 5109) | struct IConfig
    class TestSpec (line 5111) | class TestSpec {
      class Pattern (line 5112) | class Pattern {
      class NamePattern (line 5123) | class NamePattern : public Pattern {
      class TagPattern (line 5131) | class TagPattern : public Pattern {
      class ExcludedPattern (line 5139) | class ExcludedPattern : public Pattern {
      type Filter (line 5147) | struct Filter {
      type FilterMatch (line 5155) | struct FilterMatch {
    type TagAlias (line 5185) | struct TagAlias
    type ITagAliasRegistry (line 5187) | struct ITagAliasRegistry {
    class TestSpecParser (line 5201) | class TestSpecParser {
      type Mode (line 5202) | enum Mode{ None, Name, QuotedName, Tag, EscapedName }
      method addCharToPattern (line 5243) | inline void addCharToPattern(char c) {
    type IStream (line 5271) | struct IStream
    type ConfigData (line 5273) | struct ConfigData {
    class Config (line 5317) | class Config : public IConfig {
      method Config (line 5320) | Config() = default;
    type AssertionResultData (line 5383) | struct AssertionResultData
      method AssertionResultData (line 5385) | AssertionResultData() = delete;
    class AssertionResult (line 5397) | class AssertionResult {
      method AssertionResult (line 5399) | AssertionResult() = delete;
    type Benchmark (line 5430) | namespace Benchmark {
      type Estimate (line 5432) | struct Estimate {
      type OutlierClassification (line 5453) | struct OutlierClassification {
        method total (line 5460) | int total() const {
      type now (line 6469) | struct now {
      function keep_memory (line 6493) | inline void keep_memory(T* p) {
      function keep_memory (line 6496) | inline void keep_memory() {
      type Detail (line 6500) | namespace Detail {
        function optimizer_barrier (line 6501) | inline void optimizer_barrier() { keep_memory(); }
        function optimizer_barrier (line 6515) | inline void optimizer_barrier() {
        type CompleteType (line 6552) | struct CompleteType { using type = T; }
        type CompleteType<void> (line 6554) | struct CompleteType<void> { struct type {}; }
          type type (line 6554) | struct type {}
        type CompleteInvoker (line 6560) | struct CompleteInvoker {
          method Result (line 6562) | static Result invoke(Fun&& fun, Args&&... args) {
        type CompleteInvoker<void> (line 6567) | struct CompleteInvoker<void> {
          method invoke (line 6569) | static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {
        function complete_invoke (line 6577) | CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(F...
        type ChronometerConcept (line 6600) | struct ChronometerConcept {
        type ChronometerModel (line 6606) | struct ChronometerModel final : public ChronometerConcept {
          method start (line 6607) | void start() override { started = Clock::now(); }
          method finish (line 6608) | void finish() override { finished = Clock::now(); }
          method elapsed (line 6610) | ClockDuration<Clock> elapsed() const { return finished - started; }
        type is_related (line 6698) | struct is_related
        type BenchmarkFunction (line 6708) | struct BenchmarkFunction {
          type callable (line 6710) | struct callable {
          type model (line 6716) | struct model : public callable {
            method model (line 6717) | model(Fun&& fun) : fun(std::move(fun)) {}
            method model (line 6718) | model(Fun const& fun) : fun(fun) {}
            method call (line 6722) | void call(Chronometer meter) const override {
            method call (line 6725) | void call(Chronometer meter, std::true_type) const {
            method call (line 6728) | void call(Chronometer meter, std::false_type) const {
          type do_nothing (line 6735) | struct do_nothing { void operator()() const {} }
          method BenchmarkFunction (line 6738) | BenchmarkFunction(model<T>* c) : f(c) {}
          method BenchmarkFunction (line 6741) | BenchmarkFunction()
          method BenchmarkFunction (line 6746) | BenchmarkFunction(Fun&& fun)
          method BenchmarkFunction (line 6749) | BenchmarkFunction(BenchmarkFunction&& that)
          method BenchmarkFunction (line 6752) | BenchmarkFunction(BenchmarkFunction const& that)
          method BenchmarkFunction (line 6755) | BenchmarkFunction& operator=(BenchmarkFunction&& that) {
          method BenchmarkFunction (line 6760) | BenchmarkFunction& operator=(BenchmarkFunction const& that) {
        type repeater (line 6787) | struct repeater {
        function repeat (line 6796) | repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {
        function measure (line 6842) | TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
        function measure_one (line 6861) | TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::f...
        function measure_one (line 6865) | TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters...
        type optimized_away_error (line 6875) | struct optimized_away_error : std::exception {
        function run_for_at_least (line 6882) | TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_...
        function OutlierClassification (line 6967) | OutlierClassification classify_outliers(Iterator first, Iterator l...
        function mean (line 6991) | double mean(Iterator first, Iterator last) {
        function sample (line 6998) | sample resample(URng& rng, int resamples, Iterator first, Iterator...
        function sample (line 7015) | sample jackknife(Estimator&& estimator, Iterator first, Iterator l...
        function normal_cdf (line 7029) | inline double normal_cdf(double x) {
        function bootstrap (line 7038) | Estimate<double> bootstrap(double confidence_level, Iterator first...
        type bootstrap_analysis (line 7079) | struct bootstrap_analysis {
        function resolution (line 7101) | std::vector<double> resolution(int k) {
        function warmup (line 7126) | int warmup() {
        function estimate_clock_resolution (line 7131) | EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolutio...
        function estimate_clock_cost (line 7140) | EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(Floa...
        function measure_environment (line 7168) | Environment<FloatDuration<Clock>> measure_environment() {
        function analyse (line 7237) | SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<D...
        type ObjectStorage (line 7396) | struct ObjectStorage
          method ObjectStorage (line 7398) | ObjectStorage() : data() {}
          method ObjectStorage (line 7400) | ObjectStorage(const ObjectStorage& other)
          method ObjectStorage (line 7405) | ObjectStorage(ObjectStorage&& other)
          method construct (line 7413) | void construct(Args&&... args)
          method destruct (line 7419) | typename std::enable_if<AllowManualDestruction>::type destruct()
          method destruct_on_exit (line 7427) | void destruct_on_exit(typename std::enable_if<Destruct, U>::type...
          method destruct_on_exit (line 7430) | void destruct_on_exit(typename std::enable_if<!Destruct, U>::typ...
          method T (line 7432) | T& stored_object() {
          method T (line 7436) | T const& stored_object() const {
        function weighted_average_quantile (line 7751) | double weighted_average_quantile(int k, int q, std::vector<double>...
        function erfc_inv (line 7764) | double erfc_inv(double x) {
        function normal_quantile (line 7768) | double normal_quantile(double p) {
        function outlier_variance (line 7784) | double outlier_variance(Estimate<double> mean, Estimate<double> st...
        function bootstrap_analysis (line 7810) | bootstrap_analysis analyse_samples(double confidence_level, int n_...
      function keep_memory (line 6507) | inline void keep_memory(T* p) {
      type Detail (line 6514) | namespace Detail {
        function optimizer_barrier (line 6501) | inline void optimizer_barrier() { keep_memory(); }
        function optimizer_barrier (line 6515) | inline void optimizer_barrier() {
        type CompleteType (line 6552) | struct CompleteType { using type = T; }
        type CompleteType<void> (line 6554) | struct CompleteType<void> { struct type {}; }
          type type (line 6554) | struct type {}
        type CompleteInvoker (line 6560) | struct CompleteInvoker {
          method Result (line 6562) | static Result invoke(Fun&& fun, Args&&... args) {
        type CompleteInvoker<void> (line 6567) | struct CompleteInvoker<void> {
          method invoke (line 6569) | static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {
        function complete_invoke (line 6577) | CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(F...
        type ChronometerConcept (line 6600) | struct ChronometerConcept {
        type ChronometerModel (line 6606) | struct ChronometerModel final : public ChronometerConcept {
          method start (line 6607) | void start() override { started = Clock::now(); }
          method finish (line 6608) | void finish() override { finished = Clock::now(); }
          method elapsed (line 6610) | ClockDuration<Clock> elapsed() const { return finished - started; }
        type is_related (line 6698) | struct is_related
        type BenchmarkFunction (line 6708) | struct BenchmarkFunction {
          type callable (line 6710) | struct callable {
          type model (line 6716) | struct model : public callable {
            method model (line 6717) | model(Fun&& fun) : fun(std::move(fun)) {}
            method model (line 6718) | model(Fun const& fun) : fun(fun) {}
            method call (line 6722) | void call(Chronometer meter) const override {
            method call (line 6725) | void call(Chronometer meter, std::true_type) const {
            method call (line 6728) | void call(Chronometer meter, std::false_type) const {
          type do_nothing (line 6735) | struct do_nothing { void operator()() const {} }
          method BenchmarkFunction (line 6738) | BenchmarkFunction(model<T>* c) : f(c) {}
          method BenchmarkFunction (line 6741) | BenchmarkFunction()
          method BenchmarkFunction (line 6746) | BenchmarkFunction(Fun&& fun)
          method BenchmarkFunction (line 6749) | BenchmarkFunction(BenchmarkFunction&& that)
          method BenchmarkFunction (line 6752) | BenchmarkFunction(BenchmarkFunction const& that)
          method BenchmarkFunction (line 6755) | BenchmarkFunction& operator=(BenchmarkFunction&& that) {
          method BenchmarkFunction (line 6760) | BenchmarkFunction& operator=(BenchmarkFunction const& that) {
        type repeater (line 6787) | struct repeater {
        function repeat (line 6796) | repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {
        function measure (line 6842) | TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
        function measure_one (line 6861) | TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::f...
        function measure_one (line 6865) | TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters...
        type optimized_away_error (line 6875) | struct optimized_away_error : std::exception {
        function run_for_at_least (line 6882) | TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_...
        function OutlierClassification (line 6967) | OutlierClassification classify_outliers(Iterator first, Iterator l...
        function mean (line 6991) | double mean(Iterator first, Iterator last) {
        function sample (line 6998) | sample resample(URng& rng, int resamples, Iterator first, Iterator...
        function sample (line 7015) | sample jackknife(Estimator&& estimator, Iterator first, Iterator l...
        function normal_cdf (line 7029) | inline double normal_cdf(double x) {
        function bootstrap (line 7038) | Estimate<double> bootstrap(double confidence_level, Iterator first...
        type bootstrap_analysis (line 7079) | struct bootstrap_analysis {
        function resolution (line 7101) | std::vector<double> resolution(int k) {
        function warmup (line 7126) | int warmup() {
        function estimate_clock_resolution (line 7131) | EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_resolutio...
        function estimate_clock_cost (line 7140) | EnvironmentEstimate<FloatDuration<Clock>> estimate_clock_cost(Floa...
        function measure_environment (line 7168) | Environment<FloatDuration<Clock>> measure_environment() {
        function analyse (line 7237) | SampleAnalysis<Duration> analyse(const IConfig &cfg, Environment<D...
        type ObjectStorage (line 7396) | struct ObjectStorage
          method ObjectStorage (line 7398) | ObjectStorage() : data() {}
          method ObjectStorage (line 7400) | ObjectStorage(const ObjectStorage& other)
          method ObjectStorage (line 7405) | ObjectStorage(ObjectStorage&& other)
          method construct (line 7413) | void construct(Args&&... args)
          method destruct (line 7419) | typename std::enable_if<AllowManualDestruction>::type destruct()
          method destruct_on_exit (line 7427) | void destruct_on_exit(typename std::enable_if<Destruct, U>::type...
          method destruct_on_exit (line 7430) | void destruct_on_exit(typename std::enable_if<!Destruct, U>::typ...
          method T (line 7432) | T& stored_object() {
          method T (line 7436) | T const& stored_object() const {
        function weighted_average_quantile (line 7751) | double weighted_average_quantile(int k, int q, std::vector<double>...
        function erfc_inv (line 7764) | double erfc_inv(double x) {
        function normal_quantile (line 7768) | double normal_quantile(double p) {
        function outlier_variance (line 7784) | double outlier_variance(Estimate<double> mean, Estimate<double> st...
        function bootstrap_analysis (line 7810) | bootstrap_analysis analyse_samples(double confidence_level, int n_...
      function deoptimize_value (line 6523) | inline void deoptimize_value(T&& x) {
      function invoke_deoptimized (line 6528) | inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename ...
      function invoke_deoptimized (line 6533) | inline auto invoke_deoptimized(Fn&& fn, Args&&... args) -> typename ...
      type Detail (line 6550) | namespace Detail {
        function optimizer_barrier (line 6501) | inline void optimizer_barrier() { keep_memory(); }
        function optimizer_barrier (line 6515) | inline void optimizer_barrier() {
        type CompleteType (line 6552) | struct CompleteType { using type = T; }
        type CompleteType<void> (line 6554) | struct CompleteType<void> { struct type {}; }
          type type (line 6554) | struct type {}
        type CompleteInvoker (line 6560) | struct CompleteInvoker {
          method Result (line 6562) | static Result invoke(Fun&& fun, Args&&... args) {
        type CompleteInvoker<void> (line 6567) | struct CompleteInvoker<void> {
          method invoke (line 6569) | static CompleteType_t<void> invoke(Fun&& fun, Args&&... args) {
        function complete_invoke (line 6577) | CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(F...
        type ChronometerConcept (line 6600) | struct ChronometerConcept {
        type ChronometerModel (line 6606) | struct ChronometerModel final : public ChronometerConcept {
          method start (line 6607) | void start() override { started = Clock::now(); }
          method finish (line 6608) | void finish() override { finished = Clock::now(); }
          method elapsed (line 6610) | ClockDuration<Clock> elapsed() const { return finished - started; }
        type is_related (line 6698) | struct is_related
        type BenchmarkFunction (line 6708) | struct BenchmarkFunction {
          type callable (line 6710) | struct callable {
          type model (line 6716) | struct model : public callable {
            method model (line 6717) | model(Fun&& fun) : fun(std::move(fun)) {}
            method model (line 6718) | model(Fun const& fun) : fun(fun) {}
            method call (line 6722) | void call(Chronometer meter) const override {
            method call (line 6725) | void call(Chronometer meter, std::true_type) const {
            method call (line 6728) | void call(Chronometer meter, std::false_type) const {
          type do_nothing (line 6735) | struct do_nothing { void operator()() const {} }
          method BenchmarkFunction (line 6738) | BenchmarkFunction(model<T>* c) : f(c) {}
          method BenchmarkFunction (line 6741) | BenchmarkFunction()
          method BenchmarkFunction (line 6746) | BenchmarkFunction(Fun&& fun)
          method BenchmarkFunction (line 6749) | BenchmarkFunction(BenchmarkFunction&& that)
          method BenchmarkFunction (line 6752) | BenchmarkFunction(BenchmarkFunction const& that)
          method BenchmarkFunction (line 6755) | BenchmarkFunction& operator=(BenchmarkFunction&& that) {
          method BenchmarkFunction (line 6760) | BenchmarkFunction& operator=(BenchmarkFunction const& that) {
        type repeater (line 6787) | struct repeater {
        function repeat (line 6796) | repeater<typename std::decay<Fun>::type> repeat(Fun&& fun) {
        function measure (line 6842) | TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
        function measure_one (line 6861) | TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::f...
        function measure_one (line 6865) | TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters...
        type optimized_away_error (line 6875) | struct optimized_away_error : std::exception {
        function run_for_at_least (line 6882) | TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_...
        function OutlierClassification (line 6967) | OutlierClassification classify_outliers(Iterator first, Iterator l...
        function mean (line 6991) | double mean(Iterator first, Iterator last) {
        function sample (line 6998) | sample resample(URng& rng, int resamples, Iterator first, Iterator...
        function sample (line 7015) | sample jackknife(Estimator&& estimator, Iterator first, Iterator l...
        function normal_cdf (line 7029) | inline double norm
Condensed preview — 517 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,853K chars).
[
  {
    "path": ".clang-format",
    "chars": 349,
    "preview": "# http://clang.llvm.org/docs/ClangFormatStyleOptions.html\n\nBasedOnStyle: Google\nStandard: c++11\nAllowShortFunctionsOnASi"
  },
  {
    "path": ".devcontainer/clang10/devcontainer.json",
    "chars": 302,
    "preview": "{\n\t\"name\": \"Clang 10\",\n\t\"image\": \"conanio/clang10\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang10\"\n\t],\n\t\"customizations\": "
  },
  {
    "path": ".devcontainer/clang11/devcontainer.json",
    "chars": 302,
    "preview": "{\n\t\"name\": \"Clang 11\",\n\t\"image\": \"conanio/clang11\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang11\"\n\t],\n\t\"customizations\": "
  },
  {
    "path": ".devcontainer/clang13/Dockerfile",
    "chars": 142,
    "preview": "FROM ubuntu:22.04\n\nRUN apt-get update\nRUN apt-get install -y cmake git clang-13 libc++-13-dev libc++abi-13-dev\nENV CC=cl"
  },
  {
    "path": ".devcontainer/clang13/devcontainer.json",
    "chars": 318,
    "preview": "{\n\t\"name\": \"Clang 13\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\"\n\t},\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang13\"\n\t],\n\t\"c"
  },
  {
    "path": ".devcontainer/clang14/Dockerfile",
    "chars": 142,
    "preview": "FROM ubuntu:22.04\n\nRUN apt-get update\nRUN apt-get install -y cmake git clang-14 libc++-14-dev libc++abi-14-dev\nENV CC=cl"
  },
  {
    "path": ".devcontainer/clang14/devcontainer.json",
    "chars": 318,
    "preview": "{\n\t\"name\": \"Clang 14\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\"\n\t},\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang14\"\n\t],\n\t\"c"
  },
  {
    "path": ".devcontainer/clang15/Dockerfile",
    "chars": 142,
    "preview": "FROM ubuntu:22.04\n\nRUN apt-get update\nRUN apt-get install -y cmake git clang-15 libc++-15-dev libc++abi-15-dev\nENV CC=cl"
  },
  {
    "path": ".devcontainer/clang15/devcontainer.json",
    "chars": 318,
    "preview": "{\n\t\"name\": \"Clang 15\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\"\n\t},\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang15\"\n\t],\n\t\"c"
  },
  {
    "path": ".devcontainer/clang16/Dockerfile",
    "chars": 142,
    "preview": "FROM ubuntu:22.04\n\nRUN apt-get update\nRUN apt-get install -y cmake git clang-16 libc++-16-dev libc++abi-16-dev\nENV CC=cl"
  },
  {
    "path": ".devcontainer/clang16/devcontainer.json",
    "chars": 318,
    "preview": "{\n\t\"name\": \"Clang 16\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\"\n\t},\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang16\"\n\t],\n\t\"c"
  },
  {
    "path": ".devcontainer/clang17/Dockerfile",
    "chars": 142,
    "preview": "FROM ubuntu:24.04\n\nRUN apt-get update\nRUN apt-get install -y cmake git clang-17 libc++-17-dev libc++abi-17-dev\nENV CC=cl"
  },
  {
    "path": ".devcontainer/clang17/devcontainer.json",
    "chars": 318,
    "preview": "{\n\t\"name\": \"Clang 17\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\"\n\t},\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang17\"\n\t],\n\t\"c"
  },
  {
    "path": ".devcontainer/clang5/devcontainer.json",
    "chars": 300,
    "preview": "{\n\t\"name\": \"Clang 5\",\n\t\"image\": \"conanio/clang50\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang5\"\n\t],\n\t\"customizations\": {\n"
  },
  {
    "path": ".devcontainer/clang6/devcontainer.json",
    "chars": 300,
    "preview": "{\n\t\"name\": \"Clang 6\",\n\t\"image\": \"conanio/clang60\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang6\"\n\t],\n\t\"customizations\": {\n"
  },
  {
    "path": ".devcontainer/clang7/devcontainer.json",
    "chars": 299,
    "preview": "{\n\t\"name\": \"Clang 7\",\n\t\"image\": \"conanio/clang7\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang7\"\n\t],\n\t\"customizations\": {\n\t"
  },
  {
    "path": ".devcontainer/clang8/devcontainer.json",
    "chars": 299,
    "preview": "{\n\t\"name\": \"Clang 8\",\n\t\"image\": \"conanio/clang8\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang8\"\n\t],\n\t\"customizations\": {\n\t"
  },
  {
    "path": ".devcontainer/clang9/devcontainer.json",
    "chars": 299,
    "preview": "{\n\t\"name\": \"Clang 9\",\n\t\"image\": \"conanio/clang9\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-clang9\"\n\t],\n\t\"customizations\": {\n\t"
  },
  {
    "path": ".devcontainer/gcc10/devcontainer.json",
    "chars": 296,
    "preview": "{\n\t\"name\": \"GCC 10\",\n\t\"image\": \"conanio/gcc10\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc10\"\n\t],\n\t\"customizations\": {\n\t\t\"v"
  },
  {
    "path": ".devcontainer/gcc11/devcontainer.json",
    "chars": 296,
    "preview": "{\n\t\"name\": \"GCC 11\",\n\t\"image\": \"conanio/gcc11\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc11\"\n\t],\n\t\"customizations\": {\n\t\t\"v"
  },
  {
    "path": ".devcontainer/gcc12/Dockerfile",
    "chars": 78,
    "preview": "FROM ubuntu:22.04\n\nRUN apt-get update\nRUN apt-get install -y cmake git g++-12\n"
  },
  {
    "path": ".devcontainer/gcc12/devcontainer.json",
    "chars": 315,
    "preview": "{\n\t\"name\": \"GCC 12\",\n\t\"build\": {\n\t\t\"dockerfile\": \"Dockerfile\",\n\t},\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc12\"\n\t],\n\t\"cust"
  },
  {
    "path": ".devcontainer/gcc48/devcontainer.json",
    "chars": 367,
    "preview": "{\n\t\"name\": \"GCC 4.8\",\n\t\"image\": \"conanio/gcc48\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc48\"\n\t],\n\t\"customizations\": {\n\t\t\""
  },
  {
    "path": ".devcontainer/gcc5/devcontainer.json",
    "chars": 293,
    "preview": "{\n\t\"name\": \"GCC 5\",\n\t\"image\": \"conanio/gcc5\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc5\"\n\t],\n\t\"customizations\": {\n\t\t\"vsco"
  },
  {
    "path": ".devcontainer/gcc6/devcontainer.json",
    "chars": 293,
    "preview": "{\n\t\"name\": \"GCC 6\",\n\t\"image\": \"conanio/gcc6\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc6\"\n\t],\n\t\"customizations\": {\n\t\t\"vsco"
  },
  {
    "path": ".devcontainer/gcc7/devcontainer.json",
    "chars": 293,
    "preview": "{\n\t\"name\": \"GCC 7\",\n\t\"image\": \"conanio/gcc7\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc7\"\n\t],\n\t\"customizations\": {\n\t\t\"vsco"
  },
  {
    "path": ".devcontainer/gcc8/devcontainer.json",
    "chars": 293,
    "preview": "{\n\t\"name\": \"GCC 8\",\n\t\"image\": \"conanio/gcc8\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc8\"\n\t],\n\t\"customizations\": {\n\t\t\"vsco"
  },
  {
    "path": ".devcontainer/gcc9/devcontainer.json",
    "chars": 293,
    "preview": "{\n\t\"name\": \"GCC 9\",\n\t\"image\": \"conanio/gcc9\",\n\t\"runArgs\": [\n\t\t\"--name=ArduinoJson-gcc9\"\n\t],\n\t\"customizations\": {\n\t\t\"vsco"
  },
  {
    "path": ".gitattributes",
    "chars": 29,
    "preview": "* text=auto\n*.sh text eol=lf\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 98,
    "preview": "github: bblanchon\ncustom:\n  - https://arduinojson.org/book/\n  - https://donate.benoitblanchon.fr/\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1238,
    "preview": "---\nname: 🐛 Bug report\nabout: Report a bug in ArduinoJson\ntitle: ''\nlabels: 'bug'\nassignees: ''\n---\n\n<!-- ⚠️ IMPORTANT ⚠"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 419,
    "preview": "blank_issues_enabled: true\ncontact_links:\n  - name: 👨‍🏫 ArduinoJson Assistant\n    url: https://arduinojson.org/v7/assist"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 612,
    "preview": "---\nname: 💡 Feature request\nabout: Suggest an idea for ArduinoJson\ntitle: ''\nlabels: enhancement\nassignees: ''\n---\n\n**Is"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/help.md",
    "chars": 1190,
    "preview": "---\nname: 😭 Help!\nabout: Ask for help\ntitle: ''\nlabels: 'question'\nassignees: ''\n---\n\n<!-- ⚠️ IMPORTANT ⚠️\nBefore asking"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 20588,
    "preview": "name: Continuous Integration\n\non: [push, pull_request]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n "
  },
  {
    "path": ".github/workflows/lock.yml",
    "chars": 243,
    "preview": "name: Lock Threads\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n\njobs:\n  lock:\n    runs-on: ubuntu-latest\n    steps:\n      -"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 2917,
    "preview": "name: Release\n\non:\n  push:\n    tags:\n      - v*.*.*\n\njobs:\n  release:\n    name: Create release\n    runs-on: ubuntu-22.04"
  },
  {
    "path": ".gitignore",
    "chars": 269,
    "preview": ".DS_Store\n/.idea\n/build\n/bin\n/lib\n/sftp-config.json\n.tags\n.tags_sorted_by_file\n/extras/fuzzing/*_fuzzer\n/extras/fuzzing/"
  },
  {
    "path": ".mbedignore",
    "chars": 42,
    "preview": ".devcontainer/\n.github/\nexamples/\nextras/\n"
  },
  {
    "path": ".prettierignore",
    "chars": 5,
    "preview": "*.md\n"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 420,
    "preview": "{\n  \"C_Cpp.default.configurationProvider\": \"ms-vscode.cmake-tools\",\n  \"git.inputValidationLength\": 80,\n  \"git.inputValid"
  },
  {
    "path": "ArduinoJson.h",
    "chars": 128,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include \"src/Arduino"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 10742,
    "preview": "ArduinoJson: change log\r\n=======================\r\n\r\nHEAD\r\n----\r\n\r\n* Don't store string literals by pointer anymore (issu"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 561,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\ncmake_minimum_required(V"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 265,
    "preview": "# Contribution to ArduinoJson\n\nFirst, thank you for taking the time to contribute to this project.\n\nYou can submit chang"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1108,
    "preview": "The MIT License (MIT)\n---------------------\n\nCopyright © 2014-2025, Benoit BLANCHON\n\nPermission is hereby granted, free "
  },
  {
    "path": "README.md",
    "chars": 9721,
    "preview": "<p align=\"center\">\r\n  <a href=\"https://arduinojson.org/\"><img alt=\"ArduinoJson\" src=\"https://arduinojson.org/images/logo"
  },
  {
    "path": "SUPPORT.md",
    "chars": 871,
    "preview": "# ArduinoJson Support\n\nFirst off, thank you very much for using ArduinoJson.\n\nWe'll be very happy to help you, but first"
  },
  {
    "path": "appveyor.yml",
    "chars": 1292,
    "preview": "version: 7.4.2.{build}\nenvironment:\n  matrix:\n    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022\n      CMAKE_GENERATO"
  },
  {
    "path": "component.mk",
    "chars": 33,
    "preview": "COMPONENT_ADD_INCLUDEDIRS := src\n"
  },
  {
    "path": "examples/JsonConfigFile/JsonConfigFile.ino",
    "chars": 4135,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/JsonFilterExample/JsonFilterExample.ino",
    "chars": 2546,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/JsonGeneratorExample/JsonGeneratorExample.ino",
    "chars": 1727,
    "preview": "// ArduinoJson - https://arduinojson.org\r\n// Copyright © 2014-2025, Benoit BLANCHON\r\n// MIT License\r\n//\r\n// This example"
  },
  {
    "path": "examples/JsonHttpClient/JsonHttpClient.ino",
    "chars": 3237,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/JsonParserExample/JsonParserExample.ino",
    "chars": 1830,
    "preview": "// ArduinoJson - https://arduinojson.org\r\n// Copyright © 2014-2025, Benoit BLANCHON\r\n// MIT License\r\n//\r\n// This example"
  },
  {
    "path": "examples/JsonServer/JsonServer.ino",
    "chars": 3126,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/JsonUdpBeacon/JsonUdpBeacon.ino",
    "chars": 2802,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/MsgPackParser/MsgPackParser.ino",
    "chars": 1611,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/ProgmemExample/ProgmemExample.ino",
    "chars": 2069,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "examples/StringExample/StringExample.ino",
    "chars": 2610,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "extras/ArduinoJsonConfig.cmake.in",
    "chars": 125,
    "preview": "@PACKAGE_INIT@\n\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake\")\ncheck_required_components(\"@PROJECT_NAM"
  },
  {
    "path": "extras/CompileOptions.cmake",
    "chars": 2586,
    "preview": "if(NOT DEFINED COVERAGE)\n\tset(COVERAGE OFF)\nendif()\n\nif(CMAKE_CXX_COMPILER_ID MATCHES \"(GNU|Clang)\")\n\tadd_compile_option"
  },
  {
    "path": "extras/ci/espidf/CMakeLists.txt",
    "chars": 200,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\ncmake_minimum_required(V"
  },
  {
    "path": "extras/ci/espidf/main/CMakeLists.txt",
    "chars": 156,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nidf_component_register(\n"
  },
  {
    "path": "extras/ci/espidf/main/component.mk",
    "chars": 145,
    "preview": "#\n# \"main\" pseudo-component makefile.\n#\n# (Uses default behaviour of compiling all source files in directory, adding 'in"
  },
  {
    "path": "extras/ci/espidf/main/main.cpp",
    "chars": 353,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/ci/particle.sh",
    "chars": 164,
    "preview": "#!/bin/sh -ex\n\nBOARD=$1\n\ncd \"$(dirname \"$0\")/../../\"\n\ncp extras/particle/src/smocktest.ino src/\ncp extras/particle/proje"
  },
  {
    "path": "extras/conf_test/avr.cpp",
    "chars": 590,
    "preview": "#include <ArduinoJson.h>\n\nstatic_assert(ARDUINOJSON_ENABLE_PROGMEM == 1, \"ARDUINOJSON_ENABLE_PROGMEM\");\n\nstatic_assert(A"
  },
  {
    "path": "extras/conf_test/esp8266.cpp",
    "chars": 512,
    "preview": "#include <ArduinoJson.h>\n\nstatic_assert(ARDUINOJSON_USE_LONG_LONG == 1, \"ARDUINOJSON_USE_LONG_LONG\");\n\nstatic_assert(ARD"
  },
  {
    "path": "extras/conf_test/x64.cpp",
    "chars": 496,
    "preview": "#include <ArduinoJson.h>\n\nstatic_assert(ARDUINOJSON_USE_LONG_LONG == 1, \"ARDUINOJSON_USE_LONG_LONG\");\n\nstatic_assert(ARD"
  },
  {
    "path": "extras/conf_test/x86.cpp",
    "chars": 495,
    "preview": "#include <ArduinoJson.h>\n\nstatic_assert(ARDUINOJSON_USE_LONG_LONG == 1, \"ARDUINOJSON_USE_LONG_LONG\");\n\nstatic_assert(ARD"
  },
  {
    "path": "extras/fuzzing/CMakeLists.txt",
    "chars": 1913,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nset(CMAKE_CXX_STANDARD 1"
  },
  {
    "path": "extras/fuzzing/Makefile",
    "chars": 706,
    "preview": "# CAUTION: this file is invoked by https://github.com/google/oss-fuzz\n\nCXXFLAGS += -I../../src -DARDUINOJSON_DEBUG=1 -st"
  },
  {
    "path": "extras/fuzzing/json_corpus/.gitignore",
    "chars": 14,
    "preview": "*\n!.gitignore\n"
  },
  {
    "path": "extras/fuzzing/json_fuzzer.cpp",
    "chars": 271,
    "preview": "#include <ArduinoJson.h>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  JsonDocument doc;\n"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/Comments.json",
    "chars": 177,
    "preview": "//comment\n/*comment*/\n[ //comment\n/*comment*/\"comment\"/*comment*/,//comment\n/*comment*/{//comment\n/* comment*/\"key\"//com"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/EmptyArray.json",
    "chars": 2,
    "preview": "[]"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/EmptyObject.json",
    "chars": 2,
    "preview": "{}"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/ExcessiveNesting.json",
    "chars": 611,
    "preview": "[1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15,[16,[17,[18,[19,[20,[21,[22,[23,[24,[25,[26,[27,[28,[29,[30,[31,[32,["
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/IntegerOverflow.json",
    "chars": 20,
    "preview": "9720730739393920739\n"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/Numbers.json",
    "chars": 235,
    "preview": "[\n  123,\n  -123,\n  123.456,\n  -123.456,\n  12e34,\n  12e-34,\n  12e+34,\n  12E34,\n  12E-34,\n  12E+34,\n  12.34e56,\n  12.34e-5"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/OpenWeatherMap.json",
    "chars": 834,
    "preview": "{\n  \"coord\": {\n    \"lon\": -0.13,\n    \"lat\": 51.51\n  },\n  \"weather\": [\n    {\n      \"id\": 301,\n      \"main\": \"Drizzle\",\n  "
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/Strings.json",
    "chars": 92,
    "preview": "[\n  \"hello\",\n  'hello',\n  hello,\n  {\"hello\":\"world\"},\n  {'hello':'world'},\n  {hello:world}\n]"
  },
  {
    "path": "extras/fuzzing/json_seed_corpus/WeatherUnderground.json",
    "chars": 2937,
    "preview": "{\n  \"response\": {\n    \"version\": \"0.1\",\n    \"termsofService\": \"http://www.wunderground.com/weather/api/d/terms.html\",\n  "
  },
  {
    "path": "extras/fuzzing/msgpack_corpus/.gitignore",
    "chars": 14,
    "preview": "*\n!.gitignore\n"
  },
  {
    "path": "extras/fuzzing/msgpack_fuzzer.cpp",
    "chars": 277,
    "preview": "#include <ArduinoJson.h>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  JsonDocument doc;\n"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/false",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/fixarray",
    "chars": 10,
    "preview": "helloworld"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/fixint_negative",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/fixint_positive",
    "chars": 1,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/fixmap",
    "chars": 8,
    "preview": "one\u0001two\u0002"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/fixstr",
    "chars": 11,
    "preview": "hello world"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/float32",
    "chars": 2,
    "preview": "@H"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/float64",
    "chars": 5,
    "preview": "@\t!\u0012o"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/int16",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/int32",
    "chars": 3,
    "preview": "Ҷi."
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/int64",
    "chars": 4,
    "preview": "\u00124Vx"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/int8",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/nil",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/str8",
    "chars": 6,
    "preview": "\u0005hello"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/true",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/uint16",
    "chars": 2,
    "preview": "09"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/uint32",
    "chars": 4,
    "preview": "\u00124Vx"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/uint64",
    "chars": 4,
    "preview": "\u00124Vx"
  },
  {
    "path": "extras/fuzzing/msgpack_seed_corpus/uint8",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "extras/fuzzing/number_corpus/.gitignore",
    "chars": 14,
    "preview": "*\n!.gitignore\n"
  },
  {
    "path": "extras/fuzzing/number_fuzzer.cpp",
    "chars": 283,
    "preview": "#include <ArduinoJson.h>\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n  // Make a copy to "
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/decimal_half",
    "chars": 4,
    "preview": "0.5\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/decimal_one_and_half",
    "chars": 4,
    "preview": "1.5\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/infinity",
    "chars": 9,
    "preview": "infinity\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/issue2220-1",
    "chars": 551,
    "preview": "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/issue2220-2",
    "chars": 551,
    "preview": "0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/large_decimal",
    "chars": 14,
    "preview": "999999.999999\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/large_integer",
    "chars": 11,
    "preview": "9876543210\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/leading_zeros",
    "chars": 8,
    "preview": "0.00001\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/nan",
    "chars": 4,
    "preview": "nan\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/negative_decimal",
    "chars": 9,
    "preview": "-123.456\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/negative_one",
    "chars": 3,
    "preview": "-1\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/negative_scientific",
    "chars": 8,
    "preview": "-2.5e-3\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/negative_scientific_large_exp",
    "chars": 13,
    "preview": "-1.23456e+20\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/negative_zero",
    "chars": 3,
    "preview": "-0\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/one",
    "chars": 2,
    "preview": "1\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/pi_approximation",
    "chars": 14,
    "preview": "3.14159265359\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/scientific_e10",
    "chars": 5,
    "preview": "1e10\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/scientific_e_minus",
    "chars": 8,
    "preview": "1.5e-10\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/scientific_e_plus",
    "chars": 8,
    "preview": "1.23e+5\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/small_decimal",
    "chars": 6,
    "preview": "0.001\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/small_integer",
    "chars": 3,
    "preview": "42\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/trailing_zeros",
    "chars": 8,
    "preview": "1000000\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/very_small_positive",
    "chars": 10,
    "preview": "0.0000001\n"
  },
  {
    "path": "extras/fuzzing/number_seed_corpus/zero",
    "chars": 2,
    "preview": "0\n"
  },
  {
    "path": "extras/fuzzing/reproducer.cpp",
    "chars": 1224,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n// This file is NOT u"
  },
  {
    "path": "extras/particle/project.properties",
    "chars": 19,
    "preview": "name=ArduinoJsonCI\n"
  },
  {
    "path": "extras/particle/src/smocktest.ino",
    "chars": 58,
    "preview": "#include \"ArduinoJson.h\"\n\nvoid setup() {}\n\nvoid loop() {}\n"
  },
  {
    "path": "extras/scripts/build-single-header.sh",
    "chars": 1805,
    "preview": "#!/bin/bash\n\nset -e\n\nRE_RELATIVE_INCLUDE='^#[[:space:]]*include[[:space:]]*\"(.*)\"'\nRE_ABSOLUTE_INCLUDE='^#[[:space:]]*in"
  },
  {
    "path": "extras/scripts/extract_changes.awk",
    "chars": 487,
    "preview": "#!/usr/bin/awk -f\n\n# Start echoing after the first list item\n/\\* / {\n    STARTED=1\n    EMPTY_LINE=0\n}\n\n# Remember if we "
  },
  {
    "path": "extras/scripts/get-release-page.sh",
    "chars": 256,
    "preview": "#!/bin/bash\n\nset -eu\n\nVERSION=\"$1\"\nCHANGELOG=\"$2\"\nARDUINOJSON_H=\"$3\"\n\ncat << END\n---\nbranch: v7\nversion: $VERSION\ndate: "
  },
  {
    "path": "extras/scripts/publish-particle-library.sh",
    "chars": 487,
    "preview": "#!/usr/bin/env bash\n\nset -eu\n\nSOURCE_DIR=\"$(dirname \"$0\")/../..\"\nWORK_DIR=$(mktemp -d)\ntrap 'rm -rf \"$WORK_DIR\"' EXIT\n\nc"
  },
  {
    "path": "extras/scripts/publish.sh",
    "chars": 2653,
    "preview": "#!/usr/bin/env bash\n\nset -eu\n\nwhich awk sed jq curl perl >/dev/null\n\ncd \"$(dirname \"$0\")/../..\"\n\nif ! git diff --quiet -"
  },
  {
    "path": "extras/scripts/wandbox/JsonGeneratorExample.cpp",
    "chars": 972,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "extras/scripts/wandbox/JsonParserExample.cpp",
    "chars": 1114,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "extras/scripts/wandbox/MsgPackParserExample.cpp",
    "chars": 1471,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n//\n// This example sho"
  },
  {
    "path": "extras/scripts/wandbox/publish.sh",
    "chars": 652,
    "preview": "#!/usr/bin/env bash\n\nset -eu\n\nARDUINOJSON_H=\"$1\"\n\nread_string() {\n\tjq --slurp --raw-input '.' \"$1\"\n}\n\ncompile() {\n\tFILE_"
  },
  {
    "path": "extras/tests/.clang-tidy",
    "chars": 62,
    "preview": "Checks:              '-clang-analyzer-security.insecureAPI.*'\n"
  },
  {
    "path": "extras/tests/CMakeLists.txt",
    "chars": 986,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nset(CMAKE_CXX_STANDARD 1"
  },
  {
    "path": "extras/tests/Cpp17/CMakeLists.txt",
    "chars": 551,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nif(MSVC_VERSION LESS 191"
  },
  {
    "path": "extras/tests/Cpp17/string_view.cpp",
    "chars": 3306,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n// we expect ArduinoJ"
  },
  {
    "path": "extras/tests/Cpp20/CMakeLists.txt",
    "chars": 552,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nif(MSVC_VERSION LESS 191"
  },
  {
    "path": "extras/tests/Cpp20/smoke_test.cpp",
    "chars": 299,
    "preview": "#include <ArduinoJson.h>\n\n#include <catch.hpp>\n#include <string>\n\nTEST_CASE(\"C++20 smoke test\") {\n  JsonDocument doc;\n\n "
  },
  {
    "path": "extras/tests/Deprecated/BasicJsonDocument.cpp",
    "chars": 1487,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/CMakeLists.txt",
    "chars": 561,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nif(CMAKE_CXX_COMPILER_ID"
  },
  {
    "path": "extras/tests/Deprecated/DynamicJsonDocument.cpp",
    "chars": 895,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/StaticJsonDocument.cpp",
    "chars": 798,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/add.cpp",
    "chars": 845,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/containsKey.cpp",
    "chars": 5420,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/createNestedArray.cpp",
    "chars": 2936,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/createNestedObject.cpp",
    "chars": 3359,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/macros.cpp",
    "chars": 450,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/memoryUsage.cpp",
    "chars": 1087,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/Deprecated/shallowCopy.cpp",
    "chars": 317,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/FailingBuilds/CMakeLists.txt",
    "chars": 820,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nmacro(add_failing_build "
  },
  {
    "path": "extras/tests/FailingBuilds/Issue978.cpp",
    "chars": 233,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/FailingBuilds/assign_char.cpp",
    "chars": 202,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/FailingBuilds/deserialize_object.cpp",
    "chars": 206,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/FailingBuilds/read_long_long.cpp",
    "chars": 390,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#define ARDUINOJSON_U"
  },
  {
    "path": "extras/tests/FailingBuilds/variant_as_char.cpp",
    "chars": 207,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/FailingBuilds/write_long_long.cpp",
    "chars": 347,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#define ARDUINOJSON_U"
  },
  {
    "path": "extras/tests/Helpers/Allocators.hpp",
    "chars": 7001,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/Helpers/Arduino.h",
    "chars": 256,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/Helpers/CustomReader.hpp",
    "chars": 511,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/Helpers/Literals.hpp",
    "chars": 276,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/Helpers/api/Print.h",
    "chars": 687,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/Helpers/api/Stream.h",
    "chars": 306,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n// Repr"
  },
  {
    "path": "extras/tests/Helpers/api/String.h",
    "chars": 1407,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/Helpers/avr/pgmspace.h",
    "chars": 940,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#pragma once\n\n#includ"
  },
  {
    "path": "extras/tests/IntegrationTests/CMakeLists.txt",
    "chars": 509,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nadd_executable(Integrati"
  },
  {
    "path": "extras/tests/IntegrationTests/gbathree.cpp",
    "chars": 4764,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/IntegrationTests/issue772.cpp",
    "chars": 884,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/IntegrationTests/openweathermap.cpp",
    "chars": 21719,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/IntegrationTests/round_trip.cpp",
    "chars": 4498,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/CMakeLists.txt",
    "chars": 376,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nadd_executable(JsonArray"
  },
  {
    "path": "extras/tests/JsonArray/add.cpp",
    "chars": 7227,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/clear.cpp",
    "chars": 1091,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/compare.cpp",
    "chars": 13296,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/copyArray.cpp",
    "chars": 8625,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/equals.cpp",
    "chars": 1279,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/isNull.cpp",
    "chars": 686,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/iterator.cpp",
    "chars": 732,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/nesting.cpp",
    "chars": 752,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/remove.cpp",
    "chars": 2743,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/size.cpp",
    "chars": 650,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/subscript.cpp",
    "chars": 4202,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArray/unbound.cpp",
    "chars": 535,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArrayConst/CMakeLists.txt",
    "chars": 323,
    "preview": "# ArduinoJson - https://arduinojson.org\n# Copyright © 2014-2025, Benoit BLANCHON\n# MIT License\n\nadd_executable(JsonArray"
  },
  {
    "path": "extras/tests/JsonArrayConst/equals.cpp",
    "chars": 1294,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArrayConst/isNull.cpp",
    "chars": 716,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArrayConst/iterator.cpp",
    "chars": 753,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArrayConst/nesting.cpp",
    "chars": 753,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArrayConst/size.cpp",
    "chars": 552,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  },
  {
    "path": "extras/tests/JsonArrayConst/subscript.cpp",
    "chars": 598,
    "preview": "// ArduinoJson - https://arduinojson.org\n// Copyright © 2014-2025, Benoit BLANCHON\n// MIT License\n\n#include <ArduinoJson"
  }
]

// ... and 317 more files (download for full content)

About this extraction

This page contains the full source code of the bblanchon/ArduinoJson GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 517 files (1.6 MB), approximately 442.7k tokens, and a symbol index with 2431 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!