/* silctree_i.h Author: Pekka Riikonen Copyright (C) 2008 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ #ifndef SILCTREE_I_H #define SILCTREE_I_H #ifndef SILCTREE_H #error "Do not include this header directly" #endif /* Tree operatins header */ struct SilcTreeOpsStruct { SilcBool (*add)(SilcTree *tree, void *entry); SilcBool (*del)(SilcTree *tree, void *entry); void *(*find)(SilcTree *tree, void *entry, SilcTreeCompare compare, void *context); }; /* Generic tree header, present in each entry in tree */ struct SilcTreeHeaderStruct { struct SilcTreeHeaderStruct *parent; struct SilcTreeHeaderStruct *left; struct SilcTreeHeaderStruct *right; struct SilcTreeHeaderStruct *dup; SilcInt16 t; unsigned int duplicate : 1; }; /* Tree context */ struct SilcTreeStruct { const struct SilcTreeOpsStruct *ops; SilcTreeHeader *root; SilcTreeCompare compare; void *context; SilcUInt32 count; unsigned int offset : 31; unsigned int duplicates : 1; }; /* Get tree header from entry */ #define SILC_TREE_GET_HEADER(tree, pos) \ ((void *)((unsigned char *)(pos) + tree->offset)) /* Get entry from tree header */ #define SILC_TREE_GET_ENTRY(tree, pos) \ ((void *)((unsigned char *)(pos) - tree->offset)) #endif /* SILCTREE_I_H */