/src/openssl/include/crypto/sparse_array.h
Line  | Count  | Source (jump to first uncovered line)  | 
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  | 36  |     { \ | 
28  | 36  |         return (SPARSE_ARRAY_OF(type) *)ossl_sa_new(); \  | 
29  | 36  |     } \  | 
30  |  |     static ossl_unused ossl_inline void \  | 
31  |  |     ossl_sa_##type##_free(SPARSE_ARRAY_OF(type) *sa) \  | 
32  | 12  |     { \ | 
33  | 12  |         ossl_sa_free((OPENSSL_SA *)sa); \  | 
34  | 12  |     } \  | 
35  |  |     static ossl_unused ossl_inline void \  | 
36  |  |     ossl_sa_##type##_free_leaves(SPARSE_ARRAY_OF(type) *sa) \  | 
37  | 0  |     { \ | 
38  | 0  |         ossl_sa_free_leaves((OPENSSL_SA *)sa); \  | 
39  | 0  |     } \  | 
40  |  |     static ossl_unused ossl_inline size_t \  | 
41  |  |     ossl_sa_##type##_num(const SPARSE_ARRAY_OF(type) *sa) \  | 
42  | 0  |     { \ | 
43  | 0  |         return ossl_sa_num((OPENSSL_SA *)sa); \  | 
44  | 0  |     } \  | 
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  | 51  |     { \ | 
49  | 51  |         ossl_sa_doall((OPENSSL_SA *)sa, \  | 
50  | 51  |                       (void (*)(ossl_uintmax_t, void *))leaf); \  | 
51  | 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  | 12  |     { \ | 
57  | 12  |         ossl_sa_doall_arg((OPENSSL_SA *)sa, \  | 
58  | 12  |                           (void (*)(ossl_uintmax_t, void *, void *))leaf, arg); \  | 
59  | 12  |     } \  | 
60  |  |     static ossl_unused ossl_inline ctype \  | 
61  |  |     *ossl_sa_##type##_get(const SPARSE_ARRAY_OF(type) *sa, ossl_uintmax_t n) \  | 
62  | 1.13M  |     { \ | 
63  | 1.13M  |         return (type *)ossl_sa_get((OPENSSL_SA *)sa, n); \  | 
64  | 1.13M  |     } \  | 
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  | 302  |     { \ | 
69  | 302  |         return ossl_sa_set((OPENSSL_SA *)sa, n, (void *)val); \  | 
70  | 302  |     } \  | 
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  |