Blame view

include/linux/assoc_array.h 2.88 KB
b4d0d230c   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-or-later */
3cb989501   David Howells   Add a generic ass...
2
3
  /* Generic associative array implementation.
   *
5fb94e9ca   Mauro Carvalho Chehab   docs: Fix some br...
4
   * See Documentation/core-api/assoc_array.rst for information.
3cb989501   David Howells   Add a generic ass...
5
6
7
   *
   * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
3cb989501   David Howells   Add a generic ass...
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   */
  
  #ifndef _LINUX_ASSOC_ARRAY_H
  #define _LINUX_ASSOC_ARRAY_H
  
  #ifdef CONFIG_ASSOCIATIVE_ARRAY
  
  #include <linux/types.h>
  
  #define ASSOC_ARRAY_KEY_CHUNK_SIZE BITS_PER_LONG /* Key data retrieved in chunks of this size */
  
  /*
   * Generic associative array.
   */
  struct assoc_array {
  	struct assoc_array_ptr	*root;		/* The node at the root of the tree */
  	unsigned long		nr_leaves_on_tree;
  };
  
  /*
   * Operations on objects and index keys for use by array manipulation routines.
   */
  struct assoc_array_ops {
  	/* Method to get a chunk of an index key from caller-supplied data */
  	unsigned long (*get_key_chunk)(const void *index_key, int level);
  
  	/* Method to get a piece of an object's index key */
  	unsigned long (*get_object_key_chunk)(const void *object, int level);
  
  	/* Is this the object we're looking for? */
  	bool (*compare_object)(const void *object, const void *index_key);
23fd78d76   David Howells   KEYS: Fix multipl...
39
40
  	/* How different is an object from an index key, to a bit position in
  	 * their keys? (or -1 if they're the same)
3cb989501   David Howells   Add a generic ass...
41
  	 */
23fd78d76   David Howells   KEYS: Fix multipl...
42
  	int (*diff_objects)(const void *object, const void *index_key);
3cb989501   David Howells   Add a generic ass...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  
  	/* Method to free an object. */
  	void (*free_object)(void *object);
  };
  
  /*
   * Access and manipulation functions.
   */
  struct assoc_array_edit;
  
  static inline void assoc_array_init(struct assoc_array *array)
  {
  	array->root = NULL;
  	array->nr_leaves_on_tree = 0;
  }
  
  extern int assoc_array_iterate(const struct assoc_array *array,
  			       int (*iterator)(const void *object,
  					       void *iterator_data),
  			       void *iterator_data);
  extern void *assoc_array_find(const struct assoc_array *array,
  			      const struct assoc_array_ops *ops,
  			      const void *index_key);
  extern void assoc_array_destroy(struct assoc_array *array,
  				const struct assoc_array_ops *ops);
  extern struct assoc_array_edit *assoc_array_insert(struct assoc_array *array,
  						   const struct assoc_array_ops *ops,
  						   const void *index_key,
  						   void *object);
  extern void assoc_array_insert_set_object(struct assoc_array_edit *edit,
  					  void *object);
  extern struct assoc_array_edit *assoc_array_delete(struct assoc_array *array,
  						   const struct assoc_array_ops *ops,
  						   const void *index_key);
  extern struct assoc_array_edit *assoc_array_clear(struct assoc_array *array,
  						  const struct assoc_array_ops *ops);
  extern void assoc_array_apply_edit(struct assoc_array_edit *edit);
  extern void assoc_array_cancel_edit(struct assoc_array_edit *edit);
  extern int assoc_array_gc(struct assoc_array *array,
  			  const struct assoc_array_ops *ops,
  			  bool (*iterator)(void *object, void *iterator_data),
  			  void *iterator_data);
  
  #endif /* CONFIG_ASSOCIATIVE_ARRAY */
  #endif /* _LINUX_ASSOC_ARRAY_H */