From b801adca7688001134029ea42093d80542e3a654 Mon Sep 17 00:00:00 2001 From: Niels Date: Sun, 12 Apr 2015 12:02:30 +0200 Subject: [PATCH] started to implement sequence container --- docs/begin.md | 41 +++++++++++++++++++++++++++++++ mkdocs.yml | 6 ++++- src/json.hpp | 10 +++++++- src/json.hpp.re2c | 10 +++++++- test/unit.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 docs/begin.md diff --git a/docs/begin.md b/docs/begin.md new file mode 100644 index 000000000..3730402d1 --- /dev/null +++ b/docs/begin.md @@ -0,0 +1,41 @@ +```cpp +iterator begin(); +const_iterator begin() const; +const_iterator cbegin() const; +``` + +## Description + +Returns an iterator to the first value in the JSON container. If the JSON container is empty, the returned iterator will be equal to [`end()`](https://github.com/nlohmann/json/wiki/nlohmann::basicjson::end). + +![illustration of iterators](http://upload.cppreference.com/mwiki/images/1/1b/range-begin-end.svg) + +## Parameters + +None. + +## Return value + +Iterator to the first value. Note the return value its deferencabilty depends on the different value types: + +| value type | deferenceable | description | +| ---------- | ------------- | ----------- | +| null | no | `null` has no value, always equal to [`end()`](https://github.com/nlohmann/json/wiki/nlohmann::basicjson::end) | +| boolean | yes | iterator to the boolean value | +| string | yes | iterator to the string value | +| number | yes | iterator to the number value | +| object | only if object is not empty | iterator to the begin of the object | +| array | only if array is not empty | iterator to the begin of the array | + +## Complexity + +Constant, as long as `ArrayType` and `ObjectType` satisfy the [Container concept](http://en.cppreference.com/w/cpp/concept/Container). + +## Exceptions + +None. The function's noexcept-specification is `noexcept`. + +## See also + +- [**end**, **cend**](https://github.com/nlohmann/json/wiki/nlohmann::basicjson::end)
+ returns an iterator to the end diff --git a/mkdocs.yml b/mkdocs.yml index 71972cb3d..29eba859e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,3 +1,7 @@ site_name: JSON for Modern C++ -#theme: readthedocs +theme: readthedocs +#theme: bootstrap +#theme: yeti + +markdown_extensions: [fenced_code] diff --git a/src/json.hpp b/src/json.hpp index 2057f6e4e..a9da694c8 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -156,7 +156,7 @@ class basic_json /// returns the allocator associated with the container - inline allocator_type get_allocator() const + inline static allocator_type get_allocator() { return allocator_type(); } @@ -578,6 +578,14 @@ class basic_json return basic_json(l, false, value_t::object); } + /// construct an array with count copies of given value + inline basic_json(size_type count, const basic_json& other) + : m_type(value_t::array) + { + AllocatorType alloc; + m_value.array = alloc.allocate(1); + alloc.construct(m_value.array, count, other); + } /////////////////////////////////////// // other constructors and destructor // diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 948486176..58d80d9d8 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -156,7 +156,7 @@ class basic_json /// returns the allocator associated with the container - inline allocator_type get_allocator() const + inline static allocator_type get_allocator() { return allocator_type(); } @@ -578,6 +578,14 @@ class basic_json return basic_json(l, false, value_t::object); } + /// construct an array with count copies of given value + inline basic_json(size_type count, const basic_json& other) + : m_type(value_t::array) + { + AllocatorType alloc; + m_value.array = alloc.allocate(1); + alloc.construct(m_value.array, count, other); + } /////////////////////////////////////// // other constructors and destructor // diff --git a/test/unit.cpp b/test/unit.cpp index 6c2aec6d3..e251f7768 100644 --- a/test/unit.cpp +++ b/test/unit.cpp @@ -902,6 +902,17 @@ TEST_CASE("constructors") } } } + + SECTION("create an array of n copies of a given value") + { + json v = {1, "foo", 34.23, {1, 2, 3}, {{"A", 1}, {"B", 2}}}; + json arr(3, v); + CHECK(arr.size() == 3); + for (auto& x : arr) + { + CHECK(x == v); + } + } } TEST_CASE("other constructors and destructor") @@ -7762,6 +7773,56 @@ TEST_CASE("algorithms") TEST_CASE("concepts") { + SECTION("container requirements for json") + { + // X: container class: json + // T: type of objects: json + // a, b: values of type X: json + + // TABLE 96 - Container Requirements + + // X::value_type must return T + CHECK((std::is_same::value)); + + // X::reference must return lvalue of T + CHECK((std::is_same::value)); + + // X::const_reference must return const lvalue of T + CHECK((std::is_same::value)); + + // X::iterator must return iterator whose value_type is T + CHECK((std::is_same::value)); + // X::iterator must meet the forward iterator requirements + CHECK((std::is_base_of::iterator_category>::value)); + // X::iterator must be convertible to X::const_iterator + CHECK((std::is_convertible::value)); + + // X::const_iterator must return iterator whose value_type is T + CHECK((std::is_same::value)); + // X::const_iterator must meet the forward iterator requirements + CHECK((std::is_base_of::iterator_category>::value)); + + // X::difference_type must return a signed integer + CHECK((std::is_signed::value)); + // X::difference_type must be identical to X::iterator::difference_type + CHECK((std::is_same::value)); + // X::difference_type must be identical to X::const_iterator::difference_type + CHECK((std::is_same::value)); + + // X::size_type must return an unsigned integer + CHECK((std::is_unsigned::value)); + // X::size_type can represent any non-negative value of X::difference_type + + // the expression "X u" has the post-condition "u.empty()" + { + json u; + CHECK(u.empty()); + } + + // the expression "X()" has the post-condition "X().empty()" + CHECK(json().empty()); + } + SECTION("class json") { SECTION("DefaultConstructible")