1*b077aed3SPierre Pronchery /* 2*b077aed3SPierre Pronchery * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. 3*b077aed3SPierre Pronchery * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. 4*b077aed3SPierre Pronchery * 5*b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use 6*b077aed3SPierre Pronchery * this file except in compliance with the License. You can obtain a copy 7*b077aed3SPierre Pronchery * in the file LICENSE in the source distribution or at 8*b077aed3SPierre Pronchery * https://www.openssl.org/source/license.html 9*b077aed3SPierre Pronchery */ 10*b077aed3SPierre Pronchery 11*b077aed3SPierre Pronchery #ifndef OSSL_CRYPTO_SPARSE_ARRAY_H 12*b077aed3SPierre Pronchery # define OSSL_CRYPTO_SPARSE_ARRAY_H 13*b077aed3SPierre Pronchery # pragma once 14*b077aed3SPierre Pronchery 15*b077aed3SPierre Pronchery # include <openssl/e_os2.h> 16*b077aed3SPierre Pronchery 17*b077aed3SPierre Pronchery # ifdef __cplusplus 18*b077aed3SPierre Pronchery extern "C" { 19*b077aed3SPierre Pronchery # endif 20*b077aed3SPierre Pronchery 21*b077aed3SPierre Pronchery # define SPARSE_ARRAY_OF(type) struct sparse_array_st_ ## type 22*b077aed3SPierre Pronchery 23*b077aed3SPierre Pronchery # define DEFINE_SPARSE_ARRAY_OF_INTERNAL(type, ctype) \ 24*b077aed3SPierre Pronchery SPARSE_ARRAY_OF(type); \ 25*b077aed3SPierre Pronchery static ossl_unused ossl_inline SPARSE_ARRAY_OF(type) * \ 26*b077aed3SPierre Pronchery ossl_sa_##type##_new(void) \ 27*b077aed3SPierre Pronchery { \ 28*b077aed3SPierre Pronchery return (SPARSE_ARRAY_OF(type) *)ossl_sa_new(); \ 29*b077aed3SPierre Pronchery } \ 30*b077aed3SPierre Pronchery static ossl_unused ossl_inline void \ 31*b077aed3SPierre Pronchery ossl_sa_##type##_free(SPARSE_ARRAY_OF(type) *sa) \ 32*b077aed3SPierre Pronchery { \ 33*b077aed3SPierre Pronchery ossl_sa_free((OPENSSL_SA *)sa); \ 34*b077aed3SPierre Pronchery } \ 35*b077aed3SPierre Pronchery static ossl_unused ossl_inline void \ 36*b077aed3SPierre Pronchery ossl_sa_##type##_free_leaves(SPARSE_ARRAY_OF(type) *sa) \ 37*b077aed3SPierre Pronchery { \ 38*b077aed3SPierre Pronchery ossl_sa_free_leaves((OPENSSL_SA *)sa); \ 39*b077aed3SPierre Pronchery } \ 40*b077aed3SPierre Pronchery static ossl_unused ossl_inline size_t \ 41*b077aed3SPierre Pronchery ossl_sa_##type##_num(const SPARSE_ARRAY_OF(type) *sa) \ 42*b077aed3SPierre Pronchery { \ 43*b077aed3SPierre Pronchery return ossl_sa_num((OPENSSL_SA *)sa); \ 44*b077aed3SPierre Pronchery } \ 45*b077aed3SPierre Pronchery static ossl_unused ossl_inline void \ 46*b077aed3SPierre Pronchery ossl_sa_##type##_doall(const SPARSE_ARRAY_OF(type) *sa, \ 47*b077aed3SPierre Pronchery void (*leaf)(ossl_uintmax_t, type *)) \ 48*b077aed3SPierre Pronchery { \ 49*b077aed3SPierre Pronchery ossl_sa_doall((OPENSSL_SA *)sa, \ 50*b077aed3SPierre Pronchery (void (*)(ossl_uintmax_t, void *))leaf); \ 51*b077aed3SPierre Pronchery } \ 52*b077aed3SPierre Pronchery static ossl_unused ossl_inline void \ 53*b077aed3SPierre Pronchery ossl_sa_##type##_doall_arg(const SPARSE_ARRAY_OF(type) *sa, \ 54*b077aed3SPierre Pronchery void (*leaf)(ossl_uintmax_t, type *, void *), \ 55*b077aed3SPierre Pronchery void *arg) \ 56*b077aed3SPierre Pronchery { \ 57*b077aed3SPierre Pronchery ossl_sa_doall_arg((OPENSSL_SA *)sa, \ 58*b077aed3SPierre Pronchery (void (*)(ossl_uintmax_t, void *, void *))leaf, arg); \ 59*b077aed3SPierre Pronchery } \ 60*b077aed3SPierre Pronchery static ossl_unused ossl_inline ctype \ 61*b077aed3SPierre Pronchery *ossl_sa_##type##_get(const SPARSE_ARRAY_OF(type) *sa, ossl_uintmax_t n) \ 62*b077aed3SPierre Pronchery { \ 63*b077aed3SPierre Pronchery return (type *)ossl_sa_get((OPENSSL_SA *)sa, n); \ 64*b077aed3SPierre Pronchery } \ 65*b077aed3SPierre Pronchery static ossl_unused ossl_inline int \ 66*b077aed3SPierre Pronchery ossl_sa_##type##_set(SPARSE_ARRAY_OF(type) *sa, \ 67*b077aed3SPierre Pronchery ossl_uintmax_t n, ctype *val) \ 68*b077aed3SPierre Pronchery { \ 69*b077aed3SPierre Pronchery return ossl_sa_set((OPENSSL_SA *)sa, n, (void *)val); \ 70*b077aed3SPierre Pronchery } \ 71*b077aed3SPierre Pronchery SPARSE_ARRAY_OF(type) 72*b077aed3SPierre Pronchery 73*b077aed3SPierre Pronchery # define DEFINE_SPARSE_ARRAY_OF(type) \ 74*b077aed3SPierre Pronchery DEFINE_SPARSE_ARRAY_OF_INTERNAL(type, type) 75*b077aed3SPierre Pronchery # define DEFINE_SPARSE_ARRAY_OF_CONST(type) \ 76*b077aed3SPierre Pronchery DEFINE_SPARSE_ARRAY_OF_INTERNAL(type, const type) 77*b077aed3SPierre Pronchery 78*b077aed3SPierre Pronchery typedef struct sparse_array_st OPENSSL_SA; 79*b077aed3SPierre Pronchery OPENSSL_SA *ossl_sa_new(void); 80*b077aed3SPierre Pronchery void ossl_sa_free(OPENSSL_SA *sa); 81*b077aed3SPierre Pronchery void ossl_sa_free_leaves(OPENSSL_SA *sa); 82*b077aed3SPierre Pronchery size_t ossl_sa_num(const OPENSSL_SA *sa); 83*b077aed3SPierre Pronchery void ossl_sa_doall(const OPENSSL_SA *sa, void (*leaf)(ossl_uintmax_t, void *)); 84*b077aed3SPierre Pronchery void ossl_sa_doall_arg(const OPENSSL_SA *sa, 85*b077aed3SPierre Pronchery void (*leaf)(ossl_uintmax_t, void *, void *), void *); 86*b077aed3SPierre Pronchery void *ossl_sa_get(const OPENSSL_SA *sa, ossl_uintmax_t n); 87*b077aed3SPierre Pronchery int ossl_sa_set(OPENSSL_SA *sa, ossl_uintmax_t n, void *val); 88*b077aed3SPierre Pronchery 89*b077aed3SPierre Pronchery # ifdef __cplusplus 90*b077aed3SPierre Pronchery } 91*b077aed3SPierre Pronchery # endif 92*b077aed3SPierre Pronchery #endif 93