Merge pull request #43 from ToruNiina/hotfix

fix: incorrect move in constructor and return type deducing in toml::visit
This commit is contained in:
Toru Niina
2019-03-18 14:08:23 +09:00
committed by GitHub
2 changed files with 17 additions and 12 deletions

View File

@@ -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
{ {

View File

@@ -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())