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
|
---|