- fixes from Harro

This commit is contained in:
Niels 2013-07-05 11:23:49 +02:00
parent 23ada516aa
commit 61461ec456
3 changed files with 96 additions and 13 deletions

View file

@ -643,6 +643,7 @@ std::string JSON::parser::parseString() {
const size_t length = p - _buffer - _pos; const size_t length = p - _buffer - _pos;
char* tmp = new char[length + 1]; char* tmp = new char[length + 1];
std::strncpy(tmp, _buffer + _pos, length); std::strncpy(tmp, _buffer + _pos, length);
tmp[length] = 0;
std::string result(tmp); std::string result(tmp);
delete [] tmp; delete [] tmp;
@ -838,11 +839,11 @@ JSON::iterator::iterator(JSON* j) : _object(j), _vi(nullptr), _oi(nullptr) {
JSON::iterator::iterator(const JSON::iterator& o) : _object(o._object), _vi(nullptr), _oi(nullptr) { JSON::iterator::iterator(const JSON::iterator& o) : _object(o._object), _vi(nullptr), _oi(nullptr) {
switch (_object->_type) { switch (_object->_type) {
case (array): { case (array): {
_vi = new std::vector<JSON>::iterator(static_cast<std::vector<JSON>*>(_object->_payload)->begin()); _vi = new std::vector<JSON>::iterator(*(o._vi));
break; break;
} }
case (object): { case (object): {
_oi = new std::map<std::string, JSON>::iterator(static_cast<std::map<std::string, JSON>*>(_object->_payload)->begin()); _oi = new std::map<std::string, JSON>::iterator(*(o._oi));
break; break;
} }
default: default:
@ -857,6 +858,18 @@ JSON::iterator::~iterator() {
JSON::iterator& JSON::iterator::operator=(const JSON::iterator& o) { JSON::iterator& JSON::iterator::operator=(const JSON::iterator& o) {
_object = o._object; _object = o._object;
switch (_object->_type) {
case (array): {
_vi = new std::vector<JSON>::iterator(*(o._vi));
break;
}
case (object): {
_oi = new std::map<std::string, JSON>::iterator(*(o._oi));
break;
}
default:
break;
}
return *this; return *this;
} }
@ -985,11 +998,11 @@ JSON::const_iterator::const_iterator(const JSON* j) : _object(j), _vi(nullptr),
JSON::const_iterator::const_iterator(const JSON::const_iterator& o) : _object(o._object), _vi(nullptr), _oi(nullptr) { JSON::const_iterator::const_iterator(const JSON::const_iterator& o) : _object(o._object), _vi(nullptr), _oi(nullptr) {
switch (_object->_type) { switch (_object->_type) {
case (array): { case (array): {
_vi = new std::vector<JSON>::const_iterator(static_cast<std::vector<JSON>*>(_object->_payload)->begin()); _vi = new std::vector<JSON>::const_iterator(*(o._vi));
break; break;
} }
case (object): { case (object): {
_oi = new std::map<std::string, JSON>::const_iterator(static_cast<std::map<std::string, JSON>*>(_object->_payload)->begin()); _oi = new std::map<std::string, JSON>::const_iterator(*(o._oi));
break; break;
} }
default: default:
@ -1000,11 +1013,11 @@ JSON::const_iterator::const_iterator(const JSON::const_iterator& o) : _object(o.
JSON::const_iterator::const_iterator(const JSON::iterator& o) : _object(o._object), _vi(nullptr), _oi(nullptr) { JSON::const_iterator::const_iterator(const JSON::iterator& o) : _object(o._object), _vi(nullptr), _oi(nullptr) {
switch (_object->_type) { switch (_object->_type) {
case (array): { case (array): {
_vi = new std::vector<JSON>::const_iterator(static_cast<std::vector<JSON>*>(_object->_payload)->begin()); _vi = new std::vector<JSON>::const_iterator(*(o._vi));
break; break;
} }
case (object): { case (object): {
_oi = new std::map<std::string, JSON>::const_iterator(static_cast<std::map<std::string, JSON>*>(_object->_payload)->begin()); _oi = new std::map<std::string, JSON>::const_iterator(*(o._oi));
break; break;
} }
default: default:
@ -1019,6 +1032,18 @@ JSON::const_iterator::~const_iterator() {
JSON::const_iterator& JSON::const_iterator::operator=(const JSON::const_iterator& o) { JSON::const_iterator& JSON::const_iterator::operator=(const JSON::const_iterator& o) {
_object = o._object; _object = o._object;
switch (_object->_type) {
case (array): {
_vi = new std::vector<JSON>::const_iterator(*(o._vi));
break;
}
case (object): {
_oi = new std::map<std::string, JSON>::const_iterator(*(o._oi));
break;
}
default:
break;
}
return *this; return *this;
} }

View file

@ -6,8 +6,8 @@
#endif #endif
// allow us to use "nullptr" everywhere // allow us to use "nullptr" everywhere
#ifndef nullptr
#include <cstddef> #include <cstddef>
#ifndef nullptr
#define nullptr NULL #define nullptr NULL
#endif #endif

View file

@ -202,20 +202,78 @@ void test_array() {
#endif #endif
// iterators // iterators
for (JSON::iterator i = a.begin(); i != a.end(); ++i) { {
std::cerr << *i << '\n'; size_t count = 0;
for (JSON::iterator i = a.begin(); i != a.end(); ++i) {
std::cerr << *i << '\n';
count++;
}
assert(count == a.size());
} }
for (JSON::const_iterator i = a.cbegin(); i != a.cend(); ++i) { {
std::cerr << *i << '\n'; /*
size_t count = 0;
for (JSON::const_iterator i = a.begin(); i != a.end(); ++i) {
std::cerr << *i << '\n';
count++;
}
assert(count == a.size());
*/
}
{
size_t count = 0;
for (JSON::const_iterator i = a.cbegin(); i != a.cend(); ++i) {
std::cerr << *i << '\n';
count++;
}
assert(count == a.size());
} }
#ifdef __cplusplus11 #ifdef __cplusplus11
for (auto element : a) { {
std::cerr << element << '\n'; size_t count = 0;
for (auto element : a) {
std::cerr << element << '\n';
count++;
}
assert(count == a.size());
} }
#endif #endif
{
JSON::iterator i;
size_t count = 0;
for (i = a.begin(); i != a.end(); ++i) {
std::cerr << *i << '\n';
count++;
}
assert(count == a.size());
}
{
/*
JSON::const_iterator i;
size_t count = 0;
for (i = a.begin(); i != a.end(); ++i) {
std::cerr << *i << '\n';
count++;
}
assert(count == a.size());
*/
}
{
JSON::const_iterator i;
size_t count = 0;
for (i = a.cbegin(); i != a.cend(); ++i) {
std::cerr << *i << '\n';
count++;
}
assert(count == a.size());
}
{ {
// get payload // get payload
std::vector<JSON>* array = static_cast<std::vector<JSON>*>(a.data()); std::vector<JSON>* array = static_cast<std::vector<JSON>*>(a.data());