update move assignment
This commit is contained in:
parent
afbef198c6
commit
d3ba4b2e3e
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user