#ifndef GRPC_SRC_CORE_LIB_GPR_USEFUL_H
#define GRPC_SRC_CORE_LIB_GPR_USEFUL_H
#include <grpc/support/port_platform.h>
#include <cstddef>
#include "absl/strings/string_view.h"
#include "absl/types/variant.h"
namespace grpc_core {
template <typename T>
T Clamp(T val, T min, T max) { … }
template <typename T>
constexpr T RotateLeft(T x, T n) { … }
template <typename T>
constexpr T RotateRight(T x, T n) { … }
template <typename T>
T SetBit(T* i, size_t n) { … }
template <typename T>
T ClearBit(T* i, size_t n) { … }
template <typename T>
bool GetBit(T i, size_t n) { … }
namespace useful_detail {
inline constexpr uint32_t HexdigitBitcount(uint32_t x) { … }
}
inline constexpr uint32_t BitCount(uint32_t i) { … }
inline constexpr uint32_t BitCount(uint64_t i) { … }
inline constexpr uint32_t BitCount(uint16_t i) { … }
inline constexpr uint32_t BitCount(uint8_t i) { … }
inline constexpr uint32_t BitCount(int64_t i) { … }
inline constexpr uint32_t BitCount(int32_t i) { … }
inline constexpr uint32_t BitCount(int16_t i) { … }
inline constexpr uint32_t BitCount(int8_t i) { … }
template <typename T>
int QsortCompare(const T& a, const T& b) { … }
template <typename... X>
int QsortCompare(const absl::variant<X...>& a, const absl::variant<X...>& b) { … }
inline int QsortCompare(absl::string_view a, absl::string_view b) { … }
inline int QsortCompare(const std::string& a, const std::string& b) { … }
template <typename A, typename B>
int QsortCompare(const std::pair<A, B>& a, const std::pair<A, B>& b) { … }
template <typename T>
constexpr size_t HashPointer(T* p, size_t range) { … }
inline int64_t SaturatingAdd(int64_t a, int64_t b) { … }
inline uint32_t MixHash32(uint32_t a, uint32_t b) { … }
inline uint32_t RoundUpToPowerOf2(uint32_t v) { … }
}
#define GPR_ARRAY_SIZE(array) …
#endif