mirror of
https://github.com/ToruNiina/toml11.git
synced 2025-09-18 02:08:09 +08:00
split storage from value
also, quit inheritance in storage class
This commit is contained in:
42
toml/storage.hpp
Normal file
42
toml/storage.hpp
Normal 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
|
@@ -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
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user