xref: /linux-6.15/include/linux/btree-type.h (revision b2441318)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
25db53f3eSJoern Engel #define __BTREE_TP(pfx, type, sfx)	pfx ## type ## sfx
35db53f3eSJoern Engel #define _BTREE_TP(pfx, type, sfx)	__BTREE_TP(pfx, type, sfx)
45db53f3eSJoern Engel #define BTREE_TP(pfx)			_BTREE_TP(pfx, BTREE_TYPE_SUFFIX,)
55db53f3eSJoern Engel #define BTREE_FN(name)			BTREE_TP(btree_ ## name)
65db53f3eSJoern Engel #define BTREE_TYPE_HEAD			BTREE_TP(struct btree_head)
75db53f3eSJoern Engel #define VISITOR_FN			BTREE_TP(visitor)
85db53f3eSJoern Engel #define VISITOR_FN_T			_BTREE_TP(visitor, BTREE_TYPE_SUFFIX, _t)
95db53f3eSJoern Engel 
105db53f3eSJoern Engel BTREE_TYPE_HEAD {
115db53f3eSJoern Engel 	struct btree_head h;
125db53f3eSJoern Engel };
135db53f3eSJoern Engel 
BTREE_FN(init_mempool)145db53f3eSJoern Engel static inline void BTREE_FN(init_mempool)(BTREE_TYPE_HEAD *head,
155db53f3eSJoern Engel 					  mempool_t *mempool)
165db53f3eSJoern Engel {
175db53f3eSJoern Engel 	btree_init_mempool(&head->h, mempool);
185db53f3eSJoern Engel }
195db53f3eSJoern Engel 
BTREE_FN(init)205db53f3eSJoern Engel static inline int BTREE_FN(init)(BTREE_TYPE_HEAD *head)
215db53f3eSJoern Engel {
225db53f3eSJoern Engel 	return btree_init(&head->h);
235db53f3eSJoern Engel }
245db53f3eSJoern Engel 
BTREE_FN(destroy)255db53f3eSJoern Engel static inline void BTREE_FN(destroy)(BTREE_TYPE_HEAD *head)
265db53f3eSJoern Engel {
275db53f3eSJoern Engel 	btree_destroy(&head->h);
285db53f3eSJoern Engel }
295db53f3eSJoern Engel 
BTREE_FN(merge)305db53f3eSJoern Engel static inline int BTREE_FN(merge)(BTREE_TYPE_HEAD *target,
315db53f3eSJoern Engel 				  BTREE_TYPE_HEAD *victim,
325db53f3eSJoern Engel 				  gfp_t gfp)
335db53f3eSJoern Engel {
345db53f3eSJoern Engel 	return btree_merge(&target->h, &victim->h, BTREE_TYPE_GEO, gfp);
355db53f3eSJoern Engel }
365db53f3eSJoern Engel 
375db53f3eSJoern Engel #if (BITS_PER_LONG > BTREE_TYPE_BITS)
BTREE_FN(lookup)385db53f3eSJoern Engel static inline void *BTREE_FN(lookup)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
395db53f3eSJoern Engel {
405db53f3eSJoern Engel 	unsigned long _key = key;
415db53f3eSJoern Engel 	return btree_lookup(&head->h, BTREE_TYPE_GEO, &_key);
425db53f3eSJoern Engel }
435db53f3eSJoern Engel 
BTREE_FN(insert)445db53f3eSJoern Engel static inline int BTREE_FN(insert)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
455db53f3eSJoern Engel 				   void *val, gfp_t gfp)
465db53f3eSJoern Engel {
475db53f3eSJoern Engel 	unsigned long _key = key;
485db53f3eSJoern Engel 	return btree_insert(&head->h, BTREE_TYPE_GEO, &_key, val, gfp);
495db53f3eSJoern Engel }
505db53f3eSJoern Engel 
BTREE_FN(update)515db53f3eSJoern Engel static inline int BTREE_FN(update)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
525db53f3eSJoern Engel 		void *val)
535db53f3eSJoern Engel {
545db53f3eSJoern Engel 	unsigned long _key = key;
555db53f3eSJoern Engel 	return btree_update(&head->h, BTREE_TYPE_GEO, &_key, val);
565db53f3eSJoern Engel }
575db53f3eSJoern Engel 
BTREE_FN(remove)585db53f3eSJoern Engel static inline void *BTREE_FN(remove)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
595db53f3eSJoern Engel {
605db53f3eSJoern Engel 	unsigned long _key = key;
615db53f3eSJoern Engel 	return btree_remove(&head->h, BTREE_TYPE_GEO, &_key);
625db53f3eSJoern Engel }
635db53f3eSJoern Engel 
BTREE_FN(last)645db53f3eSJoern Engel static inline void *BTREE_FN(last)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
655db53f3eSJoern Engel {
665db53f3eSJoern Engel 	unsigned long _key;
675db53f3eSJoern Engel 	void *val = btree_last(&head->h, BTREE_TYPE_GEO, &_key);
685db53f3eSJoern Engel 	if (val)
695db53f3eSJoern Engel 		*key = _key;
705db53f3eSJoern Engel 	return val;
715db53f3eSJoern Engel }
725db53f3eSJoern Engel 
BTREE_FN(get_prev)735db53f3eSJoern Engel static inline void *BTREE_FN(get_prev)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
745db53f3eSJoern Engel {
755db53f3eSJoern Engel 	unsigned long _key = *key;
765db53f3eSJoern Engel 	void *val = btree_get_prev(&head->h, BTREE_TYPE_GEO, &_key);
775db53f3eSJoern Engel 	if (val)
785db53f3eSJoern Engel 		*key = _key;
795db53f3eSJoern Engel 	return val;
805db53f3eSJoern Engel }
815db53f3eSJoern Engel #else
BTREE_FN(lookup)825db53f3eSJoern Engel static inline void *BTREE_FN(lookup)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
835db53f3eSJoern Engel {
845db53f3eSJoern Engel 	return btree_lookup(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key);
855db53f3eSJoern Engel }
865db53f3eSJoern Engel 
BTREE_FN(insert)875db53f3eSJoern Engel static inline int BTREE_FN(insert)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
885db53f3eSJoern Engel 			   void *val, gfp_t gfp)
895db53f3eSJoern Engel {
905db53f3eSJoern Engel 	return btree_insert(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key,
915db53f3eSJoern Engel 			    val, gfp);
925db53f3eSJoern Engel }
935db53f3eSJoern Engel 
BTREE_FN(update)945db53f3eSJoern Engel static inline int BTREE_FN(update)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key,
955db53f3eSJoern Engel 		void *val)
965db53f3eSJoern Engel {
975db53f3eSJoern Engel 	return btree_update(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key, val);
985db53f3eSJoern Engel }
995db53f3eSJoern Engel 
BTREE_FN(remove)1005db53f3eSJoern Engel static inline void *BTREE_FN(remove)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE key)
1015db53f3eSJoern Engel {
1025db53f3eSJoern Engel 	return btree_remove(&head->h, BTREE_TYPE_GEO, (unsigned long *)&key);
1035db53f3eSJoern Engel }
1045db53f3eSJoern Engel 
BTREE_FN(last)1055db53f3eSJoern Engel static inline void *BTREE_FN(last)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
1065db53f3eSJoern Engel {
1075db53f3eSJoern Engel 	return btree_last(&head->h, BTREE_TYPE_GEO, (unsigned long *)key);
1085db53f3eSJoern Engel }
1095db53f3eSJoern Engel 
BTREE_FN(get_prev)1105db53f3eSJoern Engel static inline void *BTREE_FN(get_prev)(BTREE_TYPE_HEAD *head, BTREE_KEYTYPE *key)
1115db53f3eSJoern Engel {
1125db53f3eSJoern Engel 	return btree_get_prev(&head->h, BTREE_TYPE_GEO, (unsigned long *)key);
1135db53f3eSJoern Engel }
1145db53f3eSJoern Engel #endif
1155db53f3eSJoern Engel 
1165db53f3eSJoern Engel void VISITOR_FN(void *elem, unsigned long opaque, unsigned long *key,
1175db53f3eSJoern Engel 		size_t index, void *__func);
1185db53f3eSJoern Engel 
1195db53f3eSJoern Engel typedef void (*VISITOR_FN_T)(void *elem, unsigned long opaque,
1205db53f3eSJoern Engel 			     BTREE_KEYTYPE key, size_t index);
1215db53f3eSJoern Engel 
BTREE_FN(visitor)1225db53f3eSJoern Engel static inline size_t BTREE_FN(visitor)(BTREE_TYPE_HEAD *head,
1235db53f3eSJoern Engel 				       unsigned long opaque,
1245db53f3eSJoern Engel 				       VISITOR_FN_T func2)
1255db53f3eSJoern Engel {
1265db53f3eSJoern Engel 	return btree_visitor(&head->h, BTREE_TYPE_GEO, opaque,
1275db53f3eSJoern Engel 			     visitorl, func2);
1285db53f3eSJoern Engel }
1295db53f3eSJoern Engel 
BTREE_FN(grim_visitor)1305db53f3eSJoern Engel static inline size_t BTREE_FN(grim_visitor)(BTREE_TYPE_HEAD *head,
1315db53f3eSJoern Engel 					    unsigned long opaque,
1325db53f3eSJoern Engel 					    VISITOR_FN_T func2)
1335db53f3eSJoern Engel {
1345db53f3eSJoern Engel 	return btree_grim_visitor(&head->h, BTREE_TYPE_GEO, opaque,
1355db53f3eSJoern Engel 				  visitorl, func2);
1365db53f3eSJoern Engel }
1375db53f3eSJoern Engel 
1385db53f3eSJoern Engel #undef VISITOR_FN
1395db53f3eSJoern Engel #undef VISITOR_FN_T
1405db53f3eSJoern Engel #undef __BTREE_TP
1415db53f3eSJoern Engel #undef _BTREE_TP
1425db53f3eSJoern Engel #undef BTREE_TP
1435db53f3eSJoern Engel #undef BTREE_FN
1445db53f3eSJoern Engel #undef BTREE_TYPE_HEAD
1455db53f3eSJoern Engel #undef BTREE_TYPE_SUFFIX
1465db53f3eSJoern Engel #undef BTREE_TYPE_GEO
1475db53f3eSJoern Engel #undef BTREE_KEYTYPE
1485db53f3eSJoern Engel #undef BTREE_TYPE_BITS
149