xref: /titanic_54/usr/src/uts/common/sys/group.h (revision fb2f18f820d90b001aea4fb27dd654bc1263c440)
1*fb2f18f8Sesaxe /*
2*fb2f18f8Sesaxe  * CDDL HEADER START
3*fb2f18f8Sesaxe  *
4*fb2f18f8Sesaxe  * The contents of this file are subject to the terms of the
5*fb2f18f8Sesaxe  * Common Development and Distribution License (the "License").
6*fb2f18f8Sesaxe  * You may not use this file except in compliance with the License.
7*fb2f18f8Sesaxe  *
8*fb2f18f8Sesaxe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*fb2f18f8Sesaxe  * or http://www.opensolaris.org/os/licensing.
10*fb2f18f8Sesaxe  * See the License for the specific language governing permissions
11*fb2f18f8Sesaxe  * and limitations under the License.
12*fb2f18f8Sesaxe  *
13*fb2f18f8Sesaxe  * When distributing Covered Code, include this CDDL HEADER in each
14*fb2f18f8Sesaxe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*fb2f18f8Sesaxe  * If applicable, add the following below this CDDL HEADER, with the
16*fb2f18f8Sesaxe  * fields enclosed by brackets "[]" replaced with your own identifying
17*fb2f18f8Sesaxe  * information: Portions Copyright [yyyy] [name of copyright owner]
18*fb2f18f8Sesaxe  *
19*fb2f18f8Sesaxe  * CDDL HEADER END
20*fb2f18f8Sesaxe  */
21*fb2f18f8Sesaxe /*
22*fb2f18f8Sesaxe  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23*fb2f18f8Sesaxe  * Use is subject to license terms.
24*fb2f18f8Sesaxe  */
25*fb2f18f8Sesaxe 
26*fb2f18f8Sesaxe #ifndef	_GROUP_H
27*fb2f18f8Sesaxe #define	_GROUP_H
28*fb2f18f8Sesaxe 
29*fb2f18f8Sesaxe #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*fb2f18f8Sesaxe 
31*fb2f18f8Sesaxe /*
32*fb2f18f8Sesaxe  * Group Abstraction
33*fb2f18f8Sesaxe  */
34*fb2f18f8Sesaxe 
35*fb2f18f8Sesaxe #ifdef	__cplusplus
36*fb2f18f8Sesaxe extern "C" {
37*fb2f18f8Sesaxe #endif
38*fb2f18f8Sesaxe 
39*fb2f18f8Sesaxe #if (defined(_KERNEL) || defined(_KMEMUSER))
40*fb2f18f8Sesaxe #include <sys/types.h>
41*fb2f18f8Sesaxe 
42*fb2f18f8Sesaxe #define	GRP_RESIZE	0x1	/* Resize group capacity if needed */
43*fb2f18f8Sesaxe #define	GRP_NORESIZE	0x2	/* Do not resize group capacity; may fail */
44*fb2f18f8Sesaxe 
45*fb2f18f8Sesaxe /*
46*fb2f18f8Sesaxe  * group structure
47*fb2f18f8Sesaxe  */
48*fb2f18f8Sesaxe typedef struct group {
49*fb2f18f8Sesaxe 	uint_t		grp_size;	/* # of elements */
50*fb2f18f8Sesaxe 	uint_t		grp_capacity;	/* current group capacity */
51*fb2f18f8Sesaxe 	void		**grp_set;	/* element vector */
52*fb2f18f8Sesaxe } group_t;
53*fb2f18f8Sesaxe 
54*fb2f18f8Sesaxe typedef uint_t group_iter_t;
55*fb2f18f8Sesaxe 
56*fb2f18f8Sesaxe 
57*fb2f18f8Sesaxe /*
58*fb2f18f8Sesaxe  * Return the number of elements in the group
59*fb2f18f8Sesaxe  */
60*fb2f18f8Sesaxe #define	GROUP_SIZE(grp)			((grp)->grp_size)
61*fb2f18f8Sesaxe 
62*fb2f18f8Sesaxe /*
63*fb2f18f8Sesaxe  * Access the element at the specified group index
64*fb2f18f8Sesaxe  */
65*fb2f18f8Sesaxe #define	GROUP_ACCESS(grp, index)	((grp)->grp_set[index])
66*fb2f18f8Sesaxe 
67*fb2f18f8Sesaxe /*
68*fb2f18f8Sesaxe  * Group creation / destruction
69*fb2f18f8Sesaxe  */
70*fb2f18f8Sesaxe void		group_create(group_t *);
71*fb2f18f8Sesaxe void		group_destroy(group_t *);
72*fb2f18f8Sesaxe 
73*fb2f18f8Sesaxe /*
74*fb2f18f8Sesaxe  * Expand a group's holding capacity
75*fb2f18f8Sesaxe  */
76*fb2f18f8Sesaxe void		group_expand(group_t *, uint_t);
77*fb2f18f8Sesaxe 
78*fb2f18f8Sesaxe /*
79*fb2f18f8Sesaxe  * Group element iteration
80*fb2f18f8Sesaxe  */
81*fb2f18f8Sesaxe void		group_iter_init(group_iter_t *);
82*fb2f18f8Sesaxe void		*group_iterate(group_t *, uint_t *);
83*fb2f18f8Sesaxe 
84*fb2f18f8Sesaxe /*
85*fb2f18f8Sesaxe  * Add / remove an element from the group
86*fb2f18f8Sesaxe  */
87*fb2f18f8Sesaxe int		group_add(group_t *, void *, int);
88*fb2f18f8Sesaxe int		group_remove(group_t *, void *, int);
89*fb2f18f8Sesaxe 
90*fb2f18f8Sesaxe /*
91*fb2f18f8Sesaxe  * Add / remove / access an element at a specified index.
92*fb2f18f8Sesaxe  * The group must already have sufficient capacity to hold
93*fb2f18f8Sesaxe  * an element at the specified index.
94*fb2f18f8Sesaxe  */
95*fb2f18f8Sesaxe int		group_add_at(group_t *, void *, uint_t);
96*fb2f18f8Sesaxe void		group_remove_at(group_t *, uint_t);
97*fb2f18f8Sesaxe 
98*fb2f18f8Sesaxe #endif	/* !_KERNEL && !_KMEMUSER */
99*fb2f18f8Sesaxe 
100*fb2f18f8Sesaxe #ifdef	__cplusplus
101*fb2f18f8Sesaxe }
102*fb2f18f8Sesaxe #endif
103*fb2f18f8Sesaxe 
104*fb2f18f8Sesaxe #endif /* _GROUP_H */
105