mirror of
https://github.com/ToruNiina/toml11.git
synced 2025-09-18 10:28:09 +08:00
Merge pull request #43 from ToruNiina/hotfix
fix: incorrect move in constructor and return type deducing in toml::visit
This commit is contained in:
@@ -15,7 +15,7 @@ namespace toml
|
|||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
|
||||||
// helper function to avoid std::string(0, 'c')
|
// helper function to avoid std::string(0, 'c') or std::string(iter, iter)
|
||||||
template<typename Iterator>
|
template<typename Iterator>
|
||||||
std::string make_string(Iterator first, Iterator last)
|
std::string make_string(Iterator first, Iterator last)
|
||||||
{
|
{
|
||||||
@@ -28,9 +28,7 @@ inline std::string make_string(std::size_t len, char c)
|
|||||||
return std::string(len, c);
|
return std::string(len, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
// region in a container, normally in a file content.
|
// region_base is a base class of location and region that are defined below.
|
||||||
// shared_ptr points the resource that the iter points.
|
|
||||||
// combinators returns this.
|
|
||||||
// it will be used to generate better error messages.
|
// it will be used to generate better error messages.
|
||||||
struct region_base
|
struct region_base
|
||||||
{
|
{
|
||||||
@@ -48,16 +46,19 @@ struct region_base
|
|||||||
virtual std::string line() const {return std::string("unknown line");}
|
virtual std::string line() const {return std::string("unknown line");}
|
||||||
virtual std::string line_num() const {return std::string("?");}
|
virtual std::string line_num() const {return std::string("?");}
|
||||||
|
|
||||||
virtual std::size_t before() const noexcept {return 0;}
|
// length of the region
|
||||||
virtual std::size_t size() const noexcept {return 0;}
|
virtual std::size_t size() const noexcept {return 0;}
|
||||||
|
// number of characters in the line before the region
|
||||||
|
virtual std::size_t before() const noexcept {return 0;}
|
||||||
|
// number of characters in the line after the region
|
||||||
virtual std::size_t after() const noexcept {return 0;}
|
virtual std::size_t after() const noexcept {return 0;}
|
||||||
};
|
};
|
||||||
|
|
||||||
// location in a container, normally in a file content.
|
// location represents a position in a container, which contains a file content.
|
||||||
// shared_ptr points the resource that the iter points.
|
|
||||||
// it can be used not only for resource handling, but also error message.
|
|
||||||
//
|
|
||||||
// it can be considered as a region that contains only one character.
|
// it can be considered as a region that contains only one character.
|
||||||
|
//
|
||||||
|
// it contains pointer to the file content and iterator that points the current
|
||||||
|
// location.
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
struct location final : public region_base
|
struct location final : public region_base
|
||||||
{
|
{
|
||||||
@@ -131,6 +132,10 @@ struct location final : public region_base
|
|||||||
const_iterator iter_;
|
const_iterator iter_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// region represents a range in a container, which contains a file content.
|
||||||
|
//
|
||||||
|
// it contains pointer to the file content and iterator that points the first
|
||||||
|
// and last location.
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
struct region final : public region_base
|
struct region final : public region_base
|
||||||
{
|
{
|
||||||
|
@@ -474,7 +474,7 @@ class value
|
|||||||
region_info_(std::make_shared<region_base>(region_base{}))
|
region_info_(std::make_shared<region_base>(region_base{}))
|
||||||
{
|
{
|
||||||
array ary; ary.reserve(list.size());
|
array ary; ary.reserve(list.size());
|
||||||
for(auto& elem : list) {ary.emplace_back(std::move(elem));}
|
for(const auto& elem : list) {ary.emplace_back(elem);}
|
||||||
assigner(this->array_, std::move(ary));
|
assigner(this->array_, std::move(ary));
|
||||||
}
|
}
|
||||||
template<typename T, typename std::enable_if<detail::is_container<T>::value,
|
template<typename T, typename std::enable_if<detail::is_container<T>::value,
|
||||||
@@ -486,7 +486,7 @@ class value
|
|||||||
this->region_info_ = std::make_shared<region_base>(region_base{});
|
this->region_info_ = std::make_shared<region_base>(region_base{});
|
||||||
|
|
||||||
array ary; ary.reserve(list.size());
|
array ary; ary.reserve(list.size());
|
||||||
for(auto& elem : list) {ary.emplace_back(std::move(elem));}
|
for(const auto& elem : list) {ary.emplace_back(elem);}
|
||||||
assigner(this->array_, std::move(ary));
|
assigner(this->array_, std::move(ary));
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@@ -930,7 +930,7 @@ visit(Visitor&& visitor, toml::value& v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename Visitor>
|
template<typename Visitor>
|
||||||
detail::return_type_of_t<Visitor, toml::boolean&>
|
detail::return_type_of_t<Visitor, toml::boolean&&>
|
||||||
visit(Visitor&& visitor, toml::value&& v)
|
visit(Visitor&& visitor, toml::value&& v)
|
||||||
{
|
{
|
||||||
switch(v.type())
|
switch(v.type())
|
||||||
|
Reference in New Issue
Block a user