Go to the documentation of this file.
57 #ifndef OPENSSL_HEADER_STACK_H
58 #define OPENSSL_HEADER_STACK_H
64 #if defined(__cplusplus)
97 typedef void *(*stack_copy_func)(
void *
ptr);
125 #define STACK_OF(type) struct stack_st_##type
127 #define DECLARE_STACK_OF(type) STACK_OF(type);
251 #if !defined(BORINGSSL_NO_CXX)
255 template <
typename T>
261 #define BORINGSSL_DEFINE_STACK_TRAITS(name, type, is_const) \
263 BSSL_NAMESPACE_BEGIN \
264 namespace internal { \
266 struct StackTraits<STACK_OF(name)> { \
267 static constexpr bool kIsStack = true; \
269 static constexpr bool kIsConst = is_const; \
276 #define BORINGSSL_DEFINE_STACK_TRAITS(name, type, is_const)
279 #define BORINGSSL_DEFINE_STACK_OF_IMPL(name, ptrtype, constptrtype) \
280 DECLARE_STACK_OF(name) \
282 typedef void (*stack_##name##_free_func)(ptrtype); \
283 typedef ptrtype (*stack_##name##_copy_func)(ptrtype); \
284 typedef int (*stack_##name##_cmp_func)(constptrtype *a, constptrtype *b); \
286 OPENSSL_INLINE void sk_##name##_call_free_func(stack_free_func free_func, \
288 ((stack_##name##_free_func)free_func)((ptrtype)ptr); \
291 OPENSSL_INLINE void *sk_##name##_call_copy_func(stack_copy_func copy_func, \
293 return (void *)((stack_##name##_copy_func)copy_func)((ptrtype)ptr); \
296 OPENSSL_INLINE int sk_##name##_call_cmp_func( \
297 stack_cmp_func cmp_func, const void **a, const void **b) { \
298 constptrtype a_ptr = (constptrtype)*a; \
299 constptrtype b_ptr = (constptrtype)*b; \
300 return ((stack_##name##_cmp_func)cmp_func)(&a_ptr, &b_ptr); \
303 OPENSSL_INLINE STACK_OF(name) * \
304 sk_##name##_new(stack_##name##_cmp_func comp) { \
305 return (STACK_OF(name) *)sk_new((stack_cmp_func)comp); \
308 OPENSSL_INLINE STACK_OF(name) *sk_##name##_new_null(void) { \
309 return (STACK_OF(name) *)sk_new_null(); \
312 OPENSSL_INLINE size_t sk_##name##_num(const STACK_OF(name) *sk) { \
313 return sk_num((const _STACK *)sk); \
316 OPENSSL_INLINE void sk_##name##_zero(STACK_OF(name) *sk) { \
317 sk_zero((_STACK *)sk); \
320 OPENSSL_INLINE ptrtype sk_##name##_value(const STACK_OF(name) *sk, \
322 return (ptrtype)sk_value((const _STACK *)sk, i); \
325 OPENSSL_INLINE ptrtype sk_##name##_set(STACK_OF(name) *sk, size_t i, \
327 return (ptrtype)sk_set((_STACK *)sk, i, (void *)p); \
330 OPENSSL_INLINE void sk_##name##_free(STACK_OF(name) * sk) { \
331 sk_free((_STACK *)sk); \
334 OPENSSL_INLINE void sk_##name##_pop_free( \
335 STACK_OF(name) * sk, stack_##name##_free_func free_func) { \
336 sk_pop_free_ex((_STACK *)sk, sk_##name##_call_free_func, \
337 (stack_free_func)free_func); \
340 OPENSSL_INLINE size_t sk_##name##_insert(STACK_OF(name) *sk, ptrtype p, \
342 return sk_insert((_STACK *)sk, (void *)p, where); \
345 OPENSSL_INLINE ptrtype sk_##name##_delete(STACK_OF(name) *sk, \
347 return (ptrtype)sk_delete((_STACK *)sk, where); \
350 OPENSSL_INLINE ptrtype sk_##name##_delete_ptr(STACK_OF(name) *sk, \
352 return (ptrtype)sk_delete_ptr((_STACK *)sk, (const void *)p); \
355 OPENSSL_INLINE int sk_##name##_find(const STACK_OF(name) *sk, \
356 size_t * out_index, constptrtype p) { \
357 return sk_find((const _STACK *)sk, out_index, (const void *)p, \
358 sk_##name##_call_cmp_func); \
361 OPENSSL_INLINE ptrtype sk_##name##_shift(STACK_OF(name) *sk) { \
362 return (ptrtype)sk_shift((_STACK *)sk); \
365 OPENSSL_INLINE size_t sk_##name##_push(STACK_OF(name) *sk, ptrtype p) { \
366 return sk_push((_STACK *)sk, (void *)p); \
369 OPENSSL_INLINE ptrtype sk_##name##_pop(STACK_OF(name) *sk) { \
370 return (ptrtype)sk_pop((_STACK *)sk); \
373 OPENSSL_INLINE STACK_OF(name) * sk_##name##_dup(const STACK_OF(name) *sk) { \
374 return (STACK_OF(name) *)sk_dup((const _STACK *)sk); \
377 OPENSSL_INLINE void sk_##name##_sort(STACK_OF(name) *sk) { \
378 sk_sort((_STACK *)sk); \
381 OPENSSL_INLINE int sk_##name##_is_sorted(const STACK_OF(name) *sk) { \
382 return sk_is_sorted((const _STACK *)sk); \
385 OPENSSL_INLINE stack_##name##_cmp_func sk_##name##_set_cmp_func( \
386 STACK_OF(name) *sk, stack_##name##_cmp_func comp) { \
387 return (stack_##name##_cmp_func)sk_set_cmp_func((_STACK *)sk, \
388 (stack_cmp_func)comp); \
391 OPENSSL_INLINE STACK_OF(name) * \
392 sk_##name##_deep_copy(const STACK_OF(name) *sk, \
393 ptrtype(*copy_func)(ptrtype), \
394 void (*free_func)(ptrtype)) { \
395 return (STACK_OF(name) *)sk_deep_copy( \
396 (const _STACK *)sk, sk_##name##_call_copy_func, \
397 (stack_copy_func)copy_func, sk_##name##_call_free_func, \
398 (stack_free_func)free_func); \
403 #define DEFINE_NAMED_STACK_OF(name, type) \
404 BORINGSSL_DEFINE_STACK_OF_IMPL(name, type *, const type *) \
405 BORINGSSL_DEFINE_STACK_TRAITS(name, type, false)
409 #define DEFINE_STACK_OF(type) DEFINE_NAMED_STACK_OF(type, type)
413 #define DEFINE_CONST_STACK_OF(type) \
414 BORINGSSL_DEFINE_STACK_OF_IMPL(type, const type *, const type *) \
415 BORINGSSL_DEFINE_STACK_TRAITS(type, const type, true)
419 #define DEFINE_SPECIAL_STACK_OF(type) \
420 OPENSSL_STATIC_ASSERT(sizeof(type) == sizeof(void *), \
421 #type " is not a pointer"); \
422 BORINGSSL_DEFINE_STACK_OF_IMPL(type, type, const type)
431 #if defined(__cplusplus)
435 #if !defined(BORINGSSL_NO_CXX)
438 #include <type_traits>
445 template <
typename Stack>
447 Stack, typename
std::enable_if<StackTraits<Stack>::kIsConst>
::type> {
453 template <
typename Stack>
455 Stack, typename
std::enable_if<!StackTraits<Stack>::kIsConst>
::type> {
462 DeleterImpl<Type>::Free(
reinterpret_cast<Type *
>(
ptr));
468 template <
typename Stack>
480 return !(*
this == other);
484 return reinterpret_cast<Type *
>(
504 template <
typename Stack>
505 using StackIterator =
typename std::enable_if<StackTraits<Stack>::kIsStack,
512 template <
typename Stack>
514 typename std::enable_if<!internal::StackTraits<Stack>::kIsConst,
bool>
::type
528 template <
typename Stack>
529 inline bssl::internal::StackIterator<Stack>
begin(
const Stack *sk) {
530 return bssl::internal::StackIterator<Stack>(sk, 0);
533 template <
typename Stack>
534 inline bssl::internal::StackIterator<Stack>
end(
const Stack *sk) {
535 return bssl::internal::StackIterator<Stack>(
542 #endif // OPENSSL_HEADER_STACK_H
OPENSSL_EXPORT void sk_zero(_STACK *sk)
OPENSSL_EXPORT void sk_pop_free_ex(_STACK *sk, void(*call_free_func)(stack_free_func, void *), stack_free_func free_func)
OPENSSL_EXPORT void sk_sort(_STACK *sk)
int(* stack_cmp_func)(const void **a, const void **b)
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
StackIteratorImpl operator++(int)
bool operator==(StackIteratorImpl other) const
OPENSSL_EXPORT stack_cmp_func sk_set_cmp_func(_STACK *sk, stack_cmp_func comp)
OPENSSL_EXPORT _STACK * sk_dup(const _STACK *sk)
OPENSSL_EXPORT _STACK * sk_new(stack_cmp_func comp)
StackIteratorImpl & operator++()
OPENSSL_EXPORT void * sk_delete(_STACK *sk, size_t where)
OPENSSL_EXPORT void sk_pop_free(_STACK *sk, stack_free_func free_func)
OPENSSL_EXPORT size_t sk_num(const _STACK *sk)
OPENSSL_EXPORT _STACK * sk_deep_copy(const _STACK *sk, void *(*call_copy_func)(stack_copy_func, void *), stack_copy_func copy_func, void(*call_free_func)(stack_free_func, void *), stack_free_func free_func)
typename std::enable_if< StackTraits< Stack >::kIsStack, StackIteratorImpl< Stack > >::type StackIterator
OPENSSL_EXPORT size_t sk_push(_STACK *sk, void *p)
OPENSSL_EXPORT void * sk_pop(_STACK *sk)
#define BSSL_NAMESPACE_END
OPENSSL_EXPORT size_t sk_insert(_STACK *sk, void *p, size_t where)
BSSL_NAMESPACE_END bssl::internal::StackIterator< Stack > begin(const Stack *sk)
#define DEFINE_STACK_OF(type)
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
void(* stack_free_func)(void *ptr)
static void Free(Stack *sk)
StackIteratorImpl(const Stack *sk, size_t idx)
OPENSSL_EXPORT int sk_find(const _STACK *sk, size_t *out_index, const void *p, int(*call_cmp_func)(stack_cmp_func, const void **, const void **))
void *(* stack_copy_func)(void *ptr)
OPENSSL_EXPORT _STACK * sk_new_null(void)
bool operator!=(StackIteratorImpl other) const
#define DEFINE_SPECIAL_STACK_OF(type)
OPENSSL_EXPORT void * sk_set(_STACK *sk, size_t i, void *p)
OPENSSL_EXPORT void * sk_shift(_STACK *sk)
std::enable_if<!internal::StackTraits< Stack >::kIsConst, bool >::type PushToStack(Stack *sk, UniquePtr< typename internal::StackTraits< Stack >::Type > elem)
OPENSSL_EXPORT int sk_is_sorted(const _STACK *sk)
OPENSSL_EXPORT void * sk_value(const _STACK *sk, size_t i)
bssl::internal::StackIterator< Stack > end(const Stack *sk)
OPENSSL_EXPORT void * sk_delete_ptr(_STACK *sk, const void *p)
static void Free(Stack *sk)
OPENSSL_EXPORT void sk_free(_STACK *sk)
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:21