// Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 #include #include #include #include #include #include "opentelemetry/common/attribute_value.h" #include "opentelemetry/common/key_value_iterable.h" #include "opentelemetry/common/key_value_iterable_view.h" #include "opentelemetry/nostd/function_ref.h" #include "opentelemetry/nostd/string_view.h" #include "opentelemetry/nostd/type_traits.h" using namespace opentelemetry; static int TakeKeyValues(const common::KeyValueIterable &iterable) { std::map result; int count = 0; iterable.ForEachKeyValue( [&](nostd::string_view /* key */, common::AttributeValue /* value */) noexcept { ++count; return true; }); return count; } template ::value> * = nullptr> static int TakeKeyValues(const T &iterable) { return TakeKeyValues(common::KeyValueIterableView{iterable}); } TEST(KeyValueIterableViewTest, is_key_value_iterable) { using M1 = std::map; EXPECT_TRUE(bool{common::detail::is_key_value_iterable::value}); using M2 = std::map; EXPECT_TRUE(bool{common::detail::is_key_value_iterable::value}); using M3 = std::map; EXPECT_TRUE(bool{common::detail::is_key_value_iterable::value}); struct A {}; using M4 = std::map; EXPECT_FALSE(bool{common::detail::is_key_value_iterable::value}); } TEST(KeyValueIterableViewTest, ForEachKeyValue) { std::map m1 = {{"abc", "123"}, {"xyz", "456"}}; EXPECT_EQ(TakeKeyValues(m1), 2); std::vector> v1 = {{"abc", 123}, {"xyz", 456}}; EXPECT_EQ(TakeKeyValues(v1), 2); } TEST(KeyValueIterableViewTest, ForEachKeyValueWithExit) { using M = std::map; M m1 = {{"abc", "123"}, {"xyz", "456"}}; common::KeyValueIterableView iterable{m1}; int count = 0; auto exit = iterable.ForEachKeyValue( [&count](nostd::string_view /*key*/, common::AttributeValue /*value*/) noexcept { ++count; return false; }); EXPECT_EQ(count, 1); EXPECT_FALSE(exit); }