diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-04 11:53:31 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-04 14:47:36 +0000 |
commit | 84c7d221a5dc11cc69d04bb298f3738b06f1190b (patch) | |
tree | a2e2733a617af7e471be8302ca7cf81473cb6a97 /searchlib | |
parent | 4cb30d8957593a29d62f787e81d0ea6734a21974 (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.cpp | 21 | ||||
-rw-r--r-- | searchlib/src/vespa/searchcommon/common/undefinedvalues.h | 19 |
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'); } } |