1 /*******************************************************************
2 uLan Utilities Library - C library of basic reusable constructions
4 ul_uniqid.h - unique ID generator
6 (C) Copyright 2003-2004 by Pavel Pisa - Originator
8 The uLan utilities library can be used, copied and modified under
10 - GPL - GNU General Public License
11 - LGPL - GNU Lesser General Public License
12 - MPL - Mozilla Public License
13 - and other licenses added by project originators
14 Code can be modified and re-distributed under any combination
15 of the above listed licenses. If contributor does not agree with
16 some of the licenses, he/she can delete appropriate line.
17 Warning, if you delete all lines, you are not allowed to
18 distribute source code and/or binaries utilizing code.
20 See files COPYING and README for details.
22 *******************************************************************/
27 #include "ul_gavlflesint.h"
28 #include "ul_uniqid.h"
29 #include "ul_utmalloc.h"
31 typedef struct ul_uniqid_pool_item {
33 ul_uniqid_range_t range;
34 } ul_uniqid_pool_item_t;
37 ul_uniqid_pool_cmp_fnc( const ul_uniqid_range_t *a, const ul_uniqid_range_t *b)
39 if (a->first>b->last) return 1;
40 if (a->last<b->first) return -1;
44 GAVL_FLES_INT_DEC(ul_uniqid_pool, ul_uniqid_pool_t, ul_uniqid_pool_item_t, ul_uniqid_range_t,
45 items, node, range, ul_uniqid_pool_cmp_fnc)
48 GAVL_FLES_INT_IMP(ul_uniqid_pool, ul_uniqid_pool_t, ul_uniqid_pool_item_t, ul_uniqid_range_t,
49 items, node, range, ul_uniqid_pool_cmp_fnc, GAVL_FANY, , , )
52 int ul_uniqid_pool_init(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last)
54 ul_uniqid_pool_item_t *item;
56 ul_uniqid_pool_init_root_field(pool);
61 pool->range.first=first;
62 pool->range.last=last;
64 item=malloc(sizeof(ul_uniqid_pool_item_t));
67 item->range=pool->range;
69 ul_uniqid_pool_insert(pool, item);
74 int ul_uniqid_pool_done(ul_uniqid_pool_t *pool)
76 ul_uniqid_pool_item_t *item;
78 gavl_cust_for_each_cut(ul_uniqid_pool, pool, item){
85 int ul_uniqid_pool_reserve(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last)
87 ul_uniqid_range_t range;
89 ul_uniqid_pool_item_t *item;
94 if(range.first>range.last)
97 item=ul_uniqid_pool_find(pool, &range);
101 if(range.first<item->range.first)
104 if(range.last>item->range.last)
107 if(range.first==item->range.first){
108 if(range.last==item->range.last){
109 ul_uniqid_pool_delete(pool, item);
111 item->range.first=range.last+1;
114 idsave=item->range.last;
115 item->range.last=range.first-1;
116 if(range.last!=idsave){
117 item=malloc(sizeof(ul_uniqid_pool_item_t));
120 item->range.last=idsave;
121 item->range.first=range.last+1;
122 ul_uniqid_pool_insert(pool, item);
130 int ul_uniqid_pool_release(ul_uniqid_pool_t *pool, ul_uniqid_t first, ul_uniqid_t last)
132 ul_uniqid_pool_item_t *post, *prev;
133 ul_uniqid_range_t range;
137 post=ul_uniqid_pool_find_after(pool,&range);
140 prev=ul_uniqid_pool_prev(pool,post);
141 if(post->range.first!=range.last+1)
144 post->range.first=range.first;
146 prev=ul_uniqid_pool_last(pool);
150 if(prev->range.last!=range.first-1)
154 post->range.first=prev->range.first;
155 ul_uniqid_pool_delete(pool, prev);
157 prev->range.last=range.last;
163 post=malloc(sizeof(ul_uniqid_pool_item_t));
167 ul_uniqid_pool_insert(pool, post);
172 int ul_uniqid_pool_alloc_one(ul_uniqid_pool_t *pool, ul_uniqid_t *ptrid)
175 ul_uniqid_pool_item_t *item;
177 item=ul_uniqid_pool_first(pool);
179 id=item->range.first;
180 if(item->range.first!=item->range.last){
181 item->range.first=id+1;
183 ul_uniqid_pool_delete(pool, item);
190 int ul_uniqid_pool_alloc_one_after(ul_uniqid_pool_t *pool, ul_uniqid_t *ptrid, ul_uniqid_t afterid)
193 ul_uniqid_pool_item_t *item;
195 if((afterid>=pool->range.last)||
196 (afterid<=pool->range.first)){
199 ul_uniqid_range_t range;
200 range.first=range.last=afterid;
201 item=ul_uniqid_pool_find_after(pool,&range);
205 item=ul_uniqid_pool_first(pool);
210 id=item->range.first;
211 if(item->range.first!=item->range.last){
212 item->range.first=id+1;
214 ul_uniqid_pool_delete(pool, item);
222 int ul_uniqid_pool_free_one(ul_uniqid_pool_t *pool, ul_uniqid_t id)
224 return ul_uniqid_pool_release(pool, id, id);