1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
10 #include "opentelemetry/common/key_value_iterable_view.h"
11 #include "opentelemetry/nostd/utility.h"
12 #include "opentelemetry/trace/span_context_kv_iterable.h"
13 #include "opentelemetry/version.h"
15 OPENTELEMETRY_BEGIN_NAMESPACE
18 // NOTE - code within `detail` namespace implements internal details, and not part
19 // of the public interface.
23 inline void take_span_context_kv(SpanContext
, common::KeyValueIterableView
<T
>)
26 template <class T
, nostd::enable_if_t
<common::detail::is_key_value_iterable
<T
>::value
> * = nullptr>
27 inline void take_span_context_kv(SpanContext
, T
&)
30 inline void take_span_context_kv(
32 std::initializer_list
<std::pair
<nostd::string_view
, common::AttributeValue
>>)
36 auto is_span_context_kv_iterable_impl(T iterable
)
37 -> decltype(take_span_context_kv(std::begin(iterable
)->first
, std::begin(iterable
)->second
),
38 nostd::size(iterable
),
41 std::false_type
is_span_context_kv_iterable_impl(...);
44 struct is_span_context_kv_iterable
46 static const bool value
=
47 decltype(detail::is_span_context_kv_iterable_impl(std::declval
<T
>()))::value
;
52 class SpanContextKeyValueIterableView final
: public SpanContextKeyValueIterable
54 static_assert(detail::is_span_context_kv_iterable
<T
>::value
,
55 "Must be a context/key-value iterable");
58 explicit SpanContextKeyValueIterableView(const T
&links
) noexcept
: container_
{&links
} {}
61 nostd::function_ref
<bool(SpanContext
, const opentelemetry::common::KeyValueIterable
&)>
62 callback
) const noexcept override
64 auto iter
= std::begin(*container_
);
65 auto last
= std::end(*container_
);
66 for (; iter
!= last
; ++iter
)
68 if (!this->do_callback(iter
->first
, iter
->second
, callback
))
76 size_t size() const noexcept override
{ return nostd::size(*container_
); }
82 SpanContext span_context
,
83 const common::KeyValueIterable
&attributes
,
84 nostd::function_ref
<bool(SpanContext
, const opentelemetry::common::KeyValueIterable
&)>
85 callback
) const noexcept
87 if (!callback(span_context
, attributes
))
95 nostd::enable_if_t
<common::detail::is_key_value_iterable
<U
>::value
> * = nullptr>
96 bool do_callback(SpanContext span_context
,
98 nostd::function_ref
<bool(SpanContext
, const common::KeyValueIterable
&)>
99 callback
) const noexcept
101 return do_callback(span_context
, common::KeyValueIterableView
<U
>(attributes
), callback
);
105 SpanContext span_context
,
106 std::initializer_list
<std::pair
<nostd::string_view
, common::AttributeValue
>> attributes
,
107 nostd::function_ref
<bool(SpanContext
, const common::KeyValueIterable
&)> callback
)
110 return do_callback(span_context
,
111 nostd::span
<const std::pair
<nostd::string_view
, common::AttributeValue
>>{
112 attributes
.begin(), attributes
.end()},
117 OPENTELEMETRY_END_NAMESPACE