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