summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2023-11-04 11:53:31 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2023-11-04 14:47:36 +0000
commit84c7d221a5dc11cc69d04bb298f3738b06f1190b (patch)
treea2e2733a617af7e471be8302ca7cf81473cb6a97 /searchlib
parent4cb30d8957593a29d62f787e81d0ea6734a21974 (diff)
Add and test correct implementation for undefined const char values
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/attribute/attribute_header/attribute_header_test.cpp21
-rw-r--r--searchlib/src/vespa/searchcommon/common/undefinedvalues.h19
2 files changed, 30 insertions, 10 deletions
diff --git a/searchlib/src/tests/attribute/attribute_header/attribute_header_test.cpp b/searchlib/src/tests/attribute/attribute_header/attribute_header_test.cpp
index 0ee82e2128a..bfd124ae75c 100644
--- a/searchlib/src/tests/attribute/attribute_header/attribute_header_test.cpp
+++ b/searchlib/src/tests/attribute/attribute_header/attribute_header_test.cpp
@@ -2,6 +2,7 @@
#include <vespa/eval/eval/value_type.h>
#include <vespa/searchcommon/attribute/config.h>
+#include <vespa/searchcommon/common/undefinedvalues.h>
#include <vespa/searchlib/attribute/attribute_header.h>
#include <vespa/vespalib/data/fileheader.h>
#include <vespa/vespalib/gtest/gtest.h>
@@ -78,5 +79,25 @@ TEST(AttributeHeaderTest, can_be_added_to_and_extracted_from_generic_header)
verify_roundtrip_serialization(HnswIPO());
}
+TEST(UndefinedValues, isUndefined) {
+ EXPECT_TRUE(isUndefined(""));
+ EXPECT_TRUE(isUndefined(nullptr));
+ EXPECT_FALSE(isUndefined(" "));
+
+ EXPECT_FALSE(isUndefined<int8_t>(0));
+ EXPECT_FALSE(isUndefined<int16_t>(0));
+ EXPECT_FALSE(isUndefined<int32_t>(0));
+ EXPECT_FALSE(isUndefined<int64_t>(0));
+ EXPECT_FALSE(isUndefined<float>(0));
+ EXPECT_FALSE(isUndefined<double>(0));
+
+ EXPECT_TRUE(isUndefined<int8_t>(std::numeric_limits<int8_t>::min()));
+ EXPECT_TRUE(isUndefined<int16_t>(std::numeric_limits<int16_t>::min()));
+ EXPECT_TRUE(isUndefined<int32_t>(std::numeric_limits<int32_t>::min()));
+ EXPECT_TRUE(isUndefined<int64_t>(std::numeric_limits<int64_t>::min()));
+ EXPECT_TRUE(isUndefined<float>(std::numeric_limits<float>::quiet_NaN()));
+ EXPECT_TRUE(isUndefined<double>(std::numeric_limits<double>::quiet_NaN()));
+}
+
GTEST_MAIN_RUN_ALL_TESTS()
diff --git a/searchlib/src/vespa/searchcommon/common/undefinedvalues.h b/searchlib/src/vespa/searchcommon/common/undefinedvalues.h
index 51c85a10436..ece5378dcc9 100644
--- a/searchlib/src/vespa/searchcommon/common/undefinedvalues.h
+++ b/searchlib/src/vespa/searchcommon/common/undefinedvalues.h
@@ -31,43 +31,42 @@ inline constexpr const char* getUndefined<const char*>() {
// for all signed integers
template <typename T>
-bool isUndefined(const T & value) {
+bool isUndefined(T value) {
return value == getUndefined<T>();
}
template <>
-inline bool isUndefined<uint8_t>(const uint8_t &) {
+inline bool isUndefined<uint8_t>(uint8_t) {
return false;
}
template <>
-inline bool isUndefined<uint16_t>(const uint16_t &) {
+inline bool isUndefined<uint16_t>(uint16_t) {
return false;
}
template <>
-inline bool isUndefined<uint32_t>(const uint32_t &) {
+inline bool isUndefined<uint32_t>(uint32_t) {
return false;
}
template <>
-inline bool isUndefined<uint64_t>(const uint64_t &) {
+inline bool isUndefined<uint64_t>(uint64_t) {
return false;
}
template <>
-inline bool isUndefined<float>(const float & value) {
+inline bool isUndefined<float>(float value) {
return std::isnan(value);
}
template <>
-inline bool isUndefined<double>(const double & value) {
+inline bool isUndefined<double>(double value) {
return std::isnan(value);
}
-template <>
-inline bool isUndefined<vespalib::string>(const vespalib::string & value) {
- return value.empty();
+inline bool isUndefined(const char * value) {
+ return (value == nullptr) || (value[0] == '\0');
}
}