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