diff --git a/include/json/value.h b/include/json/value.h index 237aa53..7f3ad9b 100644 --- a/include/json/value.h +++ b/include/json/value.h @@ -738,6 +738,7 @@ public: typedef ValueConstIterator SelfType; ValueConstIterator(); + ValueConstIterator(ValueIterator const& other); private: /*! \internal Use by Value to create an iterator. @@ -787,7 +788,7 @@ public: typedef ValueIterator SelfType; ValueIterator(); - ValueIterator(const ValueConstIterator& other); + explicit ValueIterator(const ValueConstIterator& other); ValueIterator(const ValueIterator& other); private: diff --git a/src/lib_json/json_valueiterator.inl b/src/lib_json/json_valueiterator.inl index b3bbc35..ec9c851 100644 --- a/src/lib_json/json_valueiterator.inl +++ b/src/lib_json/json_valueiterator.inl @@ -129,6 +129,9 @@ ValueConstIterator::ValueConstIterator( const Value::ObjectValues::iterator& current) : ValueIteratorBase(current) {} +ValueConstIterator::ValueConstIterator(ValueIterator const& other) + : ValueIteratorBase(other) {} + ValueConstIterator& ValueConstIterator:: operator=(const ValueIteratorBase& other) { copy(other); @@ -149,7 +152,9 @@ ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) : ValueIteratorBase(current) {} ValueIterator::ValueIterator(const ValueConstIterator& other) - : ValueIteratorBase(other) {} + : ValueIteratorBase(other) { + throwRuntimeError("ConstIterator to Iterator should never be allowed."); +} ValueIterator::ValueIterator(const ValueIterator& other) : ValueIteratorBase(other) {} diff --git a/src/test_lib_json/main.cpp b/src/test_lib_json/main.cpp index 7a192ee..c1061f4 100644 --- a/src/test_lib_json/main.cpp +++ b/src/test_lib_json/main.cpp @@ -8,6 +8,9 @@ #include #include #include +#include +#include +#include // Make numeric limits more convenient to talk about. // Assumes int type in 32 bits. @@ -2430,6 +2433,33 @@ JSONTEST_FIXTURE(IteratorTest, indexes) { JSONTEST_ASSERT(it == json.end()); } +JSONTEST_FIXTURE(IteratorTest, const) { + Json::Value const v; + JSONTEST_ASSERT_THROWS( + Json::Value::iterator it(v.begin()) // Compile, but throw. + ); + + Json::Value value; + + for(int i = 9; i < 12; ++i) + { + std::ostringstream out; + out << std::setw(2) << i; + std::string str = out.str(); + value[str] = str; + } + + std::ostringstream out; + //in old code, this will get a compile error + Json::Value::const_iterator iter = value.begin(); + for(; iter != value.end(); ++iter) + { + out << *iter << ','; + } + std::string expected = "\" 9\",\"10\",\"11\","; + JSONTEST_ASSERT_STRING_EQUAL(expected, out.str()); +} + int main(int argc, const char* argv[]) { JsonTest::Runner runner; JSONTEST_REGISTER_FIXTURE(runner, ValueTest, checkNormalizeFloatingPointStr); @@ -2500,6 +2530,7 @@ int main(int argc, const char* argv[]) { JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, distance); JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, names); JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, indexes); + JSONTEST_REGISTER_FIXTURE(runner, IteratorTest, const); return runner.runCommandLine(argc, argv); }