optimize move constructor

This commit is contained in:
MihailRis
2024-09-17 01:17:27 +03:00
parent 27c8307562
commit a886404940
2 changed files with 44 additions and 34 deletions
+10 -4
View File
@@ -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
View File
@@ -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];