fix: conversion between different basic_value s

This commit is contained in:
ToruNiina
2019-06-20 14:35:38 +09:00
parent f178379c07
commit 5e5a757208

View File

@@ -406,7 +406,7 @@ class basic_value
basic_value& operator=(const basic_value<C, T, A>& v) basic_value& operator=(const basic_value<C, T, A>& v)
{ {
this->region_info_ = v.region_info_; this->region_info_ = v.region_info_;
this->comments_ = v.comments(); this->comments_ = comment_type(v.comments());
this->type_ = v.type(); this->type_ = v.type();
switch(v.type()) switch(v.type())
{ {
@@ -806,26 +806,32 @@ class basic_value
detail::negation<std::is_same<T, array_type>>, detail::negation<std::is_same<T, array_type>>,
detail::is_container<T> detail::is_container<T>
>::value, std::nullptr_t>::type = nullptr> >::value, std::nullptr_t>::type = nullptr>
basic_value(T&& list) basic_value(const T& list)
: type_(value_t::array), : type_(value_t::array),
region_info_(std::make_shared<region_base>(region_base{})) region_info_(std::make_shared<region_base>(region_base{}))
{ {
array_type ary; ary.reserve(list.size()); static_assert(std::is_convertible<typename T::value_type, value_type>::value,
for(const auto& elem : list) {ary.emplace_back(elem);} "elements of a container should be convertible to toml::value");
array_type ary(list.size());
std::copy(list.begin(), list.end(), ary.begin());
assigner(this->array_, std::move(ary)); assigner(this->array_, std::move(ary));
} }
template<typename T, typename std::enable_if<detail::conjunction< template<typename T, typename std::enable_if<detail::conjunction<
detail::negation<std::is_same<T, array_type>>, detail::negation<std::is_same<T, array_type>>,
detail::is_container<T> detail::is_container<T>
>::value, std::nullptr_t>::type = nullptr> >::value, std::nullptr_t>::type = nullptr>
basic_value& operator=(T&& list) basic_value& operator=(const T& list)
{ {
static_assert(std::is_convertible<typename T::value_type, value_type>::value,
"elements of a container should be convertible to toml::value");
this->cleanup(); this->cleanup();
this->type_ = value_t::array; this->type_ = value_t::array;
this->region_info_ = std::make_shared<region_base>(region_base{}); this->region_info_ = std::make_shared<region_base>(region_base{});
array_type ary; ary.reserve(list.size()); array_type ary(list.size());
for(const auto& elem : list) {ary.emplace_back(elem);} std::copy(list.begin(), list.end(), ary.begin());
assigner(this->array_, std::move(ary)); assigner(this->array_, std::move(ary));
return *this; return *this;
} }
@@ -1375,6 +1381,7 @@ operator==(const basic_value<C, T, A>& lhs, const basic_value<C, T, A>& rhs)
{ {
if(lhs.type() != rhs.type()) {return false;} if(lhs.type() != rhs.type()) {return false;}
if(lhs.comments() != rhs.comments()) {return false;} if(lhs.comments() != rhs.comments()) {return false;}
switch(lhs.type()) switch(lhs.type())
{ {
case value_t::boolean : case value_t::boolean :