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