#ifndef GRPC_SRC_CORE_LIB_TRANSPORT_PARSED_METADATA_H
#define GRPC_SRC_CORE_LIB_TRANSPORT_PARSED_METADATA_H
#include <grpc/support/port_platform.h>
#include <string.h>
#include <cstdint>
#include <string>
#include <type_traits>
#include <utility>
#include "absl/functional/function_ref.h"
#include "absl/meta/type_traits.h"
#include "absl/strings/match.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include <grpc/slice.h>
#include "src/core/lib/gprpp/time.h"
#include "src/core/lib/slice/slice.h"
namespace grpc_core {
MetadataParseErrorFn;
namespace metadata_detail {
template <typename Which>
struct HasSimpleMemento { … };
Buffer;
std::string MakeDebugString(absl::string_view key, absl::string_view value);
template <typename Field, typename CompatibleWithField, typename Display>
GPR_ATTRIBUTE_NOINLINE std::string MakeDebugStringPipeline(
absl::string_view key, const Buffer& value,
Field (*field_from_buffer)(const Buffer&),
Display (*display_from_field)(CompatibleWithField)) { … }
template <typename Field>
Field FieldFromTrivial(const Buffer& value) { … }
template <typename Field>
Field FieldFromPointer(const Buffer& value) { … }
Slice SliceFromBuffer(const Buffer& buffer);
void DestroySliceValue(const Buffer& value);
void DestroyTrivialMemento(const Buffer& value);
template <Slice (*MementoToValue)(Slice)>
void SetSliceValue(Slice* set, const Buffer& value) { … }
}
template <typename MetadataContainer>
class ParsedMetadata { … };
namespace metadata_detail {}
template <typename MetadataContainer>
const typename ParsedMetadata<MetadataContainer>::VTable*
ParsedMetadata<MetadataContainer>::EmptyVTable() { … }
template <typename MetadataContainer>
template <typename Which>
const typename ParsedMetadata<MetadataContainer>::VTable*
ParsedMetadata<MetadataContainer>::TrivialTraitVTable() { … }
template <typename MetadataContainer>
template <typename Which>
const typename ParsedMetadata<MetadataContainer>::VTable*
ParsedMetadata<MetadataContainer>::NonTrivialTraitVTable() { … }
template <typename MetadataContainer>
template <typename Which>
const typename ParsedMetadata<MetadataContainer>::VTable*
ParsedMetadata<MetadataContainer>::SliceTraitVTable() { … }
template <typename MetadataContainer>
const typename ParsedMetadata<MetadataContainer>::VTable*
ParsedMetadata<MetadataContainer>::KeyValueVTable(absl::string_view key) { … }
}
#endif