| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 | // Copyright The OpenTelemetry Authors// SPDX-License-Identifier: Apache-2.0#pragma once#include <stddef.h>#include <initializer_list>#include <iterator>#include <type_traits>#include <utility>#include <vector>#include "opentelemetry/common/attribute_value.h"#include "opentelemetry/common/key_value_iterable.h"#include "opentelemetry/nostd/function_ref.h"#include "opentelemetry/nostd/span.h"#include "opentelemetry/nostd/string_view.h"#include "opentelemetry/nostd/type_traits.h"#include "opentelemetry/nostd/utility.h"#include "opentelemetry/version.h"OPENTELEMETRY_BEGIN_NAMESPACEnamespace common{// NOTE - code within `detail` namespace implements internal details, and not part// of the public interface.namespace detail{inline void take_key_value(nostd::string_view, common::AttributeValue) {}template <class T>auto is_key_value_iterable_impl(T iterable)    -> decltype(take_key_value(std::begin(iterable)->first, std::begin(iterable)->second),                nostd::size(iterable),                std::true_type{});std::false_type is_key_value_iterable_impl(...);template <class T>struct is_key_value_iterable{  static const bool value = decltype(detail::is_key_value_iterable_impl(std::declval<T>()))::value;};}  // namespace detail/** * @brief Container for key-value pairs that can transform every value in it to one of types * listed in common::AttributeValue. It may contain value types that are not directly map'able * to primitive value types. In that case the `ForEachKeyValue` method acts as a transform to * convert the value type to one listed under AtributeValue (bool, int32_t, int64_t, uint32_t, * uint64_t, double, nostd::string_view, or arrays of primite types). For example, if UUID, * GUID, or UTF-16 string type is passed as one of values stored inside this container, the * container itself may provide a custom implementation of `ForEachKeyValue` to transform the * 'non-standard' type to one of the standard types. */template <class T>class KeyValueIterableView final : public KeyValueIterable{public:  explicit KeyValueIterableView(const T &container) noexcept : container_{&container} {}  // KeyValueIterable  bool ForEachKeyValue(nostd::function_ref<bool(nostd::string_view, common::AttributeValue)>                           callback) const noexcept override  {    auto iter = std::begin(*container_);    auto last = std::end(*container_);    for (; iter != last; ++iter)    {      if (!callback(iter->first, iter->second))      {        return false;      }    }    return true;  }  size_t size() const noexcept override { return nostd::size(*container_); }private:  const T *container_;};template <class T, nostd::enable_if_t<detail::is_key_value_iterable<T>::value> * = nullptr>KeyValueIterableView<T> MakeKeyValueIterableView(const T &container) noexcept{  return KeyValueIterableView<T>(container);}/** * Utility function to help to make a attribute view from initializer_list * * @param attributes * @return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>> */inline static nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>MakeAttributes(std::initializer_list<std::pair<nostd::string_view, common::AttributeValue>>                   attributes) noexcept{  return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>{      attributes.begin(), attributes.end()};}/** * Utility function to help to make a attribute view from a span * * @param attributes * @return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>> */inline static nostd::span<const std::pair<nostd::string_view, common::AttributeValue>>MakeAttributes(    nostd::span<const std::pair<nostd::string_view, common::AttributeValue>> attributes) noexcept{  return attributes;}/** * Utility function to help to make a attribute view from a KeyValueIterable * * @param attributes * @return common::KeyValueIterable */inline static const common::KeyValueIterable &MakeAttributes(    const common::KeyValueIterable &attributes) noexcept{  return attributes;}/** * Utility function to help to make a attribute view from a key-value iterable object * * @param attributes * @return nostd::span<const std::pair<nostd::string_view, common::AttributeValue>> */template <    class ArgumentType,    nostd::enable_if_t<common::detail::is_key_value_iterable<ArgumentType>::value> * = nullptr>inline static common::KeyValueIterableView<ArgumentType> MakeAttributes(    const ArgumentType &arg) noexcept{  return common::KeyValueIterableView<ArgumentType>(arg);}}  // namespace commonOPENTELEMETRY_END_NAMESPACE
 |