12 extern inline void LockUIntMapRead(UIntMap
*map
);
13 extern inline void UnlockUIntMapRead(UIntMap
*map
);
14 extern inline void LockUIntMapWrite(UIntMap
*map
);
15 extern inline void UnlockUIntMapWrite(UIntMap
*map
);
18 void InitUIntMap(UIntMap
*map
, ALsizei limit
)
24 RWLockInit(&map
->lock
);
27 void ResetUIntMap(UIntMap
*map
)
29 WriteLock(&map
->lock
);
34 WriteUnlock(&map
->lock
);
37 ALenum
InsertUIntMapEntry(UIntMap
*map
, ALuint key
, ALvoid
*value
)
41 WriteLock(&map
->lock
);
45 ALsizei high
= map
->size
- 1;
48 ALsizei mid
= low
+ (high
-low
)/2;
49 if(map
->array
[mid
].key
< key
)
54 if(map
->array
[low
].key
< key
)
59 if(pos
== map
->size
|| map
->array
[pos
].key
!= key
)
61 if(map
->size
== map
->limit
)
63 WriteUnlock(&map
->lock
);
64 return AL_OUT_OF_MEMORY
;
67 if(map
->size
== map
->capacity
)
72 newsize
= (map
->capacity
? (map
->capacity
<<1) : 4);
73 if(map
->limit
> 0 && newsize
> map
->limit
)
75 if(newsize
> map
->capacity
)
76 temp
= al_malloc(16, newsize
* sizeof(map
->array
[0]));
79 WriteUnlock(&map
->lock
);
80 return AL_OUT_OF_MEMORY
;
84 memcpy(temp
, map
->array
, map
->size
*sizeof(map
->array
[0]));
87 map
->capacity
= newsize
;
91 memmove(&map
->array
[pos
+1], &map
->array
[pos
],
92 (map
->size
-pos
)*sizeof(map
->array
[0]));
95 map
->array
[pos
].key
= key
;
96 map
->array
[pos
].value
= value
;
97 WriteUnlock(&map
->lock
);
102 ALvoid
*RemoveUIntMapKey(UIntMap
*map
, ALuint key
)
105 WriteLock(&map
->lock
);
109 ALsizei high
= map
->size
- 1;
112 ALsizei mid
= low
+ (high
-low
)/2;
113 if(map
->array
[mid
].key
< key
)
118 if(map
->array
[low
].key
== key
)
120 ptr
= map
->array
[low
].value
;
121 if(low
< map
->size
-1)
122 memmove(&map
->array
[low
], &map
->array
[low
+1],
123 (map
->size
-1-low
)*sizeof(map
->array
[0]));
127 WriteUnlock(&map
->lock
);
131 ALvoid
*RemoveUIntMapKeyNoLock(UIntMap
*map
, ALuint key
)
136 ALsizei high
= map
->size
- 1;
139 ALsizei mid
= low
+ (high
-low
)/2;
140 if(map
->array
[mid
].key
< key
)
145 if(map
->array
[low
].key
== key
)
147 ALvoid
*ptr
= map
->array
[low
].value
;
148 if(low
< map
->size
-1)
149 memmove(&map
->array
[low
], &map
->array
[low
+1],
150 (map
->size
-1-low
)*sizeof(map
->array
[0]));
158 ALvoid
*LookupUIntMapKey(UIntMap
*map
, ALuint key
)
161 ReadLock(&map
->lock
);
165 ALsizei high
= map
->size
- 1;
168 ALsizei mid
= low
+ (high
-low
)/2;
169 if(map
->array
[mid
].key
< key
)
174 if(map
->array
[low
].key
== key
)
175 ptr
= map
->array
[low
].value
;
177 ReadUnlock(&map
->lock
);
181 ALvoid
*LookupUIntMapKeyNoLock(UIntMap
*map
, ALuint key
)
186 ALsizei high
= map
->size
- 1;
189 ALsizei mid
= low
+ (high
-low
)/2;
190 if(map
->array
[mid
].key
< key
)
195 if(map
->array
[low
].key
== key
)
196 return map
->array
[low
].value
;