- a find() function

This commit is contained in:
Niels 2013-07-05 14:16:47 +02:00
parent ac5ff65856
commit 0ee8d53a28
2 changed files with 56 additions and 5 deletions

View file

@ -484,6 +484,48 @@ JSON::json_t JSON::type() const {
return _type; return _type;
} }
JSON::iterator JSON::find(const std::string& key) {
return find(key.c_str());
}
JSON::const_iterator JSON::find(const std::string& key) const {
return find(key.c_str());
}
JSON::iterator JSON::find(const char* key) {
if (_type != object) {
return end();
} else {
std::map<std::string, JSON>* o = static_cast<std::map<std::string, JSON>*>(_payload);
const std::map<std::string, JSON>::iterator i = o->find(key);
if (i != o->end()) {
JSON::iterator result;
result._object = this;
result._oi = new std::map<std::string, JSON>::iterator(i);
return result;
} else {
return end();
}
}
}
JSON::const_iterator JSON::find(const char* key) const {
if (_type != object) {
return end();
} else {
std::map<std::string, JSON>* o = static_cast<std::map<std::string, JSON>*>(_payload);
const std::map<std::string, JSON>::const_iterator i = o->find(key);
if (i != o->end()) {
JSON::const_iterator result;
result._object = this;
result._oi = new std::map<std::string, JSON>::const_iterator(i);
return result;
} else {
return end();
}
}
}
/// direct access to the underlying payload /// direct access to the underlying payload
void* JSON::data() { void* JSON::data() {
return _payload; return _payload;

View file

@ -22,6 +22,11 @@
#endif #endif
class JSON { class JSON {
// forward declaration to friend this class
public:
class iterator;
class const_iterator;
private: private:
#ifdef __cplusplus11 #ifdef __cplusplus11
/// mutex to guard payload /// mutex to guard payload
@ -158,6 +163,12 @@ class JSON {
/// return the type of the object /// return the type of the object
json_t type() const; json_t type() const;
/// find an element in an object (returns end() iterator otherwise)
iterator find(const std::string&);
const_iterator find(const std::string&) const;
iterator find(const char *);
const_iterator find(const char *) const;
/// direct access to the underlying payload /// direct access to the underlying payload
void* data(); void* data();
/// direct access to the underlying payload /// direct access to the underlying payload
@ -170,13 +181,10 @@ class JSON {
/// return the type as string /// return the type as string
std::string _typename() const; std::string _typename() const;
// forward declaration to friend this class
public:
class const_iterator;
public: public:
/// an iterator /// an iterator
class iterator { class iterator {
friend class JSON;
friend class JSON::const_iterator; friend class JSON::const_iterator;
public: public:
iterator(); iterator();
@ -207,6 +215,7 @@ class JSON {
/// a const iterator /// a const iterator
class const_iterator { class const_iterator {
friend class JSON;
public: public:
const_iterator(); const_iterator();
const_iterator(const JSON*); const_iterator(const JSON*);