#ifndef GRPC_SRC_CORE_LIB_PROMISE_ARENA_PROMISE_H
#define GRPC_SRC_CORE_LIB_PROMISE_ARENA_PROMISE_H
#include <grpc/support/port_platform.h>
#include <stdlib.h>
#include <memory>
#include <type_traits>
#include <utility>
#include "absl/meta/type_traits.h"
#include "src/core/lib/gprpp/construct_destruct.h"
#include "src/core/lib/promise/context.h"
#include "src/core/lib/promise/poll.h"
#include "src/core/lib/resource_quota/arena.h"
namespace grpc_core {
namespace arena_promise_detail {
ArgType;
template <typename T>
T*& ArgAsPtr(ArgType* arg) { … }
template <typename T>
struct Vtable { … };
template <typename T>
struct VtableAndArg { … };
template <typename T>
struct Null { … };
template <typename T>
const Vtable<T> Null<T>::vtable = …;
template <typename T, typename Callable>
struct AllocatedCallable { … };
template <typename T, typename Callable>
const Vtable<T> AllocatedCallable<T, Callable>::vtable = …;
template <typename T, typename Callable>
struct Inlined { … };
template <typename T, typename Callable>
const Vtable<T> Inlined<T, Callable>::vtable = …;
template <typename T, typename Callable>
struct SharedCallable { … };
template <typename T, typename Callable>
const Vtable<T> SharedCallable<T, Callable>::vtable = …;
template <typename T, typename Callable, typename Ignored = void>
struct ChooseImplForCallable;
ChooseImplForCallable<T, Callable, absl::enable_if_t<!std::is_empty<Callable>::value && (sizeof(Callable) > sizeof(ArgType))>>;
ChooseImplForCallable<T, Callable, absl::enable_if_t<!std::is_empty<Callable>::value && (sizeof(Callable) <= sizeof(ArgType))>>;
ChooseImplForCallable<T, Callable, absl::enable_if_t<std::is_empty<Callable>::value>>;
template <typename T, typename Callable>
void MakeImplForCallable(Callable&& callable, VtableAndArg<T>* out) { … }
}
template <typename T>
class ArenaPromise { … };
}
#endif