diff options
author | Håvard Pettersen <havardpe@oath.com> | 2020-01-03 15:31:12 +0000 |
---|---|---|
committer | Håvard Pettersen <havardpe@oath.com> | 2020-01-03 15:31:12 +0000 |
commit | 95a11020a168f9f068ac730f40eec0370571ca5a (patch) | |
tree | e23d798b336b025ae6cc93450ada77e98e21c4dc /vespalib | |
parent | dbe3a67718104c4150ae770294c23d8a41f0a16c (diff) |
introduce overload class
and use it with std::visit when inspecting std::alternative
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | vespalib/src/tests/overload/CMakeLists.txt | 9 | ||||
-rw-r--r-- | vespalib/src/tests/overload/overload_test.cpp | 19 | ||||
-rw-r--r-- | vespalib/src/vespa/vespalib/util/overload.h | 15 |
4 files changed, 44 insertions, 0 deletions
diff --git a/vespalib/CMakeLists.txt b/vespalib/CMakeLists.txt index 14c14fe85ca..a76b8848b47 100644 --- a/vespalib/CMakeLists.txt +++ b/vespalib/CMakeLists.txt @@ -78,6 +78,7 @@ vespa_define_module( src/tests/net/tls/transport_options src/tests/objects/nbostream src/tests/optimized + src/tests/overload src/tests/portal src/tests/portal/handle_manager src/tests/portal/http_request diff --git a/vespalib/src/tests/overload/CMakeLists.txt b/vespalib/src/tests/overload/CMakeLists.txt new file mode 100644 index 00000000000..67aa6230225 --- /dev/null +++ b/vespalib/src/tests/overload/CMakeLists.txt @@ -0,0 +1,9 @@ +# Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(vespalib_overload_test_app TEST + SOURCES + overload_test.cpp + DEPENDS + vespalib + gtest +) +vespa_add_test(NAME vespalib_overload_test_app COMMAND vespalib_overload_test_app) diff --git a/vespalib/src/tests/overload/overload_test.cpp b/vespalib/src/tests/overload/overload_test.cpp new file mode 100644 index 00000000000..ceae29ac02f --- /dev/null +++ b/vespalib/src/tests/overload/overload_test.cpp @@ -0,0 +1,19 @@ +// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/vespalib/util/overload.h> +#include <vespa/vespalib/gtest/gtest.h> +#include <variant> +#include <string> + +using namespace vespalib; + +TEST(OverloadTest, visit_with_overload_works) { + std::variant<std::string,int> a = 10; + std::variant<std::string,int> b = "foo"; + std::visit(overload{[](int v){ EXPECT_EQ(v,10); }, + [](const std::string &){ FAIL() << "invalid visit"; }}, a); + std::visit(overload{[](int){ FAIL() << "invalid visit"; }, + [](const std::string &v){ EXPECT_EQ(v, "foo"); }}, b); +} + +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/vespa/vespalib/util/overload.h b/vespalib/src/vespa/vespalib/util/overload.h new file mode 100644 index 00000000000..d5af9dee2d3 --- /dev/null +++ b/vespalib/src/vespa/vespalib/util/overload.h @@ -0,0 +1,15 @@ +// Copyright 2020 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +namespace vespalib { + +/** + * Simple overload lambda composition class. To be replaced by + * standard overload functionality when available. (C++20) + **/ + +template<class... Ts> struct overload : Ts... { using Ts::operator()...; }; +template<class... Ts> overload(Ts...) -> overload<Ts...>; + +} |