update move assignment
This commit is contained in:
parent
afbef198c6
commit
d3ba4b2e3e
@ -21,13 +21,13 @@ namespace dv {
|
||||
|
||||
enum class value_type : uint8_t {
|
||||
none = 0,
|
||||
number,
|
||||
boolean,
|
||||
integer,
|
||||
object,
|
||||
list,
|
||||
bytes,
|
||||
string,
|
||||
number,
|
||||
boolean,
|
||||
integer
|
||||
string
|
||||
};
|
||||
|
||||
namespace objects {
|
||||
@ -126,36 +126,8 @@ namespace dv {
|
||||
this->operator=(v);
|
||||
}
|
||||
|
||||
value(value&& v) noexcept : 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;
|
||||
}
|
||||
value(value&& v) noexcept {
|
||||
this->operator=(std::move(v));
|
||||
}
|
||||
|
||||
~value() {
|
||||
@ -260,7 +232,39 @@ namespace dv {
|
||||
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) {
|
||||
case value_type::object:
|
||||
setObject(std::move(v.val.object));
|
||||
@ -287,6 +291,7 @@ namespace dv {
|
||||
setNone();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user