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