| 1 | /* |
| 2 | * Copyright 2019 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 | |
| 14 | # include <openssl/e_os2.h> |
| 15 | |
| 16 | # ifdef __cplusplus |
| 17 | extern "C" { |
| 18 | # endif |
| 19 | |
| 20 | # define SPARSE_ARRAY_OF(type) struct sparse_array_st_ ## type |
| 21 | |
| 22 | # define DEFINE_SPARSE_ARRAY_OF_INTERNAL(type, ctype) \ |
| 23 | SPARSE_ARRAY_OF(type); \ |
| 24 | static ossl_unused ossl_inline SPARSE_ARRAY_OF(type) * \ |
| 25 | ossl_sa_##type##_new(void) \ |
| 26 | { \ |
| 27 | return (SPARSE_ARRAY_OF(type) *)OPENSSL_SA_new(); \ |
| 28 | } \ |
| 29 | static ossl_unused ossl_inline void ossl_sa_##type##_free(SPARSE_ARRAY_OF(type) *sa) \ |
| 30 | { \ |
| 31 | OPENSSL_SA_free((OPENSSL_SA *)sa); \ |
| 32 | } \ |
| 33 | static ossl_unused ossl_inline void ossl_sa_##type##_free_leaves(SPARSE_ARRAY_OF(type) *sa) \ |
| 34 | { \ |
| 35 | OPENSSL_SA_free_leaves((OPENSSL_SA *)sa); \ |
| 36 | } \ |
| 37 | static ossl_unused ossl_inline size_t ossl_sa_##type##_num(const SPARSE_ARRAY_OF(type) *sa) \ |
| 38 | { \ |
| 39 | return OPENSSL_SA_num((OPENSSL_SA *)sa); \ |
| 40 | } \ |
| 41 | static ossl_unused ossl_inline void ossl_sa_##type##_doall(const SPARSE_ARRAY_OF(type) *sa, \ |
| 42 | void (*leaf)(ossl_uintmax_t, \ |
| 43 | type *)) \ |
| 44 | { \ |
| 45 | OPENSSL_SA_doall((OPENSSL_SA *)sa, (void (*)(ossl_uintmax_t, void *))leaf); \ |
| 46 | } \ |
| 47 | static ossl_unused ossl_inline \ |
| 48 | void ossl_sa_##type##_doall_arg(const SPARSE_ARRAY_OF(type) *sa, \ |
| 49 | void (*leaf)(ossl_uintmax_t, type *, void *), \ |
| 50 | void *arg) \ |
| 51 | { \ |
| 52 | OPENSSL_SA_doall_arg((OPENSSL_SA *)sa, (void (*)(ossl_uintmax_t, void *, \ |
| 53 | void *))leaf, \ |
| 54 | arg); \ |
| 55 | } \ |
| 56 | static ossl_unused ossl_inline ctype *ossl_sa_##type##_get(const SPARSE_ARRAY_OF(type) *sa, \ |
| 57 | ossl_uintmax_t n) \ |
| 58 | { \ |
| 59 | return (type *)OPENSSL_SA_get((OPENSSL_SA *)sa, n); \ |
| 60 | } \ |
| 61 | static ossl_unused ossl_inline int ossl_sa_##type##_set(SPARSE_ARRAY_OF(type) *sa, \ |
| 62 | ossl_uintmax_t n, ctype *val) \ |
| 63 | { \ |
| 64 | return OPENSSL_SA_set((OPENSSL_SA *)sa, n, (void *)val); \ |
| 65 | } \ |
| 66 | SPARSE_ARRAY_OF(type) |
| 67 | |
| 68 | # define DEFINE_SPARSE_ARRAY_OF(type) \ |
| 69 | DEFINE_SPARSE_ARRAY_OF_INTERNAL(type, type) |
| 70 | # define DEFINE_SPARSE_ARRAY_OF_CONST(type) \ |
| 71 | DEFINE_SPARSE_ARRAY_OF_INTERNAL(type, const type) |
| 72 | |
| 73 | typedef struct sparse_array_st OPENSSL_SA; |
| 74 | OPENSSL_SA *OPENSSL_SA_new(void); |
| 75 | void OPENSSL_SA_free(OPENSSL_SA *sa); |
| 76 | void OPENSSL_SA_free_leaves(OPENSSL_SA *sa); |
| 77 | size_t OPENSSL_SA_num(const OPENSSL_SA *sa); |
| 78 | void OPENSSL_SA_doall(const OPENSSL_SA *sa, |
| 79 | void (*leaf)(ossl_uintmax_t, void *)); |
| 80 | void OPENSSL_SA_doall_arg(const OPENSSL_SA *sa, |
| 81 | void (*leaf)(ossl_uintmax_t, void *, void *), void *); |
| 82 | void *OPENSSL_SA_get(const OPENSSL_SA *sa, ossl_uintmax_t n); |
| 83 | int OPENSSL_SA_set(OPENSSL_SA *sa, ossl_uintmax_t n, void *val); |
| 84 | |
| 85 | # ifdef __cplusplus |
| 86 | } |
| 87 | # endif |
| 88 | #endif |
| 89 | |