overworked doxygen
This commit is contained in:
parent
0abac59291
commit
e63c508172
62 changed files with 3851 additions and 870 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,3 +1,6 @@
|
|||
json_unit
|
||||
json_benchmarks
|
||||
|
||||
working
|
||||
|
||||
html
|
||||
|
|
58
Doxyfile
58
Doxyfile
|
@ -27,7 +27,9 @@ MULTILINE_CPP_IS_BRIEF = NO
|
|||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 4
|
||||
ALIASES =
|
||||
ALIASES = "complexity=@par Complexity\n"
|
||||
ALIASES += liveexample{2}="@par Example\n \1 \n @includelineno \2.cpp \n Output:\n @verbinclude \2.output"
|
||||
ALIASES += requirement="@par Requirements\n"
|
||||
TCL_SUBST =
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = NO
|
||||
|
@ -50,7 +52,7 @@ LOOKUP_CACHE_SIZE = 0
|
|||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = YES
|
||||
EXTRACT_PRIVATE = YES
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_PACKAGE = YES
|
||||
EXTRACT_STATIC = YES
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
|
@ -69,7 +71,7 @@ SHOW_GROUPED_MEMB_INC = NO
|
|||
FORCE_LOCAL_INCLUDES = NO
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = YES
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_BRIEF_DOCS = YES
|
||||
SORT_MEMBERS_CTORS_1ST = YES
|
||||
SORT_GROUP_NAMES = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
|
@ -80,9 +82,9 @@ GENERATE_BUGLIST = YES
|
|||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_USED_FILES = NO
|
||||
SHOW_FILES = YES
|
||||
SHOW_NAMESPACES = YES
|
||||
SHOW_NAMESPACES = NO
|
||||
FILE_VERSION_FILTER =
|
||||
LAYOUT_FILE =
|
||||
CITE_BIB_FILES =
|
||||
|
@ -99,18 +101,18 @@ WARN_LOGFILE =
|
|||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = src/json.hpp
|
||||
INPUT = src/json.hpp docs/doxyindex.cpp
|
||||
INPUT_ENCODING = UTF-8
|
||||
FILE_PATTERNS =
|
||||
RECURSIVE = NO
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXCLUDE_SYMBOLS = nlohmann::internals
|
||||
EXAMPLE_PATH = docs/examples
|
||||
EXAMPLE_PATTERNS =
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH =
|
||||
IMAGE_PATH = docs/images
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
|
@ -119,15 +121,15 @@ USE_MDFILE_AS_MAINPAGE =
|
|||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = YES
|
||||
INLINE_SOURCES = YES
|
||||
SOURCE_BROWSER = NO
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = YES
|
||||
REFERENCES_RELATION = YES
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
REFERENCED_BY_RELATION = NO
|
||||
REFERENCES_RELATION = NO
|
||||
REFERENCES_LINK_SOURCE = NO
|
||||
SOURCE_TOOLTIPS = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = YES
|
||||
VERBATIM_HEADERS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
|
@ -153,15 +155,15 @@ HTML_DYNAMIC_SECTIONS = NO
|
|||
HTML_INDEX_NUM_ENTRIES = 100
|
||||
GENERATE_DOCSET = NO
|
||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
||||
DOCSET_BUNDLE_ID = me.nlohmann.json
|
||||
DOCSET_PUBLISHER_ID = me.nlohmann
|
||||
DOCSET_PUBLISHER_NAME = Publisher
|
||||
GENERATE_HTMLHELP = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
CHM_INDEX_ENCODING =
|
||||
BINARY_TOC = NO
|
||||
BINARY_TOC = YES
|
||||
TOC_EXPAND = NO
|
||||
GENERATE_QHP = NO
|
||||
QCH_FILE =
|
||||
|
@ -277,7 +279,7 @@ PERL_PATH = /usr/bin/perl
|
|||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the dot tool
|
||||
#---------------------------------------------------------------------------
|
||||
CLASS_DIAGRAMS = YES
|
||||
CLASS_DIAGRAMS = NO
|
||||
MSCGEN_PATH =
|
||||
DIA_PATH =
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
|
@ -286,18 +288,18 @@ DOT_NUM_THREADS = 0
|
|||
DOT_FONTNAME = Helvetica
|
||||
DOT_FONTSIZE = 10
|
||||
DOT_FONTPATH =
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
CLASS_GRAPH = NO
|
||||
COLLABORATION_GRAPH = NO
|
||||
GROUP_GRAPHS = YES
|
||||
UML_LOOK = YES
|
||||
UML_LIMIT_NUM_FIELDS = 10
|
||||
TEMPLATE_RELATIONS = YES
|
||||
INCLUDE_GRAPH = YES
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
CALL_GRAPH = YES
|
||||
CALLER_GRAPH = YES
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DIRECTORY_GRAPH = YES
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = NO
|
||||
INCLUDED_BY_GRAPH = NO
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = NO
|
||||
DIRECTORY_GRAPH = NO
|
||||
DOT_IMAGE_FORMAT = svg
|
||||
INTERACTIVE_SVG = YES
|
||||
DOT_PATH =
|
||||
|
|
6
Makefile
6
Makefile
|
@ -30,7 +30,11 @@ pretty:
|
|||
--indent-col1-comments --pad-oper --pad-header --align-pointer=type \
|
||||
--align-reference=type --add-brackets --convert-tabs --close-templates \
|
||||
--lineend=linux --preserve-date --suffix=none \
|
||||
src/json.hpp src/json.hpp.re2c test/unit.cpp benchmarks/benchmarks.cpp
|
||||
src/json.hpp src/json.hpp.re2c test/unit.cpp benchmarks/benchmarks.cpp docs/examples/*.cpp
|
||||
|
||||
# update docs
|
||||
update_docs:
|
||||
make create -C docs/examples
|
||||
|
||||
# benchmarks
|
||||
json_benchmarks: benchmarks/benchmarks.cpp benchmarks/benchpress.hpp benchmarks/cxxopts.hpp src/json.hpp
|
||||
|
|
|
@ -272,7 +272,7 @@ std::vector<int> c_vector {1, 2, 3, 4};
|
|||
json j_vec(c_vector);
|
||||
// [1, 2, 3, 4]
|
||||
|
||||
std::deque<float> c_deque {1.2, 2.3, 3.4, 5.6};
|
||||
std::deque<double> c_deque {1.2, 2.3, 3.4, 5.6};
|
||||
json j_deque(c_deque);
|
||||
// [1.2, 2.3, 3.4, 5.6]
|
||||
|
||||
|
@ -312,7 +312,7 @@ std::map<std::string, int> c_map { {"one", 1}, {"two", 2}, {"three", 3} };
|
|||
json j_map(c_map);
|
||||
// {"one": 1, "two": 2, "three": 3}
|
||||
|
||||
std::unordered_map<const char*, float> c_umap { {"one", 1.2}, {"two", 2.3}, {"three", 3.4} };
|
||||
std::unordered_map<const char*, double> c_umap { {"one", 1.2}, {"two", 2.3}, {"three", 3.4} };
|
||||
json j_umap(c_umap);
|
||||
// {"one": 1.2, "two": 2.3, "three": 3.4}
|
||||
|
||||
|
|
21
docs/doxyindex.cpp
Normal file
21
docs/doxyindex.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
/*!
|
||||
@mainpage
|
||||
|
||||
@copyright Niels Lohmann\n
|
||||
@include "../../LICENSE.MIT"
|
||||
*/
|
||||
|
||||
/*!
|
||||
@defgroup container Container
|
||||
|
||||
@brief methods and types to satisfy the Container requirements
|
||||
|
||||
A Container is an object used to store other objects and taking care of the
|
||||
management of the memory used by the objects it contains.
|
||||
|
||||
@see http://en.cppreference.com/w/cpp/concept/Container
|
||||
*/
|
||||
|
||||
/*!
|
||||
@defgroup reversiblecontainer Reversible Container
|
||||
*/
|
25
docs/examples/Makefile
Normal file
25
docs/examples/Makefile
Normal file
|
@ -0,0 +1,25 @@
|
|||
SRCDIR = ../../src
|
||||
|
||||
EXAMPLES = $(wildcard *.cpp)
|
||||
|
||||
all:
|
||||
@echo "check"
|
||||
@echo "create"
|
||||
|
||||
clean:
|
||||
rm -f $(EXAMPLES:.cpp=) $(EXAMPLES:.cpp=.output) $(EXAMPLES:.cpp=.test)
|
||||
|
||||
%.output: %.cpp
|
||||
make $(<:.cpp=) CPPFLAGS="-I $(SRCDIR)" CXXFLAGS="-std=c++11"
|
||||
./$(<:.cpp=) > $@
|
||||
rm $(<:.cpp=)
|
||||
|
||||
%.test: %.cpp
|
||||
make $(<:.cpp=) CPPFLAGS="-I $(SRCDIR)" CXXFLAGS="-std=c++11"
|
||||
./$(<:.cpp=) > $@
|
||||
diff $@ $(<:.cpp=.output)
|
||||
rm $(<:.cpp=) $@
|
||||
|
||||
create: $(EXAMPLES:.cpp=.output)
|
||||
|
||||
check: $(EXAMPLES:.cpp=.test)
|
12
docs/examples/basic_json.cpp
Normal file
12
docs/examples/basic_json.cpp
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create a JSON value with default null value
|
||||
json j;
|
||||
|
||||
// serialize the JSON null value
|
||||
std::cout << j << '\n';
|
||||
}
|
1
docs/examples/basic_json.output
Normal file
1
docs/examples/basic_json.output
Normal file
|
@ -0,0 +1 @@
|
|||
null
|
58
docs/examples/basic_json__CompatibleArrayType.cpp
Normal file
58
docs/examples/basic_json__CompatibleArrayType.cpp
Normal file
|
@ -0,0 +1,58 @@
|
|||
#include <json.hpp>
|
||||
#include <deque>
|
||||
#include <list>
|
||||
#include <forward_list>
|
||||
#include <set>
|
||||
#include <unordered_set>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array from std::vector
|
||||
std::vector<int> c_vector {1, 2, 3, 4};
|
||||
json j_vec(c_vector);
|
||||
|
||||
// create an array from std::deque
|
||||
std::deque<double> c_deque {1.2, 2.3, 3.4, 5.6};
|
||||
json j_deque(c_deque);
|
||||
|
||||
// create an array from std::list
|
||||
std::list<bool> c_list {true, true, false, true};
|
||||
json j_list(c_list);
|
||||
|
||||
// create an array from std::forward_list
|
||||
std::forward_list<int64_t> c_flist {12345678909876, 23456789098765, 34567890987654, 45678909876543};
|
||||
json j_flist(c_flist);
|
||||
|
||||
// create an array from std::array
|
||||
std::array<unsigned long, 4> c_array {{1, 2, 3, 4}};
|
||||
json j_array(c_array);
|
||||
|
||||
// create an array from std::set
|
||||
std::set<std::string> c_set {"one", "two", "three", "four", "one"};
|
||||
json j_set(c_set); // only one entry for "one" is used
|
||||
|
||||
// create an array from std::unordered_set
|
||||
std::unordered_set<std::string> c_uset {"one", "two", "three", "four", "one"};
|
||||
json j_uset(c_uset); // only one entry for "one" is used
|
||||
|
||||
// create an array from std::multiset
|
||||
std::multiset<std::string> c_mset {"one", "two", "one", "four"};
|
||||
json j_mset(c_mset); // only one entry for "one" is used
|
||||
|
||||
// create an array from std::unordered_multiset
|
||||
std::unordered_multiset<std::string> c_umset {"one", "two", "one", "four"};
|
||||
json j_umset(c_umset); // both entries for "one" are used
|
||||
|
||||
// serialize the JSON arrays
|
||||
std::cout << j_vec << '\n';
|
||||
std::cout << j_deque << '\n';
|
||||
std::cout << j_list << '\n';
|
||||
std::cout << j_flist << '\n';
|
||||
std::cout << j_array << '\n';
|
||||
std::cout << j_set << '\n';
|
||||
std::cout << j_uset << '\n';
|
||||
std::cout << j_mset << '\n';
|
||||
std::cout << j_umset << '\n';
|
||||
}
|
9
docs/examples/basic_json__CompatibleArrayType.output
Normal file
9
docs/examples/basic_json__CompatibleArrayType.output
Normal file
|
@ -0,0 +1,9 @@
|
|||
[1,2,3,4]
|
||||
[1.2,2.3,3.4,5.6]
|
||||
[true,true,false,true]
|
||||
[12345678909876,23456789098765,34567890987654,45678909876543]
|
||||
[1,2,3,4]
|
||||
["four","one","three","two"]
|
||||
["four","three","two","one"]
|
||||
["four","one","one","two"]
|
||||
["four","two","one","one"]
|
41
docs/examples/basic_json__CompatibleObjectType.cpp
Normal file
41
docs/examples/basic_json__CompatibleObjectType.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include <json.hpp>
|
||||
#include <unordered_map>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an object from std::map
|
||||
std::map<std::string, int> c_map
|
||||
{
|
||||
{"one", 1}, {"two", 2}, {"three", 3}
|
||||
};
|
||||
json j_map(c_map);
|
||||
|
||||
// create an object from std::unordered_map
|
||||
std::unordered_map<const char*, double> c_umap
|
||||
{
|
||||
{"one", 1.2}, {"two", 2.3}, {"three", 3.4}
|
||||
};
|
||||
json j_umap(c_umap);
|
||||
|
||||
// create an object from std::multimap
|
||||
std::multimap<std::string, bool> c_mmap
|
||||
{
|
||||
{"one", true}, {"two", true}, {"three", false}, {"three", true}
|
||||
};
|
||||
json j_mmap(c_mmap); // only one entry for key "three" is used
|
||||
|
||||
// create an object from std::unordered_multimap
|
||||
std::unordered_multimap<std::string, bool> c_ummap
|
||||
{
|
||||
{"one", true}, {"two", true}, {"three", false}, {"three", true}
|
||||
};
|
||||
json j_ummap(c_ummap); // only one entry for key "three" is used
|
||||
|
||||
// serialize the JSON objects
|
||||
std::cout << j_map << '\n';
|
||||
std::cout << j_umap << '\n';
|
||||
std::cout << j_mmap << '\n';
|
||||
std::cout << j_ummap << '\n';
|
||||
}
|
4
docs/examples/basic_json__CompatibleObjectType.output
Normal file
4
docs/examples/basic_json__CompatibleObjectType.output
Normal file
|
@ -0,0 +1,4 @@
|
|||
{"one":1,"three":3,"two":2}
|
||||
{"one":1.2,"three":3.4,"two":2.3}
|
||||
{"one":true,"three":false,"two":true}
|
||||
{"one":true,"three":false,"two":true}
|
15
docs/examples/basic_json__array_t.cpp
Normal file
15
docs/examples/basic_json__array_t.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array_t value
|
||||
json::array_t value = {"one", "two", 3, 4.5, false};
|
||||
|
||||
// create a JSON array from the value
|
||||
json j(value);
|
||||
|
||||
// serialize the JSON array
|
||||
std::cout << j << '\n';
|
||||
}
|
1
docs/examples/basic_json__array_t.output
Normal file
1
docs/examples/basic_json__array_t.output
Normal file
|
@ -0,0 +1 @@
|
|||
["one","two",3,4.5,false]
|
16
docs/examples/basic_json__basic_json.cpp
Normal file
16
docs/examples/basic_json__basic_json.cpp
Normal file
|
@ -0,0 +1,16 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create a JSON array
|
||||
json j1 = {"one", "two", 3, 4.5, false};
|
||||
|
||||
// create a copy
|
||||
json j2(j1);
|
||||
|
||||
// serialize the JSON array
|
||||
std::cout << j1 << " = " << j2 << '\n';
|
||||
std::cout << std::boolalpha << (j1 == j2) << '\n';
|
||||
}
|
2
docs/examples/basic_json__basic_json.output
Normal file
2
docs/examples/basic_json__basic_json.output
Normal file
|
@ -0,0 +1,2 @@
|
|||
["one","two",3,4.5,false] = ["one","two",3,4.5,false]
|
||||
true
|
12
docs/examples/basic_json__nullptr_t.cpp
Normal file
12
docs/examples/basic_json__nullptr_t.cpp
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create a JSON null value
|
||||
json j(nullptr);
|
||||
|
||||
// serialize the JSON null value
|
||||
std::cout << j << '\n';
|
||||
}
|
1
docs/examples/basic_json__nullptr_t.output
Normal file
1
docs/examples/basic_json__nullptr_t.output
Normal file
|
@ -0,0 +1 @@
|
|||
null
|
15
docs/examples/basic_json__object_t.cpp
Normal file
15
docs/examples/basic_json__object_t.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an object_t value
|
||||
json::object_t value = { {"one", 1}, {"two", 2} };
|
||||
|
||||
// create a JSON object from the value
|
||||
json j(value);
|
||||
|
||||
// serialize the JSON object
|
||||
std::cout << j << '\n';
|
||||
}
|
1
docs/examples/basic_json__object_t.output
Normal file
1
docs/examples/basic_json__object_t.output
Normal file
|
@ -0,0 +1 @@
|
|||
{"one":1,"two":2}
|
24
docs/examples/basic_json__value_t.cpp
Normal file
24
docs/examples/basic_json__value_t.cpp
Normal file
|
@ -0,0 +1,24 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create the different JSON values with default values
|
||||
json j_null(json::value_t::null);
|
||||
json j_boolean(json::value_t::boolean);
|
||||
json j_number_integer(json::value_t::number_integer);
|
||||
json j_number_float(json::value_t::number_float);
|
||||
json j_object(json::value_t::object);
|
||||
json j_array(json::value_t::array);
|
||||
json j_string(json::value_t::string);
|
||||
|
||||
// serialize the JSON values
|
||||
std::cout << j_null << '\n';
|
||||
std::cout << j_boolean << '\n';
|
||||
std::cout << j_number_integer << '\n';
|
||||
std::cout << j_number_float << '\n';
|
||||
std::cout << j_object << '\n';
|
||||
std::cout << j_array << '\n';
|
||||
std::cout << j_string << '\n';
|
||||
}
|
7
docs/examples/basic_json__value_t.output
Normal file
7
docs/examples/basic_json__value_t.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
null
|
||||
false
|
||||
0
|
||||
0
|
||||
{}
|
||||
[]
|
||||
""
|
15
docs/examples/begin.cpp
Normal file
15
docs/examples/begin.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get am iterator to the first element
|
||||
json::iterator it = array.begin();
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/begin.output
Normal file
1
docs/examples/begin.output
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
15
docs/examples/cbegin.cpp
Normal file
15
docs/examples/cbegin.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
const json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get am iterator to the first element
|
||||
json::const_iterator it = array.cbegin();
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/cbegin.output
Normal file
1
docs/examples/cbegin.output
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
18
docs/examples/cend.cpp
Normal file
18
docs/examples/cend.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get am iterator to one past the last element
|
||||
json::const_iterator it = array.cend();
|
||||
|
||||
// decrement the iterator to point to the last element
|
||||
--it;
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/cend.output
Normal file
1
docs/examples/cend.output
Normal file
|
@ -0,0 +1 @@
|
|||
5
|
15
docs/examples/crbegin.cpp
Normal file
15
docs/examples/crbegin.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get an iterator to the reverse-beginning
|
||||
json::const_reverse_iterator it = array.crbegin();
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/crbegin.output
Normal file
1
docs/examples/crbegin.output
Normal file
|
@ -0,0 +1 @@
|
|||
5
|
18
docs/examples/crend.cpp
Normal file
18
docs/examples/crend.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get an iterator to the reverse-end
|
||||
json::const_reverse_iterator it = array.crend();
|
||||
|
||||
// increment the iterator to point to the first element
|
||||
--it;
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/crend.output
Normal file
1
docs/examples/crend.output
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
29
docs/examples/empty.cpp
Normal file
29
docs/examples/empty.cpp
Normal file
|
@ -0,0 +1,29 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_object_empty(json::value_t::object);
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_array_empty(json::value_t::array);
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call empty()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.empty() << '\n';
|
||||
std::cout << j_boolean.empty() << '\n';
|
||||
std::cout << j_number_integer.empty() << '\n';
|
||||
std::cout << j_number_float.empty() << '\n';
|
||||
std::cout << j_object.empty() << '\n';
|
||||
std::cout << j_object_empty.empty() << '\n';
|
||||
std::cout << j_array.empty() << '\n';
|
||||
std::cout << j_array_empty.empty() << '\n';
|
||||
std::cout << j_string.empty() << '\n';
|
||||
}
|
9
docs/examples/empty.output
Normal file
9
docs/examples/empty.output
Normal file
|
@ -0,0 +1,9 @@
|
|||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
false
|
||||
true
|
||||
false
|
18
docs/examples/end.cpp
Normal file
18
docs/examples/end.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get am iterator to one past the last element
|
||||
json::iterator it = array.end();
|
||||
|
||||
// decrement the iterator to point to the last element
|
||||
--it;
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/end.output
Normal file
1
docs/examples/end.output
Normal file
|
@ -0,0 +1 @@
|
|||
5
|
25
docs/examples/is_array.cpp
Normal file
25
docs/examples/is_array.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_array()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_array() << '\n';
|
||||
std::cout << j_boolean.is_array() << '\n';
|
||||
std::cout << j_number_integer.is_array() << '\n';
|
||||
std::cout << j_number_float.is_array() << '\n';
|
||||
std::cout << j_object.is_array() << '\n';
|
||||
std::cout << j_array.is_array() << '\n';
|
||||
std::cout << j_string.is_array() << '\n';
|
||||
}
|
7
docs/examples/is_array.output
Normal file
7
docs/examples/is_array.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
false
|
25
docs/examples/is_boolean.cpp
Normal file
25
docs/examples/is_boolean.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_boolean()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_boolean() << '\n';
|
||||
std::cout << j_boolean.is_boolean() << '\n';
|
||||
std::cout << j_number_integer.is_boolean() << '\n';
|
||||
std::cout << j_number_float.is_boolean() << '\n';
|
||||
std::cout << j_object.is_boolean() << '\n';
|
||||
std::cout << j_array.is_boolean() << '\n';
|
||||
std::cout << j_string.is_boolean() << '\n';
|
||||
}
|
7
docs/examples/is_boolean.output
Normal file
7
docs/examples/is_boolean.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
25
docs/examples/is_null.cpp
Normal file
25
docs/examples/is_null.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_null()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_null() << '\n';
|
||||
std::cout << j_boolean.is_null() << '\n';
|
||||
std::cout << j_number_integer.is_null() << '\n';
|
||||
std::cout << j_number_float.is_null() << '\n';
|
||||
std::cout << j_object.is_null() << '\n';
|
||||
std::cout << j_array.is_null() << '\n';
|
||||
std::cout << j_string.is_null() << '\n';
|
||||
}
|
7
docs/examples/is_null.output
Normal file
7
docs/examples/is_null.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
25
docs/examples/is_number.cpp
Normal file
25
docs/examples/is_number.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_number()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_number() << '\n';
|
||||
std::cout << j_boolean.is_number() << '\n';
|
||||
std::cout << j_number_integer.is_number() << '\n';
|
||||
std::cout << j_number_float.is_number() << '\n';
|
||||
std::cout << j_object.is_number() << '\n';
|
||||
std::cout << j_array.is_number() << '\n';
|
||||
std::cout << j_string.is_number() << '\n';
|
||||
}
|
7
docs/examples/is_number.output
Normal file
7
docs/examples/is_number.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
25
docs/examples/is_number_float.cpp
Normal file
25
docs/examples/is_number_float.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_number_float()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_number_float() << '\n';
|
||||
std::cout << j_boolean.is_number_float() << '\n';
|
||||
std::cout << j_number_integer.is_number_float() << '\n';
|
||||
std::cout << j_number_float.is_number_float() << '\n';
|
||||
std::cout << j_object.is_number_float() << '\n';
|
||||
std::cout << j_array.is_number_float() << '\n';
|
||||
std::cout << j_string.is_number_float() << '\n';
|
||||
}
|
7
docs/examples/is_number_float.output
Normal file
7
docs/examples/is_number_float.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
25
docs/examples/is_number_integer.cpp
Normal file
25
docs/examples/is_number_integer.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_number_integer()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_number_integer() << '\n';
|
||||
std::cout << j_boolean.is_number_integer() << '\n';
|
||||
std::cout << j_number_integer.is_number_integer() << '\n';
|
||||
std::cout << j_number_float.is_number_integer() << '\n';
|
||||
std::cout << j_object.is_number_integer() << '\n';
|
||||
std::cout << j_array.is_number_integer() << '\n';
|
||||
std::cout << j_string.is_number_integer() << '\n';
|
||||
}
|
7
docs/examples/is_number_integer.output
Normal file
7
docs/examples/is_number_integer.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
false
|
||||
true
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
25
docs/examples/is_object.cpp
Normal file
25
docs/examples/is_object.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_object()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_object() << '\n';
|
||||
std::cout << j_boolean.is_object() << '\n';
|
||||
std::cout << j_number_integer.is_object() << '\n';
|
||||
std::cout << j_number_float.is_object() << '\n';
|
||||
std::cout << j_object.is_object() << '\n';
|
||||
std::cout << j_array.is_object() << '\n';
|
||||
std::cout << j_string.is_object() << '\n';
|
||||
}
|
7
docs/examples/is_object.output
Normal file
7
docs/examples/is_object.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
||||
false
|
||||
false
|
25
docs/examples/is_string.cpp
Normal file
25
docs/examples/is_string.cpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call is_string()
|
||||
std::cout << std::boolalpha;
|
||||
std::cout << j_null.is_string() << '\n';
|
||||
std::cout << j_boolean.is_string() << '\n';
|
||||
std::cout << j_number_integer.is_string() << '\n';
|
||||
std::cout << j_number_float.is_string() << '\n';
|
||||
std::cout << j_object.is_string() << '\n';
|
||||
std::cout << j_array.is_string() << '\n';
|
||||
std::cout << j_string.is_string() << '\n';
|
||||
}
|
7
docs/examples/is_string.output
Normal file
7
docs/examples/is_string.output
Normal file
|
@ -0,0 +1,7 @@
|
|||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
false
|
||||
true
|
15
docs/examples/rbegin.cpp
Normal file
15
docs/examples/rbegin.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get an iterator to the reverse-beginning
|
||||
json::reverse_iterator it = array.rbegin();
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/rbegin.output
Normal file
1
docs/examples/rbegin.output
Normal file
|
@ -0,0 +1 @@
|
|||
5
|
18
docs/examples/rend.cpp
Normal file
18
docs/examples/rend.cpp
Normal file
|
@ -0,0 +1,18 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create an array value
|
||||
json array = {1, 2, 3, 4, 5};
|
||||
|
||||
// get an iterator to the reverse-end
|
||||
json::reverse_iterator it = array.rend();
|
||||
|
||||
// increment the iterator to point to the first element
|
||||
--it;
|
||||
|
||||
// serialize the element that the iterator points to
|
||||
std::cout << *it << '\n';
|
||||
}
|
1
docs/examples/rend.output
Normal file
1
docs/examples/rend.output
Normal file
|
@ -0,0 +1 @@
|
|||
1
|
28
docs/examples/size.cpp
Normal file
28
docs/examples/size.cpp
Normal file
|
@ -0,0 +1,28 @@
|
|||
#include <json.hpp>
|
||||
|
||||
using namespace nlohmann;
|
||||
|
||||
int main()
|
||||
{
|
||||
// create JSON values
|
||||
json j_null;
|
||||
json j_boolean = true;
|
||||
json j_number_integer = 17;
|
||||
json j_number_float = 23.42;
|
||||
json j_object = {{"one", 1}, {"two", 2}};
|
||||
json j_object_empty(json::value_t::object);
|
||||
json j_array = {1, 2, 4, 8, 16};
|
||||
json j_array_empty(json::value_t::array);
|
||||
json j_string = "Hello, world";
|
||||
|
||||
// call size()
|
||||
std::cout << j_null.size() << '\n';
|
||||
std::cout << j_boolean.size() << '\n';
|
||||
std::cout << j_number_integer.size() << '\n';
|
||||
std::cout << j_number_float.size() << '\n';
|
||||
std::cout << j_object.size() << '\n';
|
||||
std::cout << j_object_empty.size() << '\n';
|
||||
std::cout << j_array.size() << '\n';
|
||||
std::cout << j_array_empty.size() << '\n';
|
||||
std::cout << j_string.size() << '\n';
|
||||
}
|
9
docs/examples/size.output
Normal file
9
docs/examples/size.output
Normal file
|
@ -0,0 +1,9 @@
|
|||
0
|
||||
1
|
||||
1
|
||||
1
|
||||
2
|
||||
0
|
||||
5
|
||||
0
|
||||
1
|
435
docs/images/range-begin-end.svg
Normal file
435
docs/images/range-begin-end.svg
Normal file
|
@ -0,0 +1,435 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="545.89282"
|
||||
height="156.9409"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="range-begin-end.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path6525"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Lend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Lend"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
id="path6519"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
id="linearGradient5488">
|
||||
<stop
|
||||
style="stop-color:#c1b1b1;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5490" />
|
||||
<stop
|
||||
style="stop-color:#e3e3e3;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5492" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient4040">
|
||||
<stop
|
||||
style="stop-color:#b6b6b6;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop4042" />
|
||||
<stop
|
||||
style="stop-color:#e3e3e3;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop4044" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5488"
|
||||
id="linearGradient6284"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="81"
|
||||
y1="1001.3622"
|
||||
x2="81"
|
||||
y2="971.36218" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5488-2"
|
||||
id="linearGradient6284-3"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="81"
|
||||
y1="1001.3622"
|
||||
x2="81"
|
||||
y2="971.36218" />
|
||||
<linearGradient
|
||||
id="linearGradient5488-2">
|
||||
<stop
|
||||
style="stop-color:#c1b1b1;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5490-5" />
|
||||
<stop
|
||||
style="stop-color:#e3e3e3;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5492-8" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5488-0"
|
||||
id="linearGradient6284-5"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="81"
|
||||
y1="1001.3622"
|
||||
x2="81"
|
||||
y2="971.36218" />
|
||||
<linearGradient
|
||||
id="linearGradient5488-0">
|
||||
<stop
|
||||
style="stop-color:#c1b1b1;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop5490-1" />
|
||||
<stop
|
||||
style="stop-color:#e3e3e3;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop5492-3" />
|
||||
</linearGradient>
|
||||
<marker
|
||||
inkscape:stockid="Arrow1Mend"
|
||||
orient="auto"
|
||||
refY="0"
|
||||
refX="0"
|
||||
id="Arrow1Mend-8"
|
||||
style="overflow:visible">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path6525-3"
|
||||
d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
|
||||
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt"
|
||||
transform="matrix(-0.4,0,0,-0.4,-4,0)" />
|
||||
</marker>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5488"
|
||||
id="linearGradient9026"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="81"
|
||||
y1="1001.3622"
|
||||
x2="81"
|
||||
y2="971.36218" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.4"
|
||||
inkscape:cx="332.80082"
|
||||
inkscape:cy="165.04542"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="993"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="34"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-bbox="true"
|
||||
inkscape:object-nodes="true"
|
||||
inkscape:snap-smooth-nodes="false"
|
||||
inkscape:bbox-nodes="false"
|
||||
inkscape:snap-bbox-edge-midpoints="false"
|
||||
inkscape:object-paths="true"
|
||||
fit-margin-top="10"
|
||||
fit-margin-right="10"
|
||||
fit-margin-bottom="10"
|
||||
fit-margin-left="10" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(-26.107143,-893.4807)">
|
||||
<g
|
||||
id="g7184">
|
||||
<path
|
||||
inkscape:tile-y0="219"
|
||||
inkscape:tile-x0="51"
|
||||
inkscape:tile-h="30.00002"
|
||||
inkscape:tile-w="29.999997"
|
||||
inkscape:tile-cy="234.00001"
|
||||
inkscape:tile-cx="65.999998"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3006"
|
||||
d="m 80.999997,1001.3622 -29.999997,0 0,-30.00002 29.999997,0 z"
|
||||
style="fill:url(#linearGradient9026);fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<use
|
||||
height="300"
|
||||
width="600"
|
||||
style="fill:none"
|
||||
id="use4010"
|
||||
transform="translate(29.999997,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0" />
|
||||
<use
|
||||
id="use4012"
|
||||
transform="translate(59.999994,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4014"
|
||||
transform="translate(89.999991,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4016"
|
||||
transform="translate(119.99999,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4018"
|
||||
transform="translate(149.99998,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4020"
|
||||
transform="translate(179.99998,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4022"
|
||||
transform="translate(209.99998,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4024"
|
||||
transform="translate(239.99998,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4026"
|
||||
transform="translate(269.99997,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4028"
|
||||
transform="translate(299.99997,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4030"
|
||||
transform="translate(329.99997,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4032"
|
||||
transform="translate(359.99996,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4034"
|
||||
transform="translate(389.99996,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4036"
|
||||
transform="translate(419.99996,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<use
|
||||
id="use4038"
|
||||
transform="translate(449.99995,0)"
|
||||
xlink:href="#path3006"
|
||||
inkscape:tiled-clone-of="#path3006"
|
||||
y="0"
|
||||
x="0"
|
||||
width="600"
|
||||
height="300" />
|
||||
<path
|
||||
inkscape:tile-y0="219"
|
||||
inkscape:tile-x0="51"
|
||||
inkscape:tile-h="30.00002"
|
||||
inkscape:tile-w="29.999997"
|
||||
inkscape:tile-cy="234.00001"
|
||||
inkscape:tile-cx="65.999998"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3006-3"
|
||||
d="m 560.99995,1001.3622 -30,0 0,-30.00002 30,0 z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none" />
|
||||
</g>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:55.00000119%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:none;font-family:Droid Sans;-inkscape-font-specification:Droid Sans"
|
||||
x="392.94931"
|
||||
y="1040.2404"
|
||||
id="text6504"
|
||||
sodipodi:linespacing="55.000001%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan6506"
|
||||
x="392.94931"
|
||||
y="1040.2404"
|
||||
rotate="0 0 0 0 0 0 0 0 0.50000191 0 0 0 0 0 0 0 0 0 0 0 0 0"
|
||||
dy="0"
|
||||
dx="0"
|
||||
style="font-size:12.80000019px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans">Past-the-last element</tspan></text>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow1Mend)"
|
||||
d="m 531.84531,279.29187 c 14.75083,-11.1311 12.86656,-14.42379 15.15229,-29.29442"
|
||||
id="path6510"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,752.36218)"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<g
|
||||
id="g7203"
|
||||
transform="translate(-40,-18.482143)">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 128.39286,947.36218 -51.785717,0 0,-21.51786 51.785717,0 z"
|
||||
id="use6288-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:tile-x0="51"
|
||||
inkscape:tile-y0="219" />
|
||||
<text
|
||||
transform="translate(0,752.36218)"
|
||||
sodipodi:linespacing="55.000001%"
|
||||
id="text7176"
|
||||
y="189.10715"
|
||||
x="80.535713"
|
||||
style="font-size:15px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:55.00000119%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
|
||||
xml:space="preserve"><tspan
|
||||
y="189.10715"
|
||||
x="80.535713"
|
||||
id="tspan7178"
|
||||
sodipodi:role="line">begin</tspan></text>
|
||||
</g>
|
||||
<g
|
||||
id="g7238"
|
||||
transform="translate(20.035895,11.306019)">
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 538.39286,914.19254 -37.50001,0 0,-21.51786 37.50001,0 z"
|
||||
id="use6288-9-7"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:tile-x0="51"
|
||||
inkscape:tile-y0="219" />
|
||||
<text
|
||||
sodipodi:linespacing="55.000001%"
|
||||
id="text7176-3"
|
||||
y="908.29968"
|
||||
x="504.82141"
|
||||
style="font-size:15px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:55.00000119%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;font-family:DejaVu Sans;-inkscape-font-specification:DejaVu Sans"
|
||||
xml:space="preserve"><tspan
|
||||
y="908.29968"
|
||||
x="504.82141"
|
||||
id="tspan7178-7"
|
||||
sodipodi:role="line">end</tspan></text>
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#Arrow1Mend)"
|
||||
d="M 60.16588,176.51786 C 64.809921,191.17027 67.41717,201.02245 68.196339,219"
|
||||
id="path7243"
|
||||
inkscape:connector-curvature="0"
|
||||
transform="translate(0,752.36218)"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-mid:none;marker-end:url(#Arrow1Mend)"
|
||||
d="m 540.40821,925.49856 c 2.63474,15.08647 5.72454,31.23577 6.06617,45.86362"
|
||||
id="path7243-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cc" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 14 KiB |
1232
docs/images/range-rbegin-rend.svg
Normal file
1232
docs/images/range-rbegin-rend.svg
Normal file
File diff suppressed because it is too large
Load diff
After Width: | Height: | Size: 40 KiB |
1678
src/json.hpp
1678
src/json.hpp
File diff suppressed because it is too large
Load diff
|
@ -50,6 +50,9 @@ namespace nlohmann
|
|||
{
|
||||
|
||||
|
||||
/// namespace with internal helper functions
|
||||
namespace internals
|
||||
{
|
||||
// Helper to determine whether there's a key_type for T.
|
||||
// http://stackoverflow.com/a/7728728/266378
|
||||
template<typename T>
|
||||
|
@ -61,9 +64,10 @@ struct has_mapped_type
|
|||
public:
|
||||
enum { value = sizeof(test<T>(0)) == sizeof(char) };
|
||||
};
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief JSON
|
||||
@brief a class to store JSON values
|
||||
|
||||
@tparam ObjectType type for JSON objects
|
||||
(@c std::map by default)
|
||||
|
@ -101,6 +105,9 @@ class basic_json
|
|||
// container types //
|
||||
/////////////////////
|
||||
|
||||
/// @name container types
|
||||
/// @{
|
||||
|
||||
/// the type of elements in a basic_json container
|
||||
using value_type = basic_json;
|
||||
|
||||
|
@ -133,6 +140,9 @@ class basic_json
|
|||
/// a const reverse iterator for a basic_json container
|
||||
class const_reverse_iterator;
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
/// returns the allocator associated with the container
|
||||
static allocator_type get_allocator()
|
||||
{
|
||||
|
@ -144,6 +154,9 @@ class basic_json
|
|||
// JSON value data types //
|
||||
///////////////////////////
|
||||
|
||||
/// @name JSON value data types
|
||||
/// @{
|
||||
|
||||
/// a type for an object
|
||||
using object_t =
|
||||
ObjectType<StringType, basic_json, std::less<StringType>, AllocatorType<std::pair<const StringType, basic_json>>>;
|
||||
|
@ -160,12 +173,19 @@ class basic_json
|
|||
/// a type for list initialization
|
||||
using list_init_t = std::initializer_list<basic_json>;
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
/////////////////////////////////
|
||||
// JSON value type enumeration //
|
||||
/////////////////////////////////
|
||||
|
||||
/// JSON value type enumeration
|
||||
/*!
|
||||
@brief the JSON value type enumeration
|
||||
|
||||
This enumeration collects the different JSON value types. It is used to
|
||||
distinguish the stored values in the union @ref json_value.
|
||||
*/
|
||||
enum class value_t : uint8_t
|
||||
{
|
||||
null, ///< null value
|
||||
|
@ -178,6 +198,7 @@ class basic_json
|
|||
discarded ///< (internal) indicates the parser callback chose not to keep the value
|
||||
};
|
||||
|
||||
|
||||
////////////////////////
|
||||
// JSON value storage //
|
||||
////////////////////////
|
||||
|
@ -341,9 +362,28 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief create an empty value with a given type
|
||||
@param value the type to create an value of
|
||||
|
||||
@exception std::bad_alloc if allocation for object, array, or string fails.
|
||||
Create an empty JSON value with a given type. The value will be default
|
||||
initialized with an empty value which depends on the type:
|
||||
|
||||
Value type | initial value
|
||||
----------- | -------------
|
||||
null | @c null
|
||||
boolean | @c false
|
||||
string | @c ""
|
||||
number | @c 0
|
||||
object | @c {}
|
||||
array | @c []
|
||||
|
||||
@param value the type of the value to create
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@exception std::bad_alloc if allocation for object, array, or string value
|
||||
fails (thrown by the constructors of @ref json_value)
|
||||
|
||||
@liveexample{The following code shows the constructor for different @ref
|
||||
value_t values,basic_json__value_t}
|
||||
*/
|
||||
basic_json(const value_t value)
|
||||
: m_type(value), m_value(value)
|
||||
|
@ -351,27 +391,93 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief create a null object (implicitly)
|
||||
|
||||
Create a `null` JSON value. This is the implicit version of the `null`
|
||||
value constructor as it takes no parameters.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
- As postcondition, it holds: `basic_json().empty() == true`.
|
||||
|
||||
@liveexample{The following code shows the constructor for a `null` JSON
|
||||
value.,basic_json}
|
||||
|
||||
@sa basic_json(std::nullptr_t)
|
||||
@ingroup container
|
||||
*/
|
||||
basic_json() noexcept = default;
|
||||
|
||||
/// create a null object (explicitly)
|
||||
/*!
|
||||
@brief create a null object (explicitly)
|
||||
|
||||
Create a `null` JSON value. This is the explicitly version of the `null`
|
||||
value constructor as it takes a null pointer as parameter. It allows to
|
||||
create `null` values by explicitly assigning a @c nullptr to a JSON value.
|
||||
The passed null pointer itself is not read - it is only used to choose the
|
||||
right constructor.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code shows the constructor with null pointer
|
||||
parameter.,basic_json__nullptr_t}
|
||||
|
||||
@sa basic_json()
|
||||
*/
|
||||
basic_json(std::nullptr_t) noexcept
|
||||
: basic_json(value_t::null)
|
||||
{}
|
||||
|
||||
/// create an object (explicit)
|
||||
/*!
|
||||
@brief create an object (explicit)
|
||||
|
||||
Create an object JSON value with a given content.
|
||||
|
||||
@param value a value for the object
|
||||
|
||||
@complexity Linear in the size of the passed @a value.
|
||||
|
||||
@exception std::bad_alloc if allocation for object value fails (thrown by
|
||||
the constructor of @ref json_value)
|
||||
|
||||
@liveexample{The following code shows the constructor with an @ref object_t
|
||||
parameter.,basic_json__object_t}
|
||||
|
||||
@sa basic_json(const CompatibleObjectType&)
|
||||
*/
|
||||
basic_json(const object_t& value)
|
||||
: m_type(value_t::object), m_value(value)
|
||||
{}
|
||||
|
||||
/// create an object (implicit)
|
||||
template <class V, typename
|
||||
/*!
|
||||
@brief create an object (implicit)
|
||||
|
||||
Create an object JSON value with a given content. This constructor allows
|
||||
any type that can be used to construct values of type @ref object_t.
|
||||
Examples include the types `std::map` and `std::unordered_map`.
|
||||
|
||||
@tparam CompatibleObjectType an object type whose `key_type` and
|
||||
`value_type` is compatible to @ref object_t
|
||||
|
||||
@param value a value for the object
|
||||
|
||||
@complexity Linear in the size of the passed @a value.
|
||||
|
||||
@exception std::bad_alloc if allocation for object value fails (thrown by
|
||||
the constructor of @ref json_value)
|
||||
|
||||
@liveexample{The following code shows the constructor with several
|
||||
compatible object type parameters.,basic_json__CompatibleObjectType}
|
||||
|
||||
@sa basic_json(const object_t&)
|
||||
*/
|
||||
template <class CompatibleObjectType, typename
|
||||
std::enable_if<
|
||||
std::is_constructible<typename object_t::key_type, typename V::key_type>::value and
|
||||
std::is_constructible<basic_json, typename V::mapped_type>::value, int>::type
|
||||
std::is_constructible<typename object_t::key_type, typename CompatibleObjectType::key_type>::value and
|
||||
std::is_constructible<basic_json, typename CompatibleObjectType::mapped_type>::value, int>::type
|
||||
= 0>
|
||||
basic_json(const V& value)
|
||||
basic_json(const CompatibleObjectType& value)
|
||||
: m_type(value_t::object)
|
||||
{
|
||||
AllocatorType<object_t> alloc;
|
||||
|
@ -381,23 +487,60 @@ class basic_json
|
|||
alloc.construct(m_value.object, begin(value), end(value));
|
||||
}
|
||||
|
||||
/// create an array (explicit)
|
||||
/*!
|
||||
@brief create an array (explicit)
|
||||
|
||||
Create an array JSON value with a given content.
|
||||
|
||||
@param value a value for the array
|
||||
|
||||
@complexity Linear in the size of the passed @a value.
|
||||
|
||||
@exception std::bad_alloc if allocation for array value fails (thrown by
|
||||
the constructor of @ref json_value)
|
||||
|
||||
@liveexample{The following code shows the constructor with an @ref array_t
|
||||
parameter.,basic_json__array_t}
|
||||
|
||||
@sa basic_json(const CompatibleArrayType&)
|
||||
*/
|
||||
basic_json(const array_t& value)
|
||||
: m_type(value_t::array), m_value(value)
|
||||
{}
|
||||
|
||||
/// create an array (implicit)
|
||||
template <class V, typename
|
||||
/*!
|
||||
@brief create an array (implicit)
|
||||
|
||||
Create an array JSON value with a given content. This constructor allows
|
||||
any type that can be used to construct values of type @ref array_t.
|
||||
Examples include the types `std::vector`, `std::list`, and `std::set`.
|
||||
|
||||
@tparam CompatibleArrayType an object type whose `value_type` is compatible
|
||||
to @ref array_t
|
||||
|
||||
@param value a value for the array
|
||||
|
||||
@complexity Linear in the size of the passed @a value.
|
||||
|
||||
@exception std::bad_alloc if allocation for array value fails (thrown by
|
||||
the constructor of @ref json_value)
|
||||
|
||||
@liveexample{The following code shows the constructor with several
|
||||
compatible array type parameters.,basic_json__CompatibleArrayType}
|
||||
|
||||
@sa basic_json(const array_t&)
|
||||
*/
|
||||
template <class CompatibleArrayType, typename
|
||||
std::enable_if<
|
||||
not std::is_same<V, typename basic_json::iterator>::value and
|
||||
not std::is_same<V, typename basic_json::const_iterator>::value and
|
||||
not std::is_same<V, typename basic_json::reverse_iterator>::value and
|
||||
not std::is_same<V, typename basic_json::const_reverse_iterator>::value and
|
||||
not std::is_same<V, typename array_t::iterator>::value and
|
||||
not std::is_same<V, typename array_t::const_iterator>::value and
|
||||
std::is_constructible<basic_json, typename V::value_type>::value, int>::type
|
||||
not std::is_same<CompatibleArrayType, typename basic_json::iterator>::value and
|
||||
not std::is_same<CompatibleArrayType, typename basic_json::const_iterator>::value and
|
||||
not std::is_same<CompatibleArrayType, typename basic_json::reverse_iterator>::value and
|
||||
not std::is_same<CompatibleArrayType, typename basic_json::const_reverse_iterator>::value and
|
||||
not std::is_same<CompatibleArrayType, typename array_t::iterator>::value and
|
||||
not std::is_same<CompatibleArrayType, typename array_t::const_iterator>::value and
|
||||
std::is_constructible<basic_json, typename CompatibleArrayType::value_type>::value, int>::type
|
||||
= 0>
|
||||
basic_json(const V& value)
|
||||
basic_json(const CompatibleArrayType& value)
|
||||
: m_type(value_t::array)
|
||||
{
|
||||
AllocatorType<array_t> alloc;
|
||||
|
@ -675,7 +818,20 @@ class basic_json
|
|||
/*!
|
||||
@brief copy constructor
|
||||
|
||||
@exception std::bad_alloc if allocation for object, array, or string fails.
|
||||
Creates a copy of a given JSON value.
|
||||
|
||||
@param other the JSON value to copy
|
||||
|
||||
@complexity Linear in the size of @a other.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is linear.
|
||||
- As postcondition, it holds: `other == basic_json(other)`.
|
||||
|
||||
@exception std::bad_alloc if allocation for object, array, or string fails.
|
||||
|
||||
@liveexample{The following code shows an example for the copy
|
||||
constructor.,basic_json__basic_json}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
|
@ -740,6 +896,15 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief copy assignment
|
||||
|
||||
The copy assignment operator is expressed in terms of the copy constructor,
|
||||
destructor, and the swap() member function.
|
||||
|
||||
@complexity Linear.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is linear.
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
reference& operator=(basic_json other) noexcept (
|
||||
|
@ -757,6 +922,15 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief destructor
|
||||
|
||||
Destroys the JSON value and frees all memory.
|
||||
|
||||
@complexity Linear.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is linear.
|
||||
- All stored elements are destroyed and all memory is freed.
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
~basic_json() noexcept
|
||||
|
@ -804,6 +978,9 @@ class basic_json
|
|||
// object inspection //
|
||||
///////////////////////
|
||||
|
||||
/// @name object inspection
|
||||
/// @{
|
||||
|
||||
/*!
|
||||
@brief serialization
|
||||
|
||||
|
@ -840,49 +1017,140 @@ class basic_json
|
|||
return m_type;
|
||||
}
|
||||
|
||||
// return whether value is null
|
||||
/*!
|
||||
@brief return whether value is null
|
||||
|
||||
This function returns true iff the JSON value is null.
|
||||
|
||||
@return `true` if value type is null, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_null for all JSON
|
||||
value types.,is_null}
|
||||
*/
|
||||
bool is_null() const noexcept
|
||||
{
|
||||
return m_type == value_t::null;
|
||||
}
|
||||
|
||||
// return whether value is boolean
|
||||
/*!
|
||||
@brief return whether value is a boolean
|
||||
|
||||
This function returns true iff the JSON value is a boolean.
|
||||
|
||||
@return `true` if value type is boolean, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_boolean for all JSON
|
||||
value types.,is_boolean}
|
||||
*/
|
||||
bool is_boolean() const noexcept
|
||||
{
|
||||
return m_type == value_t::boolean;
|
||||
}
|
||||
|
||||
// return whether value is number
|
||||
/*!
|
||||
@brief return whether value is a number
|
||||
|
||||
This function returns true iff the JSON value is a number. This includes
|
||||
both integer and floating-point values.
|
||||
|
||||
@return `true` if value type is number, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_number for all JSON
|
||||
value types.,is_number}
|
||||
*/
|
||||
bool is_number() const noexcept
|
||||
{
|
||||
return (m_type == value_t::number_integer) or (m_type == value_t::number_float);
|
||||
}
|
||||
|
||||
// return whether value an integer is number
|
||||
/*!
|
||||
@brief return whether value is an integer number
|
||||
|
||||
This function returns true iff the JSON value is an integer number. This
|
||||
excludes floating-point values.
|
||||
|
||||
@return `true` if value type is an integer number, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_number_integer for all
|
||||
JSON value types.,is_number_integer}
|
||||
*/
|
||||
bool is_number_integer() const noexcept
|
||||
{
|
||||
return m_type == value_t::number_integer;
|
||||
}
|
||||
|
||||
// return whether value is a floating-point number
|
||||
/*!
|
||||
@brief return whether value is a floating-point number
|
||||
|
||||
This function returns true iff the JSON value is a floating-point number.
|
||||
This excludes integer values.
|
||||
|
||||
@return `true` if value type is a floating-point number, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_number_float for all
|
||||
JSON value types.,is_number_float}
|
||||
*/
|
||||
bool is_number_float() const noexcept
|
||||
{
|
||||
return m_type == value_t::number_float;
|
||||
}
|
||||
|
||||
// return whether value is object
|
||||
/*!
|
||||
@brief return whether value is an object
|
||||
|
||||
This function returns true iff the JSON value is an object.
|
||||
|
||||
@return `true` if value type is object, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_object for all JSON
|
||||
value types.,is_object}
|
||||
*/
|
||||
bool is_object() const noexcept
|
||||
{
|
||||
return m_type == value_t::object;
|
||||
}
|
||||
|
||||
// return whether value is array
|
||||
/*!
|
||||
@brief return whether value is an array
|
||||
|
||||
This function returns true iff the JSON value is an array.
|
||||
|
||||
@return `true` if value type is array, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_array for all JSON
|
||||
value types.,is_array}
|
||||
*/
|
||||
bool is_array() const noexcept
|
||||
{
|
||||
return m_type == value_t::array;
|
||||
}
|
||||
|
||||
// return whether value is string
|
||||
/*!
|
||||
@brief return whether value is a string
|
||||
|
||||
This function returns true iff the JSON value is a string.
|
||||
|
||||
@return `true` if value type is string, `false` otherwise.
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@liveexample{The following code exemplifies @ref is_string for all JSON
|
||||
value types.,is_string}
|
||||
*/
|
||||
bool is_string() const noexcept
|
||||
{
|
||||
return m_type == value_t::string;
|
||||
|
@ -900,10 +1168,12 @@ class basic_json
|
|||
return m_type;
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
private:
|
||||
//////////////////////
|
||||
// value conversion //
|
||||
//////////////////////
|
||||
//////////////////
|
||||
// value access //
|
||||
//////////////////
|
||||
|
||||
/// get an object (explicit)
|
||||
template <class T, typename
|
||||
|
@ -949,7 +1219,7 @@ class basic_json
|
|||
not std::is_same<basic_json, typename T::value_type>::value and
|
||||
not std::is_arithmetic<T>::value and
|
||||
not std::is_convertible<std::string, T>::value and
|
||||
not has_mapped_type<T>::value
|
||||
not internals::has_mapped_type<T>::value
|
||||
, int>::type = 0>
|
||||
T get_impl(T*) const
|
||||
{
|
||||
|
@ -1004,7 +1274,7 @@ class basic_json
|
|||
template <class T, typename
|
||||
std::enable_if<
|
||||
std::is_same<basic_json, typename T::value_type>::value and
|
||||
not has_mapped_type<T>::value
|
||||
not internals::has_mapped_type<T>::value
|
||||
, int>::type = 0>
|
||||
T get_impl(T*) const
|
||||
{
|
||||
|
@ -1097,6 +1367,10 @@ class basic_json
|
|||
}
|
||||
|
||||
public:
|
||||
|
||||
/// @name value access
|
||||
/// @{
|
||||
|
||||
/// get a value (explicit)
|
||||
// <http://stackoverflow.com/a/8315197/266378>
|
||||
template<typename T>
|
||||
|
@ -1112,11 +1386,16 @@ class basic_json
|
|||
return get<T>();
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
////////////////////
|
||||
// element access //
|
||||
////////////////////
|
||||
|
||||
/// @name element access
|
||||
/// @{
|
||||
|
||||
/// access specified element with bounds checking
|
||||
reference at(size_type idx)
|
||||
{
|
||||
|
@ -1482,13 +1761,32 @@ class basic_json
|
|||
return (m_type == value_t::object) ? m_value.object->count(key) : 0;
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
///////////////
|
||||
// iterators //
|
||||
///////////////
|
||||
|
||||
/// @name iterators
|
||||
/// @{
|
||||
|
||||
/*!
|
||||
@brief returns an iterator to the first element
|
||||
|
||||
Returns an iterator to the first element.
|
||||
|
||||
@image html range-begin-end.svg "Illustration from cppreference.com"
|
||||
|
||||
@return iterator to the first element
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
|
||||
@liveexample{The following code shows an example for @ref begin.,begin}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
iterator begin() noexcept
|
||||
|
@ -1499,7 +1797,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a const iterator to the first element
|
||||
@copydoc basic_json::cbegin()
|
||||
@ingroup container
|
||||
*/
|
||||
const_iterator begin() const noexcept
|
||||
|
@ -1509,6 +1807,21 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief returns a const iterator to the first element
|
||||
|
||||
Returns a const iterator to the first element.
|
||||
|
||||
@image html range-begin-end.svg "Illustration from cppreference.com"
|
||||
|
||||
@return const iterator to the first element
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `const_cast<const basic_json&>(*this).begin()`.
|
||||
|
||||
@liveexample{The following code shows an example for @ref cbegin.,cbegin}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
const_iterator cbegin() const noexcept
|
||||
|
@ -1520,6 +1833,20 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief returns an iterator to one past the last element
|
||||
|
||||
Returns an iterator to one past the last element.
|
||||
|
||||
@image html range-begin-end.svg "Illustration from cppreference.com"
|
||||
|
||||
@return iterator one past the last element
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
|
||||
@liveexample{The following code shows an example for @ref end.,end}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
iterator end() noexcept
|
||||
|
@ -1530,7 +1857,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a const iterator to one past the last element
|
||||
@copydoc basic_json::cend()
|
||||
@ingroup container
|
||||
*/
|
||||
const_iterator end() const noexcept
|
||||
|
@ -1540,6 +1867,21 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief returns a const iterator to one past the last element
|
||||
|
||||
Returns a const iterator to one past the last element.
|
||||
|
||||
@image html range-begin-end.svg "Illustration from cppreference.com"
|
||||
|
||||
@return const iterator one past the last element
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `const_cast<const basic_json&>(*this).end()`.
|
||||
|
||||
@liveexample{The following code shows an example for @ref cend.,cend}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
const_iterator cend() const noexcept
|
||||
|
@ -1550,7 +1892,20 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a reverse iterator to the first element
|
||||
@brief returns an iterator to the reverse-beginning
|
||||
|
||||
Returns an iterator to the reverse-beginning; that is, the last element.
|
||||
|
||||
@image html range-rbegin-rend.svg "Illustration from cppreference.com"
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the ReversibleContainer requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `reverse_iterator(end())`.
|
||||
|
||||
@liveexample{The following code shows an example for @ref rbegin.,rbegin}
|
||||
|
||||
@ingroup reversiblecontainer
|
||||
*/
|
||||
reverse_iterator rbegin() noexcept
|
||||
|
@ -1559,7 +1914,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a const reverse iterator to the first element
|
||||
@copydoc basic_json::crbegin()
|
||||
@ingroup reversiblecontainer
|
||||
*/
|
||||
const_reverse_iterator rbegin() const noexcept
|
||||
|
@ -1568,7 +1923,21 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a reverse iterator to one past the last element
|
||||
@brief returns an iterator to the reverse-end
|
||||
|
||||
Returns an iterator to the reverse-end; that is, one before the first
|
||||
element.
|
||||
|
||||
@image html range-rbegin-rend.svg "Illustration from cppreference.com"
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the ReversibleContainer requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `reverse_iterator(begin())`.
|
||||
|
||||
@liveexample{The following code shows an example for @ref rend.,rend}
|
||||
|
||||
@ingroup reversiblecontainer
|
||||
*/
|
||||
reverse_iterator rend() noexcept
|
||||
|
@ -1577,7 +1946,7 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a const reverse iterator to one past the last element
|
||||
@copydoc basic_json::crend()
|
||||
@ingroup reversiblecontainer
|
||||
*/
|
||||
const_reverse_iterator rend() const noexcept
|
||||
|
@ -1586,7 +1955,21 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a const reverse iterator to the first element
|
||||
@brief returns a const reverse iterator to the last element
|
||||
|
||||
Returns a const iterator to the reverse-beginning; that is, the last
|
||||
element.
|
||||
|
||||
@image html range-rbegin-rend.svg "Illustration from cppreference.com"
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the ReversibleContainer requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `const_cast<const basic_json&>(*this).rbegin()`.
|
||||
|
||||
@liveexample{The following code shows an example for @ref crbegin.,crbegin}
|
||||
|
||||
@ingroup reversiblecontainer
|
||||
*/
|
||||
const_reverse_iterator crbegin() const noexcept
|
||||
|
@ -1595,7 +1978,21 @@ class basic_json
|
|||
}
|
||||
|
||||
/*!
|
||||
@brief returns a const reverse iterator to one past the last element
|
||||
@brief returns a const reverse iterator to one before the first
|
||||
|
||||
Returns a const reverse iterator to the reverse-end; that is, one before
|
||||
the first element.
|
||||
|
||||
@image html range-rbegin-rend.svg "Illustration from cppreference.com"
|
||||
|
||||
@complexity Constant.
|
||||
|
||||
@requirement This function satisfies the ReversibleContainer requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `const_cast<const basic_json&>(*this).rend()`.
|
||||
|
||||
@liveexample{The following code shows an example for @ref crend.,crend}
|
||||
|
||||
@ingroup reversiblecontainer
|
||||
*/
|
||||
const_reverse_iterator crend() const noexcept
|
||||
|
@ -1603,13 +2000,43 @@ class basic_json
|
|||
return const_reverse_iterator(cbegin());
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
//////////////
|
||||
// capacity //
|
||||
//////////////
|
||||
|
||||
/// @name capacity
|
||||
/// @{
|
||||
|
||||
/*!
|
||||
@brief checks whether the container is empty
|
||||
|
||||
Checks if a JSON value has no elements.
|
||||
|
||||
@return The return value depends on the different value types and is
|
||||
defined as follows:
|
||||
Value type | return value
|
||||
----------- | -------------
|
||||
null | @c true
|
||||
boolean | @c false
|
||||
string | @c false
|
||||
number | @c false
|
||||
object | result of function object_t::empty()
|
||||
array | result of function array_t::empty()
|
||||
|
||||
@complexity Constant, as long as @ref array_t and @ref object_t satisfy the
|
||||
Container concept; that is, their empty() functions have
|
||||
constant complexity.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `begin() == end()`.
|
||||
|
||||
@liveexample{The following code uses @ref empty to check if a @ref json
|
||||
object contains any elements.,empty}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
bool empty() const noexcept
|
||||
|
@ -1641,6 +2068,31 @@ class basic_json
|
|||
|
||||
/*!
|
||||
@brief returns the number of elements
|
||||
|
||||
Returns the number of elements in a JSON value.
|
||||
|
||||
@return The return value depends on the different value types and is
|
||||
defined as follows:
|
||||
Value type | return value
|
||||
----------- | -------------
|
||||
null | @c 0
|
||||
boolean | @c 1
|
||||
string | @c 1
|
||||
number | @c 1
|
||||
object | result of function object_t::size()
|
||||
array | result of function array_t::size()
|
||||
|
||||
@complexity Constant, as long as @ref array_t and @ref object_t satisfy the
|
||||
Container concept; that is, their size() functions have
|
||||
constant complexity.
|
||||
|
||||
@requirement This function satisfies the Container requirements:
|
||||
- The complexity is constant.
|
||||
- Has the semantics of `std::distance(begin(), end())`.
|
||||
|
||||
@liveexample{The following code calls @ref size on the different value
|
||||
types.,size}
|
||||
|
||||
@ingroup container
|
||||
*/
|
||||
size_type size() const noexcept
|
||||
|
@ -1701,11 +2153,16 @@ class basic_json
|
|||
}
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
///////////////
|
||||
// modifiers //
|
||||
///////////////
|
||||
|
||||
/// @name modifiers
|
||||
/// @{
|
||||
|
||||
/// clears the contents
|
||||
void clear() noexcept
|
||||
{
|
||||
|
@ -1892,11 +2349,16 @@ class basic_json
|
|||
std::swap(*(m_value.string), other);
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
//////////////////////////////////////////
|
||||
// lexicographical comparison operators //
|
||||
//////////////////////////////////////////
|
||||
|
||||
/// @name lexicographical comparison operators
|
||||
/// @{
|
||||
|
||||
/*!
|
||||
@brief comparison: equal
|
||||
@ingroup container
|
||||
|
@ -2012,11 +2474,16 @@ class basic_json
|
|||
return not (lhs < rhs);
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
///////////////////
|
||||
// serialization //
|
||||
///////////////////
|
||||
|
||||
/// @name serialization
|
||||
/// @{
|
||||
|
||||
/// serialize to stream
|
||||
friend std::ostream& operator<<(std::ostream& o, const basic_json& j)
|
||||
{
|
||||
|
@ -2038,11 +2505,16 @@ class basic_json
|
|||
return o << j;
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
/////////////////////
|
||||
// deserialization //
|
||||
/////////////////////
|
||||
|
||||
/// @name deserialization
|
||||
/// @{
|
||||
|
||||
/// deserialize from string
|
||||
static basic_json parse(const string_t& s, parser_callback_t cb = nullptr)
|
||||
{
|
||||
|
@ -2069,6 +2541,8 @@ class basic_json
|
|||
return i;
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
||||
|
||||
private:
|
||||
///////////////////////////
|
||||
|
@ -4184,7 +4658,12 @@ class basic_json
|
|||
// presets //
|
||||
/////////////
|
||||
|
||||
/// default JSON class
|
||||
/*!
|
||||
@brief default JSON class
|
||||
|
||||
This type is the default specialization of the @ref basic_json class which uses
|
||||
the standard template types.
|
||||
*/
|
||||
using json = basic_json<>;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue