update move assignment

This commit is contained in:
MihailRis 2024-09-17 14:04:23 +03:00
parent afbef198c6
commit d3ba4b2e3e

View File

@ -21,13 +21,13 @@ namespace dv {
enum class value_type : uint8_t { enum class value_type : uint8_t {
none = 0, none = 0,
number,
boolean,
integer,
object, object,
list, list,
bytes, bytes,
string, string
number,
boolean,
integer
}; };
namespace objects { namespace objects {
@ -126,36 +126,8 @@ namespace dv {
this->operator=(v); this->operator=(v);
} }
value(value&& v) noexcept : type(v.type) { value(value&& v) noexcept {
switch (v.type) { this->operator=(std::move(v));
case value_type::none:
break;
case value_type::integer:
val.integer = v.val.integer;
break;
case value_type::number:
val.number = v.val.number;
break;
case value_type::boolean:
val.boolean = v.val.boolean;
break;
case value_type::string:
new(&val.string)std::unique_ptr<std::string>(
std::move(v.val.string));
break;
case value_type::object:
new(&val.object)std::shared_ptr<objects::Object>(
std::move(v.val.object));
break;
case value_type::list:
new(&val.list)std::shared_ptr<objects::List>(
std::move(v.val.list));
break;
case value_type::bytes:
new(&val.list)std::shared_ptr<objects::Bytes>(
std::move(v.val.bytes));
break;
}
} }
~value() { ~value() {
@ -260,7 +232,39 @@ namespace dv {
return *this; return *this;
} }
inline value& operator=(value&& v) { inline value& operator=(value&& v) noexcept {
if (type < value_type::object) {
type = v.type;
switch (v.type) {
case value_type::none:
break;
case value_type::integer:
val.integer = v.val.integer;
break;
case value_type::number:
val.number = v.val.number;
break;
case value_type::boolean:
val.boolean = v.val.boolean;
break;
case value_type::string:
new(&val.string)std::unique_ptr<std::string>(
std::move(v.val.string));
break;
case value_type::object:
new(&val.object)std::shared_ptr<objects::Object>(
std::move(v.val.object));
break;
case value_type::list:
new(&val.list)std::shared_ptr<objects::List>(
std::move(v.val.list));
break;
case value_type::bytes:
new(&val.list)std::shared_ptr<objects::Bytes>(
std::move(v.val.bytes));
break;
}
} else {
switch (v.type) { switch (v.type) {
case value_type::object: case value_type::object:
setObject(std::move(v.val.object)); setObject(std::move(v.val.object));
@ -287,6 +291,7 @@ namespace dv {
setNone(); setNone();
break; break;
} }
}
return *this; return *this;
} }