From 8657c45d041a85fdbcd06a1c6987cce202572352 Mon Sep 17 00:00:00 2001 From: ToruNiina Date: Sun, 16 Apr 2017 16:37:45 +0900 Subject: [PATCH] add copy/move ctor/op= --- toml.hpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/toml.hpp b/toml.hpp index e906d58..2e30514 100644 --- a/toml.hpp +++ b/toml.hpp @@ -203,6 +203,8 @@ class value { public: + value() : type_(value_t::Unknown){} + template::is_toml_value, std::nullptr_t>::type = nullptr> value(T&& v) @@ -216,7 +218,82 @@ class value switch_clean(this->type_); } - type t() const {return type_;} + value(const value& v) + : type_(v.type()) + { + switch(v.type()) + { + case value_t::Boolean : boolean_ = v.cast(); break; + case value_t::Integer : integer_ = v.cast(); break; + case value_t::Float : float_ = v.cast(); break; + case value_t::String : string_ = v.cast(); break; + case value_t::Datetime: datetime_ = v.cast(); break; + case value_t::Array : array_ = v.cast(); break; + case value_t::Table : table_ = v.cast(); break; + case value_t::Unknown : break; + default: break; + } + } + + value(value&& v) + : type_(std::move(v.type_)) + { + switch(v.type()) + { + case value_t::Boolean : boolean_ = std::move(v.cast()); break; + case value_t::Integer : integer_ = std::move(v.cast()); break; + case value_t::Float : float_ = std::move(v.cast()); break; + case value_t::String : string_ = std::move(v.cast()); break; + case value_t::Datetime: datetime_ = std::move(v.cast()); break; + case value_t::Array : array_ = std::move(v.cast()); break; + case value_t::Table : table_ = std::move(v.cast()); break; + case value_t::Unknown : break; + default: break; + } + } + + value& operator=(const value& v) + { + if(this->type_ != value_t::Unknown) this->switch_clean(this->type_); + + this->type_ = v.type(); + switch(v.type()) + { + case value_t::Boolean : boolean_ = v.cast(); break; + case value_t::Integer : integer_ = v.cast(); break; + case value_t::Float : float_ = v.cast(); break; + case value_t::String : string_ = v.cast(); break; + case value_t::Datetime: datetime_ = v.cast(); break; + case value_t::Array : array_ = v.cast(); break; + case value_t::Table : table_ = v.cast(); break; + case value_t::Unknown : break; + default: break; + } + return *this; + } + + value& operator=(value&& v) + { + if(this->type_ != value_t::Unknown) this->switch_clean(this->type_); + + this->type_ = std::move(v.type_); + switch(v.type()) + { + case value_t::Boolean : boolean_ = std::move(v.cast()); break; + case value_t::Integer : integer_ = std::move(v.cast()); break; + case value_t::Float : float_ = std::move(v.cast()); break; + case value_t::String : string_ = std::move(v.cast()); break; + case value_t::Datetime: datetime_ = std::move(v.cast()); break; + case value_t::Array : array_ = std::move(v.cast()); break; + case value_t::Table : table_ = std::move(v.cast()); break; + case value_t::Unknown : break; + default: break; + } + return *this; + } + + + value_t type() const {return type_;} template typename detail::toml_default_type::type const& cast() const