diff --git a/toml/parser.hpp b/toml/parser.hpp index 4bd4b60..26b13b1 100644 --- a/toml/parser.hpp +++ b/toml/parser.hpp @@ -1058,7 +1058,7 @@ bool is_valid_forward_table_definition(const value& fwd, { // table keys always contains all the nodes from the root. const auto& tks = tabkeys.unwrap().first; - if(std::distance(key_first, key_last) == tks.size() && + if(std::size_t(std::distance(key_first, key_last)) == tks.size() && std::equal(tks.begin(), tks.end(), key_first)) { // the keys are equivalent. it is not allowed. @@ -1079,7 +1079,7 @@ bool is_valid_forward_table_definition(const value& fwd, // a dotted key starts from the node representing a table in which the // dotted key belongs to. const auto& dks = dotkeys.unwrap().first; - if(std::distance(key_curr, key_last) == dks.size() && + if(std::size_t(std::distance(key_curr, key_last)) == dks.size() && std::equal(dks.begin(), dks.end(), key_curr)) { // the keys are equivalent. it is not allowed. diff --git a/toml/serializer.hpp b/toml/serializer.hpp index cb150bb..c25f8b2 100644 --- a/toml/serializer.hpp +++ b/toml/serializer.hpp @@ -5,6 +5,7 @@ #include "value.hpp" #include "lexer.hpp" #include +#include namespace toml { @@ -30,13 +31,12 @@ struct serializer } std::string operator()(const toml::floating f) const { - std::string token = [=] { - // every float value needs decimal point (or exponent). - std::ostringstream oss; - oss << std::setprecision(float_prec_) << std::showpoint << f; - return oss.str(); - }(); + const auto fmt = "%.*g"; + const auto bsz = std::snprintf(nullptr, 0, fmt, this->float_prec_, f); + std::vector buf(bsz + 1, '\0'); // +1 for null character(\0) + std::snprintf(buf.data(), buf.size(), fmt, this->float_prec_, f); + std::string token(buf.begin(), buf.end()); if(token.back() == '.') // 1. => 1.0 { token += '0';