diff --git a/src/data/dv.hpp b/src/data/dv.hpp index dda235ed..1b072bd3 100644 --- a/src/data/dv.hpp +++ b/src/data/dv.hpp @@ -42,6 +42,9 @@ namespace dv { using map_t = std::unordered_map; using pair = std::pair; + using reference = value&; + using const_reference = const value&; + class value { value_type type = value_type::none; union value_u { @@ -86,6 +89,12 @@ namespace dv { type = value_type::string; return *this; } + inline value& setString(std::unique_ptr v) { + this->~value(); + new(&val.string)std::unique_ptr(std::move(v)); + type = value_type::string; + return *this; + } inline value& setList(std::shared_ptr ptr) { this->~value(); new(&val.list)std::shared_ptr(std::move(ptr)); @@ -251,6 +260,36 @@ namespace dv { return *this; } + inline value& operator=(value&& v) { + switch (v.type) { + case value_type::object: + setObject(std::move(v.val.object)); + break; + case value_type::list: + setList(std::move(v.val.list)); + break; + case value_type::bytes: + setBytes(std::move(v.val.bytes)); + break; + case value_type::string: + setString(std::move(v.val.string)); + break; + case value_type::boolean: + setBoolean(v.val.boolean); + break; + case value_type::integer: + setInteger(v.val.integer); + break; + case value_type::number: + setNumber(v.val.number); + break; + case value_type::none: + setNone(); + break; + } + return *this; + } + void add(value v); template @@ -309,9 +348,6 @@ namespace dv { }; inline value none = value(); - - using reference = value&; - using const_reference = const value&; } namespace dv::objects {