From 9b26758519d73d8e0d82dac93cb66029cd6015d5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Mon, 16 Sep 2024 20:21:28 +0300 Subject: [PATCH] add dv::value.size/length, .asObject() --- src/data/dv.hpp | 52 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/src/data/dv.hpp b/src/data/dv.hpp index 6880327f..d512f62e 100644 --- a/src/data/dv.hpp +++ b/src/data/dv.hpp @@ -39,6 +39,7 @@ namespace dv { class value; using list_t = std::vector; + using map_t = std::unordered_map; using pair = std::pair; class value { @@ -288,6 +289,14 @@ namespace dv { objects::Bytes& asBytes(); const objects::Bytes& asBytes() const; + + const objects::Object& asObject() const; + + const size_t size() const; + + const size_t length() const { + return size(); + } }; using reference = value&; @@ -303,9 +312,6 @@ namespace dv { namespace dv::objects { class Object { - public: - using map_t = std::unordered_map; - private: map_t map; public: Object() = default; @@ -316,10 +322,20 @@ namespace dv::objects { reference operator[](const key_t& key) { return map[key]; } - const_reference operator[](const key_t& key) const { return map.at(key); } + + map_t::const_iterator begin() const { + return map.begin(); + } + map_t::const_iterator end() const { + return map.end(); + } + + const size_t size() const { + return map.size(); + } }; class List { @@ -350,12 +366,16 @@ namespace dv::objects { return list.end(); } - auto begin() const { + list_t::const_iterator begin() const { return list.begin(); } - auto end() const { + list_t::const_iterator end() const { return list.end(); } + + const size_t size() const { + return list.size(); + } }; } @@ -510,6 +530,26 @@ namespace dv { throw std::runtime_error("type error"); } + const objects::Object& value::asObject() const { + if (type == value_type::object) { + return *val.object; + } + throw std::runtime_error("type error"); + } + + const size_t value::size() const { + switch (type) { + case value_type::list: + return val.list->size(); + case value_type::object: + return val.object->size(); + case value_type::string: + return val.string->size(); + default: + throw std::runtime_error("type error"); + } + } + value object() { return std::make_shared(); }