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,32 +232,65 @@ namespace dv {
return *this; return *this;
} }
inline value& operator=(value&& v) { inline value& operator=(value&& v) noexcept {
switch (v.type) { if (type < value_type::object) {
case value_type::object: type = v.type;
setObject(std::move(v.val.object)); switch (v.type) {
break; case value_type::none:
case value_type::list: break;
setList(std::move(v.val.list)); case value_type::integer:
break; val.integer = v.val.integer;
case value_type::bytes: break;
setBytes(std::move(v.val.bytes)); case value_type::number:
break; val.number = v.val.number;
case value_type::string: break;
setString(std::move(v.val.string)); case value_type::boolean:
break; val.boolean = v.val.boolean;
case value_type::boolean: break;
setBoolean(v.val.boolean); case value_type::string:
break; new(&val.string)std::unique_ptr<std::string>(
case value_type::integer: std::move(v.val.string));
setInteger(v.val.integer); break;
break; case value_type::object:
case value_type::number: new(&val.object)std::shared_ptr<objects::Object>(
setNumber(v.val.number); std::move(v.val.object));
break; break;
case value_type::none: case value_type::list:
setNone(); new(&val.list)std::shared_ptr<objects::List>(
break; 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) {
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; return *this;
} }