split storage from value

also, quit inheritance in storage class
This commit is contained in:
ToruNiina
2018-12-09 16:41:45 +09:00
parent d1d5ca6bf8
commit 2696e4e6ba
2 changed files with 44 additions and 32 deletions

42
toml/storage.hpp Normal file
View File

@@ -0,0 +1,42 @@
#ifndef TOML11_STORAGE_HPP
#define TOML11_STORAGE_HPP
#include "utility.hpp"
namespace toml
{
namespace detail
{
// this contains pointer and deep-copy the content if copied.
// to avoid recursive pointer.
template<typename T>
struct storage
{
using value_type = T;
storage(value_type const& v): ptr(toml::make_unique<T>(v)) {}
storage(value_type&& v): ptr(toml::make_unique<T>(std::move(v))) {}
~storage() = default;
storage(const storage& rhs): ptr(toml::make_unique<T>(*rhs.ptr)) {}
storage& operator=(const storage& rhs)
{
this->ptr = toml::make_unique<T>(*rhs.ptr);
return *this;
}
storage(storage&&) = default;
storage& operator=(storage&&) = default;
bool is_ok() const noexcept {return static_cast<bool>(ptr);}
value_type& value() & noexcept {return *ptr;}
value_type const& value() const& noexcept {return *ptr;}
value_type&& value() && noexcept {return std::move(*ptr);}
private:
std::unique_ptr<value_type> ptr;
};
} // detail
} // toml
#endif// TOML11_STORAGE_HPP

View File

@@ -3,6 +3,8 @@
#include "traits.hpp" #include "traits.hpp"
#include "utility.hpp" #include "utility.hpp"
#include "exception.hpp" #include "exception.hpp"
#include "storage.hpp"
#include "region.hpp"
#include "types.hpp" #include "types.hpp"
#include <vector> #include <vector>
#include <tuple> #include <tuple>
@@ -13,38 +15,6 @@
namespace toml namespace toml
{ {
namespace detail
{
struct storage_base
{
storage_base(): type(toml::value_t::Empty){}
storage_base(toml::value_t t): type(t){}
virtual ~storage_base() = default;
toml::value_t type;
};
template<typename T>
struct storage : public storage_base
{
static_assert(std::is_same<T, toml::Array>::value ||
std::is_same<T, toml::Table>::value,
"toml::detail::storage is for toml::Array or toml::Table!");
typedef T value_type;
storage() = default;
~storage() noexcept override = default;
storage(storage const&) = default;
storage(storage&&) = default;
storage& operator=(storage const&) = default;
storage& operator=(storage&&) = default;
storage(value_type const& v) : value(v){}
storage(value_type&& v) : value(std::move(v)){}
value_type value;
};
} // detail
template<typename T> template<typename T>
struct value_traits struct value_traits
{ {