xref: /rockchip-linux_mpp/mpp/base/inc/mpp_trie.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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