diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-06-14 13:50:54 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-06-14 13:50:54 +0200 |
commit | 799acc9335f0dc3eebc747db8397aef0b4d930a9 (patch) | |
tree | 051baee0f938c2b088daa4a0fcb9120993abd95c /vespalib | |
parent | 7e2d577daf548e171a7d7bf16a6996f9b894c330 (diff) | |
parent | 1b2c6aa193483f9a7eaaf17a5a82037b93bd1749 (diff) |
Merge with master
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/tests/stllike/asciistream_test.cpp | 74 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btree.hpp | 8 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeinserter.cpp | 7 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeinserter.h | 28 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeinserter.hpp | 8 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeiterator.hpp | 32 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeremover.cpp | 4 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeremover.h | 24 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/btree/btreeremover.hpp | 11 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/data/databuffer.cpp | 1 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/data/slime/json_format.cpp | 6 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/locale/c.cpp | 18 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/locale/c.h | 4 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/stllike/asciistream.cpp | 7 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/util/benchmark_timer.h | 1 |
15 files changed, 128 insertions, 105 deletions
diff --git a/vespalib/src/tests/stllike/asciistream_test.cpp b/vespalib/src/tests/stllike/asciistream_test.cpp index b0f6d8cb455..b1ba70e6ae2 100644 --- a/vespalib/src/tests/stllike/asciistream_test.cpp +++ b/vespalib/src/tests/stllike/asciistream_test.cpp @@ -4,7 +4,9 @@ #include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/stllike/asciistream.h> #include <vespa/vespalib/util/exceptions.h> +#include <vespa/vespalib/locale/c.h> #include <iomanip> +#include <float.h> using namespace vespalib; @@ -26,6 +28,7 @@ public: void testMoveIsWellDefined(); void testIllegalNumbers(); void testDouble(); + void testFloat(); void testStateSaver(); }; @@ -83,10 +86,10 @@ AsciistreamTest::testIllegalNumbers() is << "777777777777"; EXPECT_EQUAL(24u, is.size()); uint64_t l(0); - EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "value is outside of range '777777777777777777777777'"); + EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "value '777777777777777777777777' is outside of range"); EXPECT_EQUAL(24u, is.size()); int64_t li(0); - EXPECT_EXCEPTION(is >> li, IllegalArgumentException, "value is outside of range '777777777777777777777777'"); + EXPECT_EXCEPTION(is >> li, IllegalArgumentException, "value '777777777777777777777777' is outside of range"); EXPECT_EQUAL(24u, is.size()); } { @@ -102,13 +105,13 @@ AsciistreamTest::testIllegalNumbers() asciistream is("7777777777777777777777777777777777777777"); EXPECT_EQUAL(40u, is.size()); float f(0); - EXPECT_EXCEPTION(is >> f, IllegalArgumentException, "float value is outside of range '7777777777777777777777777777777777777777'"); + EXPECT_EXCEPTION(is >> f, IllegalArgumentException, "float value '7777777777777777777777777777777777777777' is outside of range"); EXPECT_EQUAL(40u, is.size()); vespalib::string tmp = is.str(); is << "e" << tmp; EXPECT_EQUAL(81u, is.size()); double d(0); - EXPECT_EXCEPTION(is >> d, IllegalArgumentException, "double value is outside of range '7777777777777777777777777777777777777777e7777777777777777777777777777777777777777'"); + EXPECT_EXCEPTION(is >> d, IllegalArgumentException, "double value '7777777777777777777777777777777777777777e7777777777777777777777777777777777777777' is outside of range"); EXPECT_EQUAL(81u, is.size()); } { @@ -481,6 +484,68 @@ AsciistreamTest::testDouble() { VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0", automatic << forcedot, 1); VERIFY_DOUBLE_SERIALIZATION(0.0, "0.0", automatic << forcedot, 16); VERIFY_DOUBLE_SERIALIZATION(maxInteger, "9007199254740992.0", automatic << forcedot, 16); + + asciistream as; + as.clear(); + as << (3 * std::numeric_limits<double>::min()); + double dv = 0; + as >> dv; + EXPECT_TRUE(dv > 0); + + as.clear(); + as << (3 * std::numeric_limits<double>::denorm_min()); + dv = 0; + as >> dv; + EXPECT_TRUE(dv > 0); + + as.clear(); + as << "1.0e-325"; + dv = 42.0; + as >> dv; + EXPECT_EQUAL(dv, 0.0); + + as.clear(); + as << "1.0e666"; + dv = 42.0; + EXPECT_EXCEPTION(as >> dv, IllegalArgumentException, "double value '1.0e666' is outside of range."); + EXPECT_EQUAL(dv, 42.0); +} + +void +AsciistreamTest::testFloat() { + float f = 0; + asciistream as("-5.490412E-39"); + as >> f; + EXPECT_EQUAL(f, -5.490412E-39f); + + as.clear(); + as << "0.0001E-50"; + f = 42.0; + as >> f; + EXPECT_EQUAL(f, 0.0); + + as.clear(); + as << "123.4E50"; + f = 42.0; + EXPECT_EXCEPTION(as >> f, IllegalArgumentException, "float value '123.4E50' is outside of range."); + EXPECT_EQUAL(f, 42.0); + + errno = 0; + char *ep; + f = locale::c::strtof_au("-5.490412E-39", &ep); + EXPECT_EQUAL(f, -5.490412E-39f); + EXPECT_EQUAL(errno, 0); + EXPECT_EQUAL(*ep, 0); + + f = locale::c::strtof_au("0.0001E-50", &ep); + EXPECT_EQUAL(f, 0.0); + EXPECT_EQUAL(errno, 0); + EXPECT_EQUAL(*ep, 0); + + f = locale::c::strtof_au("123.4E50", &ep); + EXPECT_EQUAL(f, HUGE_VALF); + EXPECT_EQUAL(errno, ERANGE); + EXPECT_EQUAL(*ep, 0); } void @@ -547,6 +612,7 @@ AsciistreamTest::Main() testGetLine(); testIllegalNumbers(); testDouble(); + testFloat(); testStateSaver(); TEST_DONE(); } diff --git a/vespalib/src/vespa/vespalib/btree/btree.hpp b/vespalib/src/vespa/vespalib/btree/btree.hpp index 928d8d6cfcd..7bba2e936f3 100644 --- a/vespalib/src/vespa/vespalib/btree/btree.hpp +++ b/vespalib/src/vespa/vespalib/btree/btree.hpp @@ -4,8 +4,7 @@ #include "btree.h" -namespace search { -namespace btree { +namespace search::btree { template <typename KeyT, typename DataT, typename AggrT, typename CompareT, typename TraitsT, class AggrCalcT> @@ -24,7 +23,4 @@ BTree<KeyT, DataT, AggrT, CompareT, TraitsT, AggrCalcT>::~BTree() _alloc.clearHoldLists(); } - -} // namespace search::btree -} // namespace search - +} diff --git a/vespalib/src/vespa/vespalib/btree/btreeinserter.cpp b/vespalib/src/vespa/vespalib/btree/btreeinserter.cpp index f307c474f90..c00d2342eed 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeinserter.cpp +++ b/vespalib/src/vespa/vespalib/btree/btreeinserter.cpp @@ -6,16 +6,11 @@ #include "btreeinserter.hpp" #include "btreenode.hpp" -#include <vespa/log/log.h> -LOG_SETUP(".searchlib.btree.btreeinserter"); - namespace search::btree { template class BTreeInserter<uint32_t, uint32_t, NoAggregated>; template class BTreeInserter<uint32_t, BTreeNoLeafData, NoAggregated>; template class BTreeInserter<uint32_t, int32_t, MinMaxAggregated, - std::less<uint32_t>, - BTreeDefaultTraits, - MinMaxAggrCalc>; + std::less<uint32_t>, BTreeDefaultTraits, MinMaxAggrCalc>; } diff --git a/vespalib/src/vespa/vespalib/btree/btreeinserter.h b/vespalib/src/vespa/vespalib/btree/btreeinserter.h index a3fa2916a88..a66a7bc3f92 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeinserter.h +++ b/vespalib/src/vespa/vespalib/btree/btreeinserter.h @@ -10,11 +10,7 @@ #include "minmaxaggrcalc.h" #include "btreeiterator.h" -namespace search -{ - -namespace btree -{ +namespace search::btree { template <typename KeyT, typename DataT, @@ -32,12 +28,9 @@ public: TraitsT::INTERNAL_SLOTS, TraitsT::LEAF_SLOTS, AggrCalcT> Aggregator; - typedef BTreeIterator<KeyT, DataT, AggrT, - CompareT, TraitsT> Iterator; - typedef BTreeInternalNode<KeyT, AggrT, TraitsT::INTERNAL_SLOTS> - InternalNodeType; - typedef BTreeLeafNode<KeyT, DataT, AggrT, TraitsT::LEAF_SLOTS> - LeafNodeType; + typedef BTreeIterator<KeyT, DataT, AggrT, CompareT, TraitsT> Iterator; + typedef BTreeInternalNode<KeyT, AggrT, TraitsT::INTERNAL_SLOTS> InternalNodeType; + typedef BTreeLeafNode<KeyT, DataT, AggrT, TraitsT::LEAF_SLOTS> LeafNodeType; typedef KeyT KeyType; typedef DataT DataType; typedef typename InternalNodeType::RefPair InternalNodeTypeRefPair; @@ -49,19 +42,12 @@ private: public: static void - insert(BTreeNode::Ref &root, - Iterator &itr, - const KeyType &key, const DataType &data, - const AggrCalcT &aggrCalc); + insert(BTreeNode::Ref &root, Iterator &itr, const KeyType &key, const DataType &data, const AggrCalcT &aggrCalc); }; extern template class BTreeInserter<uint32_t, uint32_t, NoAggregated>; extern template class BTreeInserter<uint32_t, BTreeNoLeafData, NoAggregated>; extern template class BTreeInserter<uint32_t, int32_t, MinMaxAggregated, - std::less<uint32_t>, - BTreeDefaultTraits, - MinMaxAggrCalc>; - -} // namespace search::btree -} // namespace search + std::less<uint32_t>, BTreeDefaultTraits, MinMaxAggrCalc>; +} diff --git a/vespalib/src/vespa/vespalib/btree/btreeinserter.hpp b/vespalib/src/vespa/vespalib/btree/btreeinserter.hpp index d1da94c1b17..b24874088a2 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeinserter.hpp +++ b/vespalib/src/vespa/vespalib/btree/btreeinserter.hpp @@ -7,8 +7,7 @@ #include "btreeiterator.hpp" #include <vespa/vespalib/stllike/asciistream.h> -namespace search { -namespace btree { +namespace search::btree { namespace { @@ -178,7 +177,4 @@ insert(BTreeNode::Ref &root, } } - -} // namespace search::btree -} // namespace search - +} diff --git a/vespalib/src/vespa/vespalib/btree/btreeiterator.hpp b/vespalib/src/vespa/vespalib/btree/btreeiterator.hpp index b26f249c51b..13d41ef61f3 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeiterator.hpp +++ b/vespalib/src/vespa/vespalib/btree/btreeiterator.hpp @@ -9,8 +9,6 @@ namespace search::btree { -#define STRICT_BTREE_ITERATOR_SEEK - template <typename KeyT, typename DataT, typename AggrT, uint32_t INTERNAL_SLOTS, uint32_t LEAF_SLOTS, uint32_t PATH_SIZE> BTreeIteratorBase<KeyT, DataT, AggrT, INTERNAL_SLOTS, LEAF_SLOTS, PATH_SIZE>:: @@ -81,10 +79,7 @@ operator=(const BTreeIteratorBase &other) template <typename KeyT, typename DataT, typename AggrT, uint32_t INTERNAL_SLOTS, uint32_t LEAF_SLOTS, uint32_t PATH_SIZE> -BTreeIteratorBase<KeyT, DataT, AggrT, INTERNAL_SLOTS, LEAF_SLOTS, PATH_SIZE>:: -~BTreeIteratorBase() -{ -} +BTreeIteratorBase<KeyT, DataT, AggrT, INTERNAL_SLOTS, LEAF_SLOTS, PATH_SIZE>::~BTreeIteratorBase() = default; template <typename KeyT, typename DataT, typename AggrT, uint32_t INTERNAL_SLOTS, uint32_t LEAF_SLOTS, uint32_t PATH_SIZE> @@ -674,11 +669,7 @@ BTreeConstIterator<KeyT, DataT, AggrT, CompareT, TraitsT>:: binarySeek(const KeyType & key, CompareT comp) { const LeafNodeType *lnode = _leaf.getNode(); - uint32_t lidx = _leaf.getIdx(); -#ifdef STRICT_BTREE_ITERATOR_SEEK - assert(_leaf.valid() && comp(lnode->getKey(lidx), key)); -#endif - ++lidx; + uint32_t lidx = _leaf.getIdx() + 1; if (lidx < lnode->validSlots()) { if (!comp(lnode->getKey(lidx), key)) { _leaf.setIdx(lidx); @@ -723,11 +714,7 @@ BTreeConstIterator<KeyT, DataT, AggrT, CompareT, TraitsT>:: linearSeek(const KeyType & key, CompareT comp) { const LeafNodeType *lnode = _leaf.getNode(); - uint32_t lidx = _leaf.getIdx(); -#ifdef STRICT_BTREE_ITERATOR_SEEK - assert(_leaf.valid() && comp(lnode->getKey(lidx), key)); -#endif - ++lidx; + uint32_t lidx = _leaf.getIdx() + 1; if (lidx < lnode->validSlots()) { if (!comp(lnode->getKey(lidx), key)) { _leaf.setIdx(lidx); @@ -792,11 +779,7 @@ BTreeConstIterator<KeyT, DataT, AggrT, CompareT, TraitsT>:: binarySeekPast(const KeyType & key, CompareT comp) { const LeafNodeType *lnode = _leaf.getNode(); - uint32_t lidx = _leaf.getIdx(); -#ifdef STRICT_BTREE_ITERATOR_SEEK - assert(_leaf.valid() && !comp(key, lnode->getKey(lidx))); -#endif - ++lidx; + uint32_t lidx = _leaf.getIdx() + 1; if (lidx < lnode->validSlots()) { if (comp(key, lnode->getKey(lidx))) { _leaf.setIdx(lidx); @@ -841,11 +824,8 @@ BTreeConstIterator<KeyT, DataT, AggrT, CompareT, TraitsT>:: linearSeekPast(const KeyType & key, CompareT comp) { const LeafNodeType *lnode = _leaf.getNode(); - uint32_t lidx = _leaf.getIdx(); -#ifdef STRICT_BTREE_ITERATOR_SEEK - assert(_leaf.valid() && !comp(key, lnode->getKey(lidx))); -#endif - ++lidx; + uint32_t lidx = _leaf.getIdx() + 1; + if (lidx < lnode->validSlots()) { if (comp(key, lnode->getKey(lidx))) { _leaf.setIdx(lidx); diff --git a/vespalib/src/vespa/vespalib/btree/btreeremover.cpp b/vespalib/src/vespa/vespalib/btree/btreeremover.cpp index 2322eebf784..f5ada77fed6 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeremover.cpp +++ b/vespalib/src/vespa/vespalib/btree/btreeremover.cpp @@ -11,8 +11,6 @@ namespace search::btree { template class BTreeRemover<uint32_t, uint32_t, NoAggregated>; template class BTreeRemover<uint32_t, BTreeNoLeafData, NoAggregated>; template class BTreeRemover<uint32_t, int32_t, MinMaxAggregated, - std::less<uint32_t>, - BTreeDefaultTraits, - MinMaxAggrCalc>; + std::less<uint32_t>, BTreeDefaultTraits, MinMaxAggrCalc>; } diff --git a/vespalib/src/vespa/vespalib/btree/btreeremover.h b/vespalib/src/vespa/vespalib/btree/btreeremover.h index 87355aa4ce7..bbb825d6299 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeremover.h +++ b/vespalib/src/vespa/vespalib/btree/btreeremover.h @@ -10,11 +10,7 @@ #include "minmaxaggrcalc.h" #include "btreeiterator.h" -namespace search -{ - -namespace btree -{ +namespace search::btree { template <typename KeyT, typename DataT, @@ -82,23 +78,15 @@ public: typedef DataT DataType; typedef typename InternalNodeType::RefPair InternalNodeTypeRefPair; typedef typename LeafNodeType::RefPair LeafNodeTypeRefPair; - typedef BTreeIterator<KeyT, DataT, AggrT, - CompareT, TraitsT> Iterator; + typedef BTreeIterator<KeyT, DataT, AggrT, CompareT, TraitsT> Iterator; static void - remove(BTreeNode::Ref &root, - Iterator &itr, - const AggrCalcT &aggrCalc); + remove(BTreeNode::Ref &root, Iterator &itr, const AggrCalcT &aggrCalc); }; extern template class BTreeRemover<uint32_t, uint32_t, NoAggregated>; extern template class BTreeRemover<uint32_t, BTreeNoLeafData, NoAggregated>; -extern template class BTreeRemover<uint32_t, int32_t, - MinMaxAggregated, - std::less<uint32_t>, - BTreeDefaultTraits, - MinMaxAggrCalc>; - -} // namespace search::btree -} // namespace search +extern template class BTreeRemover<uint32_t, int32_t, MinMaxAggregated, + std::less<uint32_t>, BTreeDefaultTraits, MinMaxAggrCalc>; +} diff --git a/vespalib/src/vespa/vespalib/btree/btreeremover.hpp b/vespalib/src/vespa/vespalib/btree/btreeremover.hpp index c304ea13016..2281fd99f6d 100644 --- a/vespalib/src/vespa/vespalib/btree/btreeremover.hpp +++ b/vespalib/src/vespa/vespalib/btree/btreeremover.hpp @@ -6,11 +6,7 @@ #include "btreerootbase.hpp" #include <vespa/vespalib/stllike/asciistream.h> -namespace search -{ - -namespace btree -{ +namespace search::btree { template <typename KeyT, typename DataT, typename AggrT, size_t INTERNAL_SLOTS, size_t LEAF_SLOTS, class AggrCalcT> @@ -179,7 +175,4 @@ remove(BTreeNode::Ref &root, ++itr; } - -} // namespace search::btree -} // namespace search - +} diff --git a/vespalib/src/vespa/vespalib/data/databuffer.cpp b/vespalib/src/vespa/vespalib/data/databuffer.cpp index 9b04724b601..758922aec6d 100644 --- a/vespalib/src/vespa/vespalib/data/databuffer.cpp +++ b/vespalib/src/vespa/vespalib/data/databuffer.cpp @@ -1,5 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "databuffer.h" +#include <algorithm> namespace vespalib { diff --git a/vespalib/src/vespa/vespalib/data/slime/json_format.cpp b/vespalib/src/vespa/vespalib/data/slime/json_format.cpp index 637be8db999..d2f953b38c8 100644 --- a/vespalib/src/vespa/vespalib/data/slime/json_format.cpp +++ b/vespalib/src/vespa/vespalib/data/slime/json_format.cpp @@ -434,7 +434,7 @@ JsonDecoder::decodeNumber(Inserter &inserter) default: char *endp; int errorCode = insertNumber(inserter, isLong, value, &endp); - if (errorCode != 0) { + if ((endp == value.c_str()) || (errorCode != 0)) { std::stringstream ss; ss << "error inserting number " << value << ". error code: " << errorCode << ". endp - value: " << (endp - value.c_str()); in.fail(ss.str()); @@ -450,11 +450,11 @@ insertNumber(Inserter &inserter, bool isLong, const vespalib::string & value, ch int errorCode = 0; errno = 0; if (isLong) { - long val = strtol(value.c_str(), endp, 0); + long val = strtol(value.c_str(), endp, 10); errorCode = errno; inserter.insertLong(val); } else { - double val = locale::c::strtod(value.c_str(), endp); + double val = locale::c::strtod_au(value.c_str(), endp); errorCode = errno; inserter.insertDouble(val); } diff --git a/vespalib/src/vespa/vespalib/locale/c.cpp b/vespalib/src/vespa/vespalib/locale/c.cpp index af228ce55c3..74e7485f158 100644 --- a/vespalib/src/vespa/vespalib/locale/c.cpp +++ b/vespalib/src/vespa/vespalib/locale/c.cpp @@ -3,6 +3,7 @@ #include "c.h" #include "locale.h" #include <cstdlib> +#include <errno.h> namespace vespalib::locale::c { @@ -20,5 +21,22 @@ float strtof(const char *startp, char **endp) { return strtof_l(startp, endp, _G_C_Locale.get()); } +double strtod_au(const char *startp, char **endp) { + int was = errno; + double v = strtod_l(startp, endp, _G_C_Locale.get()); + if (errno == ERANGE) { + if ((-1.0 < v) && (v < 1.0)) errno = was; + } + return v; } +float strtof_au(const char *startp, char **endp) { + int was = errno; + float v = strtof_l(startp, endp, _G_C_Locale.get()); + if (errno == ERANGE) { + if ((-1.0 < v) && (v < 1.0)) errno = was; + } + return v; +} + +} diff --git a/vespalib/src/vespa/vespalib/locale/c.h b/vespalib/src/vespa/vespalib/locale/c.h index ff7d0c18639..08cf6185e7f 100644 --- a/vespalib/src/vespa/vespalib/locale/c.h +++ b/vespalib/src/vespa/vespalib/locale/c.h @@ -7,6 +7,10 @@ namespace vespalib::locale::c { double strtod(const char *nptr, char **endptr); float strtof(const char *nptr, char **endptr); +// allow underflow variants +double strtod_au(const char *nptr, char **endptr); +float strtof_au(const char *nptr, char **endptr); + inline double atof(const char *nptr) { return strtod(nptr, nullptr); } } diff --git a/vespalib/src/vespa/vespalib/stllike/asciistream.cpp b/vespalib/src/vespa/vespalib/stllike/asciistream.cpp index 30a963c374c..7d585cf1cf6 100644 --- a/vespalib/src/vespa/vespalib/stllike/asciistream.cpp +++ b/vespalib/src/vespa/vespalib/stllike/asciistream.cpp @@ -10,6 +10,7 @@ #include <limits> #include <stdexcept> #include <cassert> +#include <math.h> #include <vespa/log/log.h> LOG_SETUP(".vespalib.stllike.asciistream"); @@ -154,7 +155,7 @@ void throwInputError(int e, const char * t, const char * buf) if (e == 0) { throw IllegalArgumentException("Failed decoding a " + string(t) + " from '" + string(buf) + "'.", VESPA_STRLOC); } else if (errno == ERANGE) { - throw IllegalArgumentException(string(t) + " value is outside of range '" + string(buf) + "'.", VESPA_STRLOC); + throw IllegalArgumentException(string(t) + " value '" + string(buf) + "' is outside of range.", VESPA_STRLOC); } else if (errno == EINVAL) { throw IllegalArgumentException("Illegal " + string(t) + " value '" + string(buf) + "'.", VESPA_STRLOC); } else { @@ -171,7 +172,7 @@ int getValue(double & val, const char *buf) { char *ebuf; errno = 0; - val = locale::c::strtod(buf, &ebuf); + val = locale::c::strtod_au(buf, &ebuf); if ((errno != 0) || (buf == ebuf)) { throwInputError(errno, "double", buf); } @@ -182,7 +183,7 @@ int getValue(float & val, const char *buf) { char *ebuf; errno = 0; - val = locale::c::strtof(buf, &ebuf); + val = locale::c::strtof_au(buf, &ebuf); if ((errno != 0) || (buf == ebuf)) { throwInputError(errno, "float", buf); } diff --git a/vespalib/src/vespa/vespalib/util/benchmark_timer.h b/vespalib/src/vespa/vespalib/util/benchmark_timer.h index 8d4147907fc..8e0821d6127 100644 --- a/vespalib/src/vespa/vespalib/util/benchmark_timer.h +++ b/vespalib/src/vespa/vespalib/util/benchmark_timer.h @@ -3,6 +3,7 @@ #include <chrono> #include <functional> +#include <algorithm> namespace vespalib { |