X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fdynamic-inl.h;h=dbe36b5d9347314dfe479e9d9415ff5335156213;hb=03ce292a000fb616c12e2aca2a38b7b26e6ef050;hp=984b7a4cac9da7aa04c451ca67337673e612c0a5;hpb=ed8c80a0e0988e4ce687f51ca832a00e4a6b7930;p=folly.git diff --git a/folly/dynamic-inl.h b/folly/dynamic-inl.h index 984b7a4c..dbe36b5d 100644 --- a/folly/dynamic-inl.h +++ b/folly/dynamic-inl.h @@ -174,10 +174,42 @@ inline dynamic::ObjectMaker dynamic::object(dynamic a, dynamic b) { ////////////////////////////////////////////////////////////////////// +struct dynamic::item_iterator : boost::iterator_adaptor< + dynamic::item_iterator, + dynamic::ObjectImpl::iterator> { + /* implicit */ item_iterator(base_type b) : iterator_adaptor_(b) {} + + using object_type = dynamic::ObjectImpl; + + private: + friend class boost::iterator_core_access; +}; + +struct dynamic::value_iterator : boost::iterator_adaptor< + dynamic::value_iterator, + dynamic::ObjectImpl::iterator, + dynamic> { + /* implicit */ value_iterator(base_type b) : iterator_adaptor_(b) {} + + using object_type = dynamic::ObjectImpl; + + private: + dynamic& dereference() const { + return base_reference()->second; + } + friend class boost::iterator_core_access; +}; + struct dynamic::const_item_iterator : boost::iterator_adaptor { /* implicit */ const_item_iterator(base_type b) : iterator_adaptor_(b) { } + /* implicit */ const_item_iterator(item_iterator i) + : iterator_adaptor_(i.base()) {} + /* implicit */ const_item_iterator(dynamic::ObjectImpl::iterator i) + : iterator_adaptor_(i) {} + + using object_type = dynamic::ObjectImpl const; private: friend class boost::iterator_core_access; @@ -189,6 +221,8 @@ struct dynamic::const_key_iterator dynamic const> { /* implicit */ const_key_iterator(base_type b) : iterator_adaptor_(b) { } + using object_type = dynamic::ObjectImpl const; + private: dynamic const& dereference() const { return base_reference()->first; @@ -201,6 +235,12 @@ struct dynamic::const_value_iterator dynamic::ObjectImpl::const_iterator, dynamic const> { /* implicit */ const_value_iterator(base_type b) : iterator_adaptor_(b) { } + /* implicit */ const_value_iterator(value_iterator i) + : iterator_adaptor_(i.base()) {} + /* implicit */ const_value_iterator(dynamic::ObjectImpl::iterator i) + : iterator_adaptor_(i) {} + + using object_type = dynamic::ObjectImpl const; private: dynamic const& dereference() const { @@ -307,12 +347,20 @@ inline dynamic::const_iterator dynamic::end() const { return get().end(); } +inline dynamic::iterator dynamic::begin() { + return get().begin(); +} +inline dynamic::iterator dynamic::end() { + return get().end(); +} + template struct dynamic::IterableProxy { - typedef It const_iterator; + typedef It iterator; typedef typename It::value_type value_type; + typedef typename It::object_type object_type; - /* implicit */ IterableProxy(const dynamic::ObjectImpl* o) : o_(o) { } + /* implicit */ IterableProxy(object_type* o) : o_(o) {} It begin() const { return o_->begin(); @@ -323,7 +371,7 @@ struct dynamic::IterableProxy { } private: - const dynamic::ObjectImpl* o_; + object_type* o_; }; inline dynamic::IterableProxy dynamic::keys() @@ -341,16 +389,38 @@ inline dynamic::IterableProxy dynamic::items() return &(get()); } +inline dynamic::IterableProxy dynamic::values() { + return &(get()); +} + +inline dynamic::IterableProxy dynamic::items() { + return &(get()); +} + inline bool dynamic::isString() const { - return get_nothrow(); + return get_nothrow() != nullptr; +} +inline bool dynamic::isObject() const { + return get_nothrow() != nullptr; +} +inline bool dynamic::isBool() const { + return get_nothrow() != nullptr; +} +inline bool dynamic::isArray() const { + return get_nothrow() != nullptr; +} +inline bool dynamic::isDouble() const { + return get_nothrow() != nullptr; +} +inline bool dynamic::isInt() const { + return get_nothrow() != nullptr; +} +inline bool dynamic::isNull() const { + return get_nothrow() != nullptr; +} +inline bool dynamic::isNumber() const { + return isInt() || isDouble(); } -inline bool dynamic::isObject() const { return get_nothrow(); } -inline bool dynamic::isBool() const { return get_nothrow(); } -inline bool dynamic::isArray() const { return get_nothrow(); } -inline bool dynamic::isDouble() const { return get_nothrow(); } -inline bool dynamic::isInt() const { return get_nothrow(); } -inline bool dynamic::isNull() const { return get_nothrow(); } -inline bool dynamic::isNumber() const { return isInt() || isDouble(); } inline dynamic::Type dynamic::type() const { return type_; @@ -513,6 +583,9 @@ inline std::size_t dynamic::count(dynamic const& key) const { inline dynamic::const_item_iterator dynamic::find(dynamic const& key) const { return get().find(key); } +inline dynamic::item_iterator dynamic::find(dynamic const& key) { + return get().find(key); +} template inline void dynamic::insert(K&& key, V&& val) { auto& obj = get(); @@ -560,7 +633,7 @@ inline std::size_t dynamic::erase(dynamic const& key) { return obj.erase(key); } -inline dynamic::const_iterator dynamic::erase(const_iterator it) { +inline dynamic::iterator dynamic::erase(const_iterator it) { auto& arr = get(); // std::vector doesn't have an erase method that works on const iterators, // even though the standard says it should, so this hack converts to a @@ -572,30 +645,31 @@ inline dynamic::const_key_iterator dynamic::erase(const_key_iterator it) { return const_key_iterator(get().erase(it.base())); } -inline dynamic::const_key_iterator dynamic::erase(const_key_iterator first, - const_key_iterator last) { +inline dynamic::const_key_iterator dynamic::erase( + const_key_iterator first, + const_key_iterator last) { return const_key_iterator(get().erase(first.base(), last.base())); } -inline dynamic::const_value_iterator dynamic::erase(const_value_iterator it) { - return const_value_iterator(get().erase(it.base())); +inline dynamic::value_iterator dynamic::erase(const_value_iterator it) { + return value_iterator(get().erase(it.base())); } -inline dynamic::const_value_iterator dynamic::erase(const_value_iterator first, - const_value_iterator last) { - return const_value_iterator(get().erase(first.base(), - last.base())); +inline dynamic::value_iterator dynamic::erase( + const_value_iterator first, + const_value_iterator last) { + return value_iterator(get().erase(first.base(), last.base())); } -inline dynamic::const_item_iterator dynamic::erase(const_item_iterator it) { - return const_item_iterator(get().erase(it.base())); +inline dynamic::item_iterator dynamic::erase(const_item_iterator it) { + return item_iterator(get().erase(it.base())); } -inline dynamic::const_item_iterator dynamic::erase(const_item_iterator first, - const_item_iterator last) { - return const_item_iterator(get().erase(first.base(), - last.base())); +inline dynamic::item_iterator dynamic::erase( + const_item_iterator first, + const_item_iterator last) { + return item_iterator(get().erase(first.base(), last.base())); } inline void dynamic::resize(std::size_t sz, dynamic const& c) {