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