optimize move constructor
This commit is contained in:
+10
-4
@@ -52,9 +52,9 @@ namespace dv {
|
|||||||
throw std::runtime_error("value is not a list");
|
throw std::runtime_error("value is not a list");
|
||||||
}
|
}
|
||||||
|
|
||||||
value& value::add(value v) {
|
void value::add(value v) {
|
||||||
if (type == value_type::list) {
|
if (type == value_type::list) {
|
||||||
return val.list->add(std::move(v));
|
return val.list->push(std::move(v));
|
||||||
}
|
}
|
||||||
throw std::runtime_error("value is not a list");
|
throw std::runtime_error("value is not a list");
|
||||||
}
|
}
|
||||||
@@ -72,11 +72,17 @@ namespace dv {
|
|||||||
}
|
}
|
||||||
|
|
||||||
value& value::object() {
|
value& value::object() {
|
||||||
return add(dv::object());
|
if (type == value_type::list) {
|
||||||
|
return val.list->add(std::make_shared<objects::Object>());
|
||||||
|
}
|
||||||
|
throw std::runtime_error("value is not a list");
|
||||||
}
|
}
|
||||||
|
|
||||||
value& value::list() {
|
value& value::list() {
|
||||||
return add(dv::list());
|
if (type == value_type::list) {
|
||||||
|
return val.list->add(std::make_shared<objects::List>());
|
||||||
|
}
|
||||||
|
throw std::runtime_error("value is not a list");
|
||||||
}
|
}
|
||||||
|
|
||||||
list_t::iterator value::begin() {
|
list_t::iterator value::begin() {
|
||||||
|
|||||||
+34
-30
@@ -56,55 +56,52 @@ namespace dv {
|
|||||||
~value_u() {}
|
~value_u() {}
|
||||||
} val;
|
} val;
|
||||||
|
|
||||||
value& setBoolean(boolean_t v) {
|
inline value& setBoolean(boolean_t v) {
|
||||||
this->~value();
|
this->~value();
|
||||||
type = value_type::boolean;
|
type = value_type::boolean;
|
||||||
val.boolean = v;
|
val.boolean = v;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setInteger(integer_t v) {
|
inline value& setInteger(integer_t v) {
|
||||||
this->~value();
|
this->~value();
|
||||||
type = value_type::integer;
|
type = value_type::integer;
|
||||||
val.integer = v;
|
val.integer = v;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setNumber(number_t v) {
|
inline value& setNumber(number_t v) {
|
||||||
this->~value();
|
this->~value();
|
||||||
type = value_type::number;
|
type = value_type::number;
|
||||||
val.number = v;
|
val.number = v;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setNone() {
|
inline value& setNone() {
|
||||||
this->~value();
|
this->~value();
|
||||||
type = value_type::none;
|
type = value_type::none;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setString(std::string v) {
|
inline value& setString(std::string v) {
|
||||||
this->~value();
|
this->~value();
|
||||||
new(&val.string)std::unique_ptr<std::string>();
|
new(&val.string)std::unique_ptr<std::string>(
|
||||||
val.string = std::make_unique<std::string>(v);
|
std::make_unique<std::string>(std::move(v)));
|
||||||
type = value_type::string;
|
type = value_type::string;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setList(std::shared_ptr<objects::List> ptr) {
|
inline value& setList(std::shared_ptr<objects::List> ptr) {
|
||||||
this->~value();
|
this->~value();
|
||||||
new(&val.list)std::shared_ptr<objects::List>();
|
new(&val.list)std::shared_ptr<objects::List>(std::move(ptr));
|
||||||
type = value_type::list;
|
type = value_type::list;
|
||||||
val.list = ptr;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setObject(std::shared_ptr<objects::Object> ptr) {
|
inline value& setObject(std::shared_ptr<objects::Object> ptr) {
|
||||||
this->~value();
|
this->~value();
|
||||||
new(&val.object)std::shared_ptr<objects::Object>();
|
new(&val.object)std::shared_ptr<objects::Object>(std::move(ptr));
|
||||||
type = value_type::object;
|
type = value_type::object;
|
||||||
val.object = ptr;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
value& setBytes(std::shared_ptr<objects::Bytes> ptr) {
|
inline value& setBytes(std::shared_ptr<objects::Bytes> ptr) {
|
||||||
this->~value();
|
this->~value();
|
||||||
new(&val.bytes)std::shared_ptr<objects::Bytes>();
|
new(&val.bytes)std::shared_ptr<objects::Bytes>(std::move(ptr));
|
||||||
type = value_type::bytes;
|
type = value_type::bytes;
|
||||||
val.bytes = ptr;
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
@@ -120,31 +117,34 @@ namespace dv {
|
|||||||
this->operator=(v);
|
this->operator=(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
value(value&& v) noexcept {
|
value(value&& v) noexcept : type(v.type) {
|
||||||
switch (v.type) {
|
switch (v.type) {
|
||||||
case value_type::none:
|
case value_type::none:
|
||||||
setNone();
|
|
||||||
break;
|
break;
|
||||||
case value_type::integer:
|
case value_type::integer:
|
||||||
setInteger(v.val.integer);
|
val.integer = v.val.integer;
|
||||||
break;
|
break;
|
||||||
case value_type::number:
|
case value_type::number:
|
||||||
setNumber(v.val.number);
|
val.number = v.val.number;
|
||||||
break;
|
break;
|
||||||
case value_type::boolean:
|
case value_type::boolean:
|
||||||
setBoolean(v.val.boolean);
|
val.boolean = v.val.boolean;
|
||||||
break;
|
break;
|
||||||
case value_type::string:
|
case value_type::string:
|
||||||
setString(*v.val.string);
|
new(&val.string)std::unique_ptr<std::string>(
|
||||||
|
std::move(v.val.string));
|
||||||
break;
|
break;
|
||||||
case value_type::object:
|
case value_type::object:
|
||||||
setObject(v.val.object);
|
new(&val.object)std::shared_ptr<objects::Object>(
|
||||||
|
std::move(v.val.object));
|
||||||
break;
|
break;
|
||||||
case value_type::list:
|
case value_type::list:
|
||||||
setList(v.val.list);
|
new(&val.list)std::shared_ptr<objects::List>(
|
||||||
|
std::move(v.val.list));
|
||||||
break;
|
break;
|
||||||
case value_type::bytes:
|
case value_type::bytes:
|
||||||
setBytes(v.val.bytes);
|
new(&val.list)std::shared_ptr<objects::Bytes>(
|
||||||
|
std::move(v.val.bytes));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -211,13 +211,13 @@ namespace dv {
|
|||||||
return setString(v);
|
return setString(v);
|
||||||
}
|
}
|
||||||
inline value& operator=(std::shared_ptr<objects::List> ptr) {
|
inline value& operator=(std::shared_ptr<objects::List> ptr) {
|
||||||
return setList(ptr);
|
return setList(std::move(ptr));
|
||||||
}
|
}
|
||||||
inline value& operator=(std::shared_ptr<objects::Object> ptr) {
|
inline value& operator=(std::shared_ptr<objects::Object> ptr) {
|
||||||
return setObject(ptr);
|
return setObject(std::move(ptr));
|
||||||
}
|
}
|
||||||
inline value& operator=(std::shared_ptr<objects::Bytes> ptr) {
|
inline value& operator=(std::shared_ptr<objects::Bytes> ptr) {
|
||||||
return setBytes(ptr);
|
return setBytes(std::move(ptr));
|
||||||
}
|
}
|
||||||
value& operator=(const objects::Bytes& bytes);
|
value& operator=(const objects::Bytes& bytes);
|
||||||
|
|
||||||
@@ -251,10 +251,10 @@ namespace dv {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
value& add(value v);
|
void add(value v);
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
inline value& add(T v) {
|
inline void add(T v) {
|
||||||
return add(value(v));
|
return add(value(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,6 +358,10 @@ namespace dv::objects {
|
|||||||
return list.at(index);
|
return list.at(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void push(value v) {
|
||||||
|
list.push_back(std::move(v));
|
||||||
|
}
|
||||||
|
|
||||||
reference add(value v) {
|
reference add(value v) {
|
||||||
list.push_back(std::move(v));
|
list.push_back(std::move(v));
|
||||||
return list[list.size()-1];
|
return list[list.size()-1];
|
||||||
|
|||||||
Reference in New Issue
Block a user