Skip to content

Commit 9c17e61

Browse files
committed
Merge pull request open-source-parsers#379 from cdunn2001/issue-377
Iterator conversions
2 parents beae999 + c8a8cfc commit 9c17e61

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

include/json/value.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,7 @@ class JSON_API ValueConstIterator : public ValueIteratorBase {
738738
typedef ValueConstIterator SelfType;
739739

740740
ValueConstIterator();
741+
ValueConstIterator(ValueIterator const& other);
741742

742743
private:
743744
/*! \internal Use by Value to create an iterator.
@@ -787,7 +788,7 @@ class JSON_API ValueIterator : public ValueIteratorBase {
787788
typedef ValueIterator SelfType;
788789

789790
ValueIterator();
790-
ValueIterator(const ValueConstIterator& other);
791+
explicit ValueIterator(const ValueConstIterator& other);
791792
ValueIterator(const ValueIterator& other);
792793

793794
private:

src/lib_json/json_valueiterator.inl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ ValueConstIterator::ValueConstIterator(
129129
const Value::ObjectValues::iterator& current)
130130
: ValueIteratorBase(current) {}
131131

132+
ValueConstIterator::ValueConstIterator(ValueIterator const& other)
133+
: ValueIteratorBase(other) {}
134+
132135
ValueConstIterator& ValueConstIterator::
133136
operator=(const ValueIteratorBase& other) {
134137
copy(other);
@@ -149,7 +152,9 @@ ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
149152
: ValueIteratorBase(current) {}
150153

151154
ValueIterator::ValueIterator(const ValueConstIterator& other)
152-
: ValueIteratorBase(other) {}
155+
: ValueIteratorBase(other) {
156+
throwRuntimeError("ConstIterator to Iterator should never be allowed.");
157+
}
153158

154159
ValueIterator::ValueIterator(const ValueIterator& other)
155160
: ValueIteratorBase(other) {}

src/test_lib_json/main.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
#include <json/json.h>
99
#include <cstring>
1010
#include <limits>
11+
#include <sstream>
12+
#include <string>
13+
#include <iomanip>
1114

1215
// Make numeric limits more convenient to talk about.
1316
// Assumes int type in 32 bits.
@@ -2430,6 +2433,33 @@ JSONTEST_FIXTURE(IteratorTest, indexes) {
24302433
JSONTEST_ASSERT(it == json.end());
24312434
}
24322435

2436+
JSONTEST_FIXTURE(IteratorTest, const) {
2437+
Json::Value const v;
2438+
JSONTEST_ASSERT_THROWS(
2439+
Json::Value::iterator it(v.begin()) // Compile, but throw.
2440+
);
2441+
2442+
Json::Value value;
2443+
2444+
for(int i = 9; i < 12; ++i)
2445+
{
2446+
std::ostringstream out;
2447+
out << std::setw(2) << i;
2448+
std::string str = out.str();
2449+
value[str] = str;
2450+
}
2451+
2452+
std::ostringstream out;
2453+
//in old code, this will get a compile error
2454+
Json::Value::const_iterator iter = value.begin();
2455+
for(; iter != value.end(); ++iter)
2456+
{
2457+
out << *iter << ',';
2458+
}
2459+
std::string expected = "\" 9\",\"10\",\"11\",";
2460+
JSONTEST_ASSERT_STRING_EQUAL(expected, out.str());
2461+
}
2462+
24332463
int main(int argc, const char* argv[]) {
24342464
JsonTest::Runner runner;
24352465
JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr);
@@ -2500,6 +2530,7 @@ int main(int argc, const char* argv[]) {
25002530
JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance);
25012531
JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names);
25022532
JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes);
2533+
JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, const);
25032534

25042535
return runner.runCommandLine(argc, argv);
25052536
}

0 commit comments

Comments
 (0)