00001 #ifndef CTL_IMULTISET_H
00002 #define CTL_IMULTISET_H
00003
00015 #ifndef CTL_TREE_H
00016 #include "ctl/tree.h"
00017 #endif
00018
00026 #define ctl_imultiset(type,mlabel,compare) ctl_tree(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple)
00027
00034 #define ctl_imultiset_decllink(type,mlabel)\
00035 ctlt_node_type(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple) mlabel
00036
00044 #define ctl_imultiset_initlink(type,mlabel, curr) ctl_tree_node_init(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, &curr->mlabel)
00045
00055 #define ctl_imultiset_auto(type,mlabel,compare, ilabel)\
00056 ctl_tree_auto(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, compare, ilabel )
00057
00066 #define ctl_imultiset_init(type,mlabel,compare, ilabel)\
00067 ctl_tree_init(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, compare, ilabel )
00068
00076 #define ctl_imultiset_size(type,mlabel, ilabel) ctl_tree_size(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, ilabel )
00077
00087 #define ctl_imultiset_insert(type,mlabel, ilabel, data) (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, insert)( (ilabel), (data) )
00088
00098 #define ctl_imultiset_find(type,mlabel, ilabel, value) (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, find)( (ilabel), (value) )
00099
00109 #define ctl_imultiset_remove(type,mlabel, ilabel, value) (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, remove)( (ilabel), (value) )
00110
00120 #define ctl_imultiset_unlink(type,mlabel, ilabel, data) (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, unlink)( (ilabel), (data) )
00121
00129 #define ctl_imultiset_reset(type,mlabel, ilabel) ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, reset)( ilabel )
00130
00138 #define ctl_imultiset_front(type,mlabel, ilabel) ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, front)( ilabel )
00139
00147 #define ctl_imultiset_back(type,mlabel, ilabel) ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, back)( ilabel )
00148
00156 #define ctl_imultiset_pop_front(type,mlabel, ilabel) ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, pop_front)( ilabel )
00157
00165 #define ctl_imultiset_pop_back(type,mlabel, ilabel) ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, pop_back)( ilabel )
00166
00176 #define ctl_imultiset_foreach(type,mlabel, ilabel, label ) \
00177 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00178 type* label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_begin)( &ppConcat(stack_,label), (ilabel) );\
00179 for ( ; label; label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_next)( &ppConcat(stack_,label) ) )
00180
00190 #define ctl_imultiset_foreach_const(type,mlabel, ilabel, label ) \
00191 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00192 const type* label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_begin)( &ppConcat(stack_,label), (ilabel) );\
00193 for ( ; label; label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_next)( &ppConcat(stack_,label) ) )
00194
00204 #define ctl_imultiset_foreach_reverse(type,mlabel, ilabel, label ) \
00205 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00206 type* label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_rbegin)( &ppConcat(stack_,label), (ilabel) );\
00207 for ( ; label; label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_prev)( &ppConcat(stack_,label) ) )
00208
00218 #define ctl_imultiset_foreach_reverse_const(type,mlabel, ilabel, label ) \
00219 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00220 const type* label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_rbegin)( &ppConcat(stack_,label), (ilabel) );\
00221 for ( ; label; label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_prev)( &ppConcat(stack_,label) ) )
00222
00232 #define ctl_imultiset_from(type,mlabel, ilabel, from, label )\
00233 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00234 type* label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_begin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00235 for ( ; label; label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_next)( &ppConcat(stack_,label) ) )
00236
00239 #define ctl_imultiset_from_const(type,mlabel, ilabel, from, label )\
00240 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00241 const type* label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_begin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00242 for ( ; label; label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_next)( &ppConcat(stack_,label) ) )
00243
00246 #define ctl_imultiset_from_reverse(type,mlabel, ilabel, from, label )\
00247 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00248 type* label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_rbegin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00249 for ( ; label; label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_prev)( &ppConcat(stack_,label) ) )
00250
00253 #define ctl_imultiset_from_reverse_const(type,mlabel, ilabel, from, label )\
00254 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00255 const type* label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_rbegin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00256 for ( ; label; label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_prev)( &ppConcat(stack_,label) ) )
00257
00270 #define ctl_imultiset_from_to(type,mlabel, ilabel, from, to, label )\
00271 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00272 type* label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_begin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00273 for( ; label && (ilabel)->compare(label,(to)) < 0; label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_next)( &ppConcat(stack_,label) ) )
00274
00277 #define ctl_imultiset_from_to_const(type,mlabel, ilabel, from, to, label )\
00278 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00279 const type* label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_begin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00280 for( ; label && (ilabel)->compare(label,(to)) < 0; label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_next)( &ppConcat(stack_,label) ) )
00281
00284 #define ctl_imultiset_from_to_reverse(type,mlabel, ilabel, from, to, label )\
00285 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00286 type* label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_rbegin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00287 for( ; label && (ilabel)->compare(label,(to)) > 0; label = (type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_prev)( &ppConcat(stack_,label) ) )
00288
00291 #define ctl_imultiset_from_to_reverse_const(type,mlabel, ilabel, from, to, label )\
00292 ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator ) ppConcat(stack_,label);\
00293 const type* label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_rbegin_from)( &ppConcat(stack_,label), (ilabel), (from) );\
00294 for( ; label && (ilabel)->compare(label,(to)) > 0; label = (const type*)ctl_tree_(ctlt_relative(offsetof(type,mlabel)),ctlt_multiple, iterator_prev)( &ppConcat(stack_,label) ) )
00295
00296 #endif
00297
00298