From fa12b9b751ba9a99260d6c6a939878da7518ff62 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 15 Sep 2024 11:15:37 +0300 Subject: [PATCH] add dv::value.object(...), .list(...) --- src/data/dv.hpp | 28 ++++++++++++++++++++++++++++ test/data/dv.cpp | 35 +++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/data/dv.hpp b/src/data/dv.hpp index fc34acb0..51fe80e3 100644 --- a/src/data/dv.hpp +++ b/src/data/dv.hpp @@ -228,6 +228,14 @@ namespace dv { value& operator[](size_t index); const value& operator[](size_t index) const; + + value& object(const key_t& key); + + value& list(const key_t& key); + + value& object(); + + value& list(); }; using reference = value&; @@ -355,4 +363,24 @@ namespace dv { } throw std::runtime_error("value is not a list"); } + + value& value::object(const key_t& key) { + reference ref = this->operator[](key); + ref = dv::object(); + return ref; + } + + value& value::list(const key_t& key) { + reference ref = this->operator[](key); + ref = dv::list(); + return ref; + } + + value& value::object() { + return add(dv::object()); + } + + value& value::list() { + return add(dv::list()); + } } diff --git a/test/data/dv.cpp b/test/data/dv.cpp index ad521bfb..ad2aefa5 100644 --- a/test/data/dv.cpp +++ b/test/data/dv.cpp @@ -1,14 +1,33 @@ #include #include "data/dv.hpp" +#include "data/dynamic.hpp" +#include "util/timeutil.hpp" TEST(dv, dv) { - auto value = dv::object({ - {"d", "test"} - }); - auto list = dv::list({ - 561, 52, "hello" - }); - list.add("world"); - value["a"] = 51; + // speed comparsion with data/dynamic + + { + timeutil::ScopeLogTimer log(444); + auto map = dynamic::create_map(); + auto& list = map->putList("elements"); + for (int i = 0; i < 10000; i++) { + auto& obj = list.putMap(); + obj.put("name", "user"); + obj.put("age", 90); + auto pos = dynamic::create_list({40, -41, 52}); + obj.put("position", pos); + } + } + { + timeutil::ScopeLogTimer log(555); + auto value = dv::object(); + auto& list = value.list("elements"); + for (int i = 0; i < 10000; i++) { + auto& obj = list.object(); + obj["name"] = "user"; + obj["age"] = 90; + obj["position"] = dv::list({40, -41, 52}); + } + } }