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