Commit fadccc34 by Niels

fixed iterator_wrapper

parent 66ec5863
...@@ -5712,41 +5712,14 @@ class basic_json ...@@ -5712,41 +5712,14 @@ class basic_json
json_iterator anchor; json_iterator anchor;
/// an index for arrays /// an index for arrays
size_t array_index = 0; size_t array_index = 0;
size_t container_size = 0;
/// calculate a key for the iterator
std::string calculate_key()
{
switch (anchor.m_object->type())
{
/// use integer array index as key
case (value_t::array):
{
return std::to_string(array_index);
}
/// use key from the object
case (value_t::object):
{
return anchor.key();
}
/// use an empty key for all primitive types
default:
{
return "";
}
}
}
public: public:
/// construct wrapper given an iterator /// construct wrapper given an iterator
iterator_wrapper_internal(json_iterator i, size_t s) iterator_wrapper_internal(json_iterator i) : anchor(i)
: anchor(i), container_size(s), first(calculate_key()), second(*i)
{} {}
/// dereference operator (needed for range-based for) /// dereference operator (needed for range-based for)
iterator_wrapper_internal operator*() iterator_wrapper_internal& operator*()
{ {
return *this; return *this;
} }
...@@ -5757,12 +5730,6 @@ class basic_json ...@@ -5757,12 +5730,6 @@ class basic_json
++anchor; ++anchor;
++array_index; ++array_index;
if (array_index < container_size)
{
first = calculate_key();
second = *anchor;
}
return *this; return *this;
} }
...@@ -5781,19 +5748,33 @@ class basic_json ...@@ -5781,19 +5748,33 @@ class basic_json
/// return key of the iterator /// return key of the iterator
typename basic_json::string_t key() const typename basic_json::string_t key() const
{ {
return first; switch (anchor.m_object->type())
{
/// use integer array index as key
case (value_t::array):
{
return std::to_string(array_index);
} }
/// return value of the iterator /// use key from the object
basic_json value() const case (value_t::object):
{ {
return second; return anchor.key();
} }
/// public member to simulate std::map::iterator access /// use an empty key for all primitive types
typename basic_json::string_t first; default:
/// public member to simulate std::map::iterator access {
basic_json& second; return "";
}
}
}
/// return value of the iterator
typename json_iterator::reference value() const
{
return anchor.value();
}
}; };
public: public:
...@@ -5805,13 +5786,13 @@ class basic_json ...@@ -5805,13 +5786,13 @@ class basic_json
/// return iterator begin (needed for range-based for) /// return iterator begin (needed for range-based for)
iterator_wrapper_internal begin() iterator_wrapper_internal begin()
{ {
return iterator_wrapper_internal(container.begin(), container.size()); return iterator_wrapper_internal(container.begin());
} }
/// return iterator end (needed for range-based for) /// return iterator end (needed for range-based for)
iterator_wrapper_internal end() iterator_wrapper_internal end()
{ {
return iterator_wrapper_internal(container.end(), container.size()); return iterator_wrapper_internal(container.end());
} }
}; };
......
...@@ -5712,41 +5712,14 @@ class basic_json ...@@ -5712,41 +5712,14 @@ class basic_json
json_iterator anchor; json_iterator anchor;
/// an index for arrays /// an index for arrays
size_t array_index = 0; size_t array_index = 0;
size_t container_size = 0;
/// calculate a key for the iterator
std::string calculate_key()
{
switch (anchor.m_object->type())
{
/// use integer array index as key
case (value_t::array):
{
return std::to_string(array_index);
}
/// use key from the object
case (value_t::object):
{
return anchor.key();
}
/// use an empty key for all primitive types
default:
{
return "";
}
}
}
public: public:
/// construct wrapper given an iterator /// construct wrapper given an iterator
iterator_wrapper_internal(json_iterator i, size_t s) iterator_wrapper_internal(json_iterator i) : anchor(i)
: anchor(i), container_size(s), first(calculate_key()), second(*i)
{} {}
/// dereference operator (needed for range-based for) /// dereference operator (needed for range-based for)
iterator_wrapper_internal operator*() iterator_wrapper_internal& operator*()
{ {
return *this; return *this;
} }
...@@ -5757,12 +5730,6 @@ class basic_json ...@@ -5757,12 +5730,6 @@ class basic_json
++anchor; ++anchor;
++array_index; ++array_index;
if (array_index < container_size)
{
first = calculate_key();
second = *anchor;
}
return *this; return *this;
} }
...@@ -5781,19 +5748,33 @@ class basic_json ...@@ -5781,19 +5748,33 @@ class basic_json
/// return key of the iterator /// return key of the iterator
typename basic_json::string_t key() const typename basic_json::string_t key() const
{ {
return first; switch (anchor.m_object->type())
{
/// use integer array index as key
case (value_t::array):
{
return std::to_string(array_index);
} }
/// return value of the iterator /// use key from the object
basic_json value() const case (value_t::object):
{ {
return second; return anchor.key();
} }
/// public member to simulate std::map::iterator access /// use an empty key for all primitive types
typename basic_json::string_t first; default:
/// public member to simulate std::map::iterator access {
basic_json& second; return "";
}
}
}
/// return value of the iterator
typename json_iterator::reference value() const
{
return anchor.value();
}
}; };
public: public:
...@@ -5805,13 +5786,13 @@ class basic_json ...@@ -5805,13 +5786,13 @@ class basic_json
/// return iterator begin (needed for range-based for) /// return iterator begin (needed for range-based for)
iterator_wrapper_internal begin() iterator_wrapper_internal begin()
{ {
return iterator_wrapper_internal(container.begin(), container.size()); return iterator_wrapper_internal(container.begin());
} }
/// return iterator end (needed for range-based for) /// return iterator end (needed for range-based for)
iterator_wrapper_internal end() iterator_wrapper_internal end()
{ {
return iterator_wrapper_internal(container.end(), container.size()); return iterator_wrapper_internal(container.end());
} }
}; };
......
...@@ -9260,11 +9260,12 @@ TEST_CASE("concepts") ...@@ -9260,11 +9260,12 @@ TEST_CASE("concepts")
} }
} }
/*
TEST_CASE("iterator_wrapper") TEST_CASE("iterator_wrapper")
{ {
SECTION("object") SECTION("object")
{ {
SECTION("value")
{
json j = {{"A", 1}, {"B", 2}}; json j = {{"A", 1}, {"B", 2}};
int counter = 1; int counter = 1;
...@@ -9276,8 +9277,6 @@ TEST_CASE("iterator_wrapper") ...@@ -9276,8 +9277,6 @@ TEST_CASE("iterator_wrapper")
{ {
CHECK(i.key() == "A"); CHECK(i.key() == "A");
CHECK(i.value() == json(1)); CHECK(i.value() == json(1));
CHECK(i.first == "A");
CHECK(i.second == json(1));
break; break;
} }
...@@ -9285,16 +9284,103 @@ TEST_CASE("iterator_wrapper") ...@@ -9285,16 +9284,103 @@ TEST_CASE("iterator_wrapper")
{ {
CHECK(i.key() == "B"); CHECK(i.key() == "B");
CHECK(i.value() == json(2)); CHECK(i.value() == json(2));
CHECK(i.first == "B");
CHECK(i.second == json(2));
break; break;
} }
} }
} }
CHECK(counter == 3);
}
SECTION("reference")
{
json j = {{"A", 1}, {"B", 2}};
int counter = 1;
for (auto& i : json::iterator_wrapper(j))
{
switch (counter++)
{
case 1:
{
CHECK(i.key() == "A");
CHECK(i.value() == json(1));
break;
}
case 2:
{
CHECK(i.key() == "B");
CHECK(i.value() == json(2));
break;
}
}
}
CHECK(counter == 3);
}
SECTION("const value")
{
json j = {{"A", 1}, {"B", 2}};
int counter = 1;
for (const auto i : json::iterator_wrapper(j))
{
switch (counter++)
{
case 1:
{
CHECK(i.key() == "A");
CHECK(i.value() == json(1));
break;
}
case 2:
{
CHECK(i.key() == "B");
CHECK(i.value() == json(2));
break;
}
}
}
CHECK(counter == 3);
}
SECTION("const reference")
{
json j = {{"A", 1}, {"B", 2}};
int counter = 1;
for (const auto& i : json::iterator_wrapper(j))
{
switch (counter++)
{
case 1:
{
CHECK(i.key() == "A");
CHECK(i.value() == json(1));
break;
}
case 2:
{
CHECK(i.key() == "B");
CHECK(i.value() == json(2));
break;
}
}
}
CHECK(counter == 3);
}
} }
SECTION("array") SECTION("array")
{ {
SECTION("value")
{
json j = {"A", "B"}; json j = {"A", "B"};
int counter = 1; int counter = 1;
...@@ -9306,8 +9392,6 @@ TEST_CASE("iterator_wrapper") ...@@ -9306,8 +9392,6 @@ TEST_CASE("iterator_wrapper")
{ {
CHECK(i.key() == "0"); CHECK(i.key() == "0");
CHECK(i.value() == "A"); CHECK(i.value() == "A");
CHECK(i.first == "0");
CHECK(i.second == "A");
break; break;
} }
...@@ -9315,15 +9399,162 @@ TEST_CASE("iterator_wrapper") ...@@ -9315,15 +9399,162 @@ TEST_CASE("iterator_wrapper")
{ {
CHECK(i.key() == "1"); CHECK(i.key() == "1");
CHECK(i.value() == "B"); CHECK(i.value() == "B");
CHECK(i.first == "1");
CHECK(i.second == "B");
break; break;
} }
} }
} }
CHECK(counter == 3);
}
SECTION("reference")
{
json j = {"A", "B"};
int counter = 1;
for (auto& i : json::iterator_wrapper(j))
{
switch (counter++)
{
case 1:
{
CHECK(i.key() == "0");
CHECK(i.value() == "A");
break;
}
case 2:
{
CHECK(i.key() == "1");
CHECK(i.value() == "B");
break;
}
}
}
CHECK(counter == 3);
}
SECTION("const value")
{
json j = {"A", "B"};
int counter = 1;
for (const auto i : json::iterator_wrapper(j))
{
switch (counter++)
{
case 1:
{
CHECK(i.key() == "0");
CHECK(i.value() == "A");
break;
}
case 2:
{
CHECK(i.key() == "1");
CHECK(i.value() == "B");
break;
}
}
}
CHECK(counter == 3);
}
SECTION("const reference")
{
json j = {"A", "B"};
int counter = 1;
for (const auto& i : json::iterator_wrapper(j))
{
switch (counter++)
{
case 1:
{
CHECK(i.key() == "0");
CHECK(i.value() == "A");
break;
}
case 2:
{
CHECK(i.key() == "1");
CHECK(i.value() == "B");
break;
}
}
}
CHECK(counter == 3);
}
}
SECTION("primitive")
{
SECTION("value")
{
json j = 1;
int counter = 1;
for (auto i : json::iterator_wrapper(j))
{
++counter;
CHECK(i.key() == "");
CHECK(i.value() == json(1));
}
CHECK(counter == 2);
}
SECTION("reference")
{
json j = 1;
int counter = 1;
for (auto& i : json::iterator_wrapper(j))
{
++counter;
CHECK(i.key() == "");
CHECK(i.value() == json(1));
}
CHECK(counter == 2);
}
SECTION("const value")
{
json j = 1;
int counter = 1;
for (const auto i : json::iterator_wrapper(j))
{
++counter;
CHECK(i.key() == "");
CHECK(i.value() == json(1));
}
CHECK(counter == 2);
}
SECTION("reference")
{
json j = 1;
int counter = 1;
for (const auto& i : json::iterator_wrapper(j))
{
++counter;
CHECK(i.key() == "");
CHECK(i.value() == json(1));
}
CHECK(counter == 2);
}
} }
} }
*/
TEST_CASE("compliance tests from json.org") TEST_CASE("compliance tests from json.org")
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment