1 /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2 /*
3 * Copyright (c) 2024 Rockchip Electronics Co., Ltd.
4 */
5
6 #ifndef __MPP_TRIE_H__
7 #define __MPP_TRIE_H__
8
9 #include <string.h>
10
11 #include "mpp_internal.h"
12
13 #define MPP_TRIE_KEY_LEN (4)
14 #define MPP_TRIE_KEY_MAX (1 << (MPP_TRIE_KEY_LEN))
15
16 /*
17 * MppTrie node buffer layout
18 * +---------------+
19 * | MppTrieImpl |
20 * +---------------+
21 * | MppTrieNodes |
22 * +---------------+
23 * | MppTrieInfos |
24 * +---------------+
25 *
26 * MppTrieInfo element layout
27 * +---------------+
28 * | MppTrieInfo |
29 * +---------------+
30 * | name string |
31 * +---------------+
32 * | User context |
33 * +---------------+
34 */
35 typedef struct MppTrieInfo_t {
36 rk_u32 index : 12;
37 rk_u32 ctx_len : 12;
38 rk_u32 str_len : 8;
39 } MppTrieInfo;
40
41 #ifdef __cplusplus
42 extern "C" {
43 #endif
44
45 rk_s32 mpp_trie_init(MppTrie *trie, const char *name);
46 rk_s32 mpp_trie_init_by_root(MppTrie *trie, void *root);
47 rk_s32 mpp_trie_deinit(MppTrie trie);
48
49 /* Add NULL info to mark the last trie entry */
50 rk_s32 mpp_trie_add_info(MppTrie trie, const char *name, void *ctx, rk_u32 ctx_len);
51
52 rk_s32 mpp_trie_get_node_count(MppTrie trie);
53 rk_s32 mpp_trie_get_info_count(MppTrie trie);
54 rk_s32 mpp_trie_get_buf_size(MppTrie trie);
55 rk_s32 mpp_trie_get_name_max(MppTrie trie);
56 void *mpp_trie_get_node_root(MppTrie trie);
57
mpp_trie_info_name(MppTrieInfo * info)58 static inline const char *mpp_trie_info_name(MppTrieInfo *info)
59 {
60 return (info) ? (const char *)(info + 1) : NULL;
61 }
62
mpp_trie_info_ctx(MppTrieInfo * info)63 static inline void *mpp_trie_info_ctx(MppTrieInfo *info)
64 {
65 return (info) ? (void *)((char *)(info + 1) + info->str_len) : NULL;
66 }
67
mpp_trie_info_is_self(MppTrieInfo * info)68 static inline rk_s32 mpp_trie_info_is_self(MppTrieInfo *info)
69 {
70 return (info) ? !!strstr((const char *)(info + 1), "__") : 0;
71 }
72
mpp_trie_info_name_is_self(const char * name)73 static inline rk_s32 mpp_trie_info_name_is_self(const char *name)
74 {
75 return (name) ? !!strstr(name, "__") : 0;
76 }
77
78 /* trie lookup function */
79 MppTrieInfo *mpp_trie_get_info(MppTrie trie, const char *name);
80 MppTrieInfo *mpp_trie_get_info_first(MppTrie trie);
81 MppTrieInfo *mpp_trie_get_info_next(MppTrie trie, MppTrieInfo *info);
82 /* root base lookup function */
83 MppTrieInfo *mpp_trie_get_info_from_root(void *root, const char *name);
84
85 void mpp_trie_dump(MppTrie trie, const char *func);
86 #define mpp_trie_dump_f(trie) mpp_trie_dump(trie, __FUNCTION__)
87
88 void mpp_trie_timing_test(MppTrie trie);
89
90 #ifdef __cplusplus
91 }
92 #endif
93
94 #endif /*__MPP_TRIE_H__*/
95