summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-06-14 13:50:54 +0200
committerJon Bratseth <bratseth@verizonmedia.com>2019-06-14 13:50:54 +0200
commit799acc9335f0dc3eebc747db8397aef0b4d930a9 (patch)
tree051baee0f938c2b088daa4a0fcb9120993abd95c /vespalib
parent7e2d577daf548e171a7d7bf16a6996f9b894c330 (diff)
parent1b2c6aa193483f9a7eaaf17a5a82037b93bd1749 (diff)
Merge with master
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/tests/stllike/asciistream_test.cpp74
-rw-r--r--vespalib/src/vespa/vespalib/btree/btree.hpp8
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeinserter.cpp7
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeinserter.h28
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeinserter.hpp8
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeiterator.hpp32
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeremover.cpp4
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeremover.h24
-rw-r--r--vespalib/src/vespa/vespalib/btree/btreeremover.hpp11
-rw-r--r--vespalib/src/vespa/vespalib/data/databuffer.cpp1
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/json_format.cpp6
-rw-r--r--vespalib/src/vespa/vespalib/locale/c.cpp18
-rw-r--r--vespalib/src/vespa/vespalib/locale/c.h4
-rw-r--r--vespalib/src/vespa/vespalib/stllike/asciistream.cpp7
-rw-r--r--vespalib/src/vespa/vespalib/util/benchmark_timer.h1
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 {