VirtualBox

source: vbox/trunk/include/iprt/table.h@ 8163

Last change on this file since 8163 was 8163, checked in by vboxsync, 17 years ago

rebrand IPRT

  • Property eol-style set to native
File size: 23.6 KB
Line 
1/** @file
2 * Incredibly Portable Runtime - Abstract Table/Trees.
3 */
4
5/*
6 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 *
25 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
26 * Clara, CA 95054 USA or visit http://www.sun.com if you need
27 * additional information or have any questions.
28 */
29
30#ifndef ___iprt_table_h
31#define ___iprt_table_h
32
33#include <iprt/types.h>
34
35/** @defgroup grp_rt_tab RTTab - Generic Tree and Table Interface.
36 * @ingroup grp_rt
37 * @{
38 */
39
40__BEGIN_DECLS
41
42/** Pointer to an allocator. */
43typedef struct RTTABALLOCATOR *PRTTABALLOCATOR;
44
45/**
46 * Allocates memory.
47 *
48 * @returns Pointer to the allocated memory.
49 * @returns NULL on failure. (don't throw!)
50 * @param pAllocator The allocator structure.
51 * @param cb The number of bytes to allocate. (Never 0.)
52 */
53typedef DECLCALLBACK(void *) FNRTTABALLOC(PRTTABALLOCATOR pAllocator, size_t cb);
54/** Pointer to a FNRTTABALLOC() function. */
55typedef FNRTTABALLOC *PFNRTTABALLOC;
56
57/**
58 * Frees memory.
59 *
60 * @param pAllocator The allocator structure.
61 * @param pv The memory to free. (can be NULL)
62 */
63typedef DECLCALLBACK(void *) FNRTTABFREE(PRTTABALLOCATOR pAllocator, void *pv);
64/** Pointer to a FNRTTABFREE() function. */
65typedef FNRTTABFREE *PFNRTTABFREE;
66
67/**
68 * The allocator structure.
69 * (Hint: use this as like 'base class' for your custom allocators.)
70 */
71typedef struct RTTABALLOCATOR
72{
73 /** The allocation function. */
74 PFNRTTABALLOC pfnAlloc;
75 /** The free function. */
76 PFNRTTABFREE pfnFree;
77} RTTABALLOCATOR;
78
79/**
80 * Gets the default allocator.
81 *
82 * @returns Pointer to the default allocator.
83 */
84RTDECL(RTTABALLOCATOR) RTTabDefaultAllocator(void);
85
86
87/**
88 * Compares two table items.
89 *
90 * @returns 0 if equal
91 * @returns <0 if pvItem1 is less than pvItem2 (pvItem2 is then greater than pvItem1).
92 * @returns >0 if pvItem1 is less than pvItem2 (pvItem1 is then greater than pvItem2).
93 *
94 * @param pvItem1 The first item.
95 * @param pvItem2 The second item.
96 * @param pvUser The user argument.
97 */
98typedef DECLCALLBACK(int) FNRTTABCOMP(const void *pvItem1, const void *pvItem2, void *pvUser);
99/** Pointer to a FNRTTABCOMP() function. */
100typedef FNRTTABCOMP *PFNRTTABCOMP;
101
102/**
103 * Duplicates a table item.
104 * This is used when duplicating or copying a table.
105 *
106 * @returns Pointer to the copy.
107 * @returns NULL on failure.
108 *
109 * @param pvItem The item to copy.
110 * @param pvUser The user argument.
111 */
112typedef DECLCALLBACK(void *) FNRTTABDUPLICATE(const void *pvItem, void *pvUser);
113/** Pointer to a FNRTTABDUPLICATE() function. */
114typedef FNRTTABDUPLICATE *PFNRTTABDUPLICATE;
115
116/**
117 * Callback function for doing something with an item.
118 *
119 * What exactly we're doing is specific to the context of the call.
120 *
121 * @param pvItem The item.
122 * @param pvUser The user argument.
123 */
124typedef DECLCALLBACK(void) FNRTTABCALLBACK(const void *pvItem, void *pvUser);
125/** Pointer to a FNRTTABCALLBACK() function. */
126typedef FNRTTABCALLBACK *PFNRTTABCALLBACK;
127
128
129/** Pointer to const table operations. */
130typedef const struct RTTABOPS *PCRTTABOPS;
131/** Pointer to a table. */
132typedef struct RTTAB *PRTTAB;
133/** Pointer to a const table. */
134typedef const struct RTTAB *PCRTTAB;
135/** Pointer to a traverser. */
136typedef struct RTTABTRAVERSER *PRTTABTRAVERSER;
137/** Pointer to a const traverser. */
138typedef const struct RTTABTRAVERSER *PCRTTABTRAVERSER;
139/** Pointer to a traverser core. */
140typedef struct RTTABTRAVERSERCORE *PRTTABTRAVERSERCORE;
141/** Pointer to a const traverser core. */
142typedef const struct RTTABTRAVERSERCORE *PCRTTABTRAVERSERCORE;
143
144
145/**
146 * Table operations.
147 */
148typedef struct RTTABOPS
149{
150 /**
151 * Create a table.
152 *
153 * @returns Pointer to the new table.
154 * @returns NULL if we're out of memory or some other resource.
155 * @param pOps The table operations.
156 * @param fCreateFlags The table type specific creation flags.
157 * @param pAllocator Custom allocator. Pass NULL for the default allocator.
158 * @param pfnComp The comparision function.
159 */
160 DECLCALLBACKMEMBER(PRTTAB, pfnCreate)(PCRTTABOPS pOps, unsigned fCreateFlags, PRTTABALLOCATOR pAllocator, PFNRTTABCOMP pfnComp);
161
162 /**
163 * Duplicates a table to a table of the same type.
164 *
165 * @returns Pointer to the new table.
166 * @returns NULL if we're out of memory or some other resource.
167 * @param pTab The table to duplicate.
168 * @param pfnDuplicate Pointer to the item duplication function. If NULL the new table will
169 * be referencing the same data as the old one.
170 * @param pfnNewCB Callback which is called for all the items in the new table. Optional.
171 * @param pAllocator Custom allocator. Pass NULL to use the same allocator as pTab.
172 */
173 DECLCALLBACKMEMBER(PRTTAB, pfnDuplicate)(PCRTTAB pTab, PFNRTTABDUPLICATE pfnDuplicate, PFNRTTABCALLBACK pfnNewCB, PRTTABALLOCATOR pAllocator);
174
175 /**
176 * Destroys a table.
177 *
178 * @param pTab The table to destroy.
179 */
180 DECLCALLBACKMEMBER(void, pfnDestroy)(PRTTAB pTab);
181
182 /**
183 * Inserts an item into the table, if a matching item is encountered
184 * the pointer to the pointer to it will be returned.
185 *
186 * @returns Pointer to the item pointer in the table.
187 * This can be used to replace existing items (don't break anything, dude).
188 * @returns NULL if we failed to allocate memory for the new node.
189 * @param pTab The table.
190 * @param pvItem The item which will be inserted if an matching item was not found in the table.
191 */
192 DECLCALLBACKMEMBER(void **, pfnProbe)(PRTTAB pTab, void *pvItem);
193
194 /**
195 * Inserts an item into the table, fail if a matching item exists.
196 *
197 * @returns NULL on success and allocation failure.
198 * @returns Pointer to the matching item.
199 * @param pTab The table.
200 * @param pvItem The item which is to be inserted.
201 */
202 DECLCALLBACKMEMBER(void *, pfnInsert)(PRTTAB pTab, void *pvItem);
203
204 /**
205 * Inserts an item into the table, if a matching item is encountered
206 * it will be replaced and returned.
207 *
208 * @returns NULL if inserted and allocation failure.
209 * @returns Pointer to the replaced item.
210 * @param pTab The table.
211 * @param pvItem The item which is to be inserted.
212 */
213 DECLCALLBACKMEMBER(void *, pfnReplace)(PRTTAB pTab, void *pvItem);
214
215 /**
216 * Removes an item from the table if found.
217 *
218 * @returns Pointer to the removed item.
219 * @returns NULL if no item matched pvItem.
220 * @param pTab The table.
221 * @param pvItem The item which is to be inserted.
222 */
223 DECLCALLBACKMEMBER(void *, pfnRemove)(PRTTAB pTab, const void *pvItem);
224
225 /**
226 * Finds an item in the table.
227 *
228 * @returns Pointer to the item it found.
229 * @returns NULL if no item matched pvItem.
230 * @param pTab The table.
231 * @param pvItem The item which is to be inserted.
232 */
233 DECLCALLBACKMEMBER(void *, pfnFind)(PRTTAB pTab, const void *pvItem);
234
235 /**
236 * Initializes a traverser to the NULL item.
237 *
238 * The NULL item is an imaginary table item before the first and after
239 * the last items in the table.
240 *
241 * @returns Pointer to the traverser positioned at the NULL item.
242 * @returns NULL on failure to allocate the traverser.
243 *
244 * @param pTab The table.
245 * @param pTravNew Pointer to a preallocated structure. Optional.
246 */
247 DECLCALLBACKMEMBER(PRTTABTRAVERSERCORE, pfnTravInit)(PRTTAB pTab, PRTTABTRAVERSER pTravNew);
248
249 /**
250 * Initializes a traverser to the first item in the table.
251 *
252 * If the table is empty, the traverser will be positioned at the NULL item
253 * like with RTTabTravInit().
254 *
255 * @returns Pointer to the traverser positioned at the first item or NULL item.
256 * @returns NULL on failure to allocate the traverser.
257 *
258 * @param pTab The table.
259 * @param pTravNew Pointer to a preallocated structure. Optional.
260 */
261 DECLCALLBACKMEMBER(PRTTABTRAVERSERCORE, pfnTravFirst)(PRTTAB pTab, PRTTABTRAVERSER pTravNew);
262
263 /**
264 * Initializes a traverser to the last item in the table.
265 *
266 * If the table is empty, the traverser will be positioned at the NULL item
267 * like with RTTabTravInit().
268 *
269 * @returns Pointer to the traverser positioned at the last item or NULL item.
270 * @returns NULL on failure to allocate the traverser.
271 *
272 * @param pTab The table.
273 * @param pTravNew Pointer to a preallocated structure. Optional.
274 */
275 DECLCALLBACKMEMBER(PRTTABTRAVERSERCORE, pfnTravLast)(PRTTAB pTab, PRTTABTRAVERSER pTravNew);
276
277 /**
278 * Initializes a traverser to an item matching the given one.
279 *
280 * If the item isn't found, the traverser will be positioned at the NULL item
281 * like with RTTabTravInit().
282 *
283 * @returns Pointer to the traverser positioned at the matching item or NULL item.
284 * @returns NULL on failure to allocate the traverser.
285 *
286 * @param pTab The table.
287 * @param pTravNew Pointer to a preallocated structure. Optional.
288 * @param pvItem The item to find the match to.
289 */
290 DECLCALLBACKMEMBER(PRTTABTRAVERSERCORE, pfnTravFind)(PRTTAB pTab, PRTTABTRAVERSER pTravNew, const void *pvItem);
291
292 /**
293 * Initializes a traverser to the inserted item.
294 *
295 * If there already exists an item in the tree matching pvItem, the traverser
296 * is positioned at that item like with RTTabTravFind().
297 *
298 * If the insert operation failes because of an out of memory condition, the
299 * traverser will be positioned at the NULL item like with RTTabTravInit().
300 *
301 * @returns Pointer to the traverser positioned at the inserted, existing or NULL item.
302 * @returns NULL on failure to allocate the traverser.
303 *
304 * @param pTab The table.
305 * @param pTravNew Pointer to a preallocated structure. Optional.
306 * @param pvItem The item to be inserted.
307 */
308 DECLCALLBACKMEMBER(PRTTABTRAVERSERCORE, pfnTravInsert)(PRTTAB pTab, PRTTABTRAVERSER pTravNew, void *pvItem);
309
310 /**
311 * Duplicates a traverser.
312 *
313 * @returns The pointer to the duplicate.
314 * @returns NULL on allocation failure.
315 *
316 * @param pTrav The traverser to duplicate.
317 * @param pTravNew Pointer to a preallocated structure. Optional.
318 */
319 DECLCALLBACKMEMBER(PRTTABTRAVERSERCORE, pfnTravDuplicate)(PRTTABTRAVERSERCORE pTrav, PCRTTABTRAVERSER pTravNew);
320
321 /**
322 * Frees a traverser.
323 *
324 * This can safely be called even if the traverser structure
325 * wasn't dynamically allocated or the constructor failed.
326 *
327 * @param pTrav The traverser which is to be free.
328 */
329 DECLCALLBACKMEMBER(void, pfnTravFree)(PRTTABTRAVERSERCORE pTrav);
330
331 /**
332 * Gets the current item.
333 *
334 * @returns The current item. (NULL indicates the imaginary NULL item.)
335 * @param pTrav The traverser.
336 */
337 DECLCALLBACKMEMBER(void *, pfnTravCur)(PCRTTABTRAVERSERCORE pTrav);
338
339 /**
340 * Advances to the next item.
341 *
342 * @returns The new current item. (NULL indicates the imaginary NULL item.)
343 * @param pTrav The traverser.
344 */
345 DECLCALLBACKMEMBER(void *, pfnTravNext)(PRTTABTRAVERSERCORE pTrav);
346
347 /**
348 * Advances to the previous item.
349 *
350 * @returns The new current item. (NULL indicates the imaginary NULL item.)
351 * @param pTrav The traverser.
352 */
353 DECLCALLBACKMEMBER(void *, pfnTravPrev)(PRTTABTRAVERSERCORE pTrav);
354
355 /**
356 * Replaces the current item.
357 *
358 * This has the same restrictions as RTTabProbe(), e.g. it's not permitted to
359 * break the order of the table.
360 *
361 * @returns The replaced item.
362 * @returns NULL if the current item is the NULL item. The traverser
363 * and table remains unchanged.
364 * @param pTrav The traverser.
365 * @param pvItem The item to be inserted.
366 */
367 DECLCALLBACKMEMBER(void *, pfnTravReplace)(PRTTABTRAVERSERCORE pTrav, void *pvItem);
368
369 /** The type of table type. */
370 const char *pszType;
371} RTTABOPS;
372
373/**
374 * A table.
375 */
376typedef struct RTTAB
377{
378 /** The table operations. */
379 PCRTTABOPS pOps;
380 /** The function for comparing table items. */
381 PFNRTTABCOMP pfnComp;
382 /** The number of items in the table. */
383 RTUINT cItems;
384 /** The table generation number.
385 * This must be updated whenever the table changes. */
386 RTUINT idGeneration;
387} RTTAB;
388
389
390/**
391 * Create a table.
392 *
393 * @returns Pointer to the new table.
394 * @returns NULL if we're out of memory or some other resource.
395 * @param pOps The table operations.
396 * @param fCreateFlags The table type specific creation flags.
397 * @param pAllocator Custom allocator. Pass NULL for the default allocator.
398 * @param pfnComp The comparision function.
399 */
400DECLINLINE(PRTTAB) RTTabCreate(PCRTTABOPS pOps, unsigned fCreateFlags, PRTTABALLOCATOR pAllocator, PFNRTTABCOMP pfnComp)
401{
402 return pOps->pfnCreate(pOps, fCreateFlags, pAllocator, pfnComp);
403}
404
405/**
406 * Duplicates a table to a table of the same type.
407 *
408 * @returns Pointer to the new table.
409 * @returns NULL if we're out of memory or some other resource.
410 * @param pTab The table to duplicate.
411 * @param pfnDuplicate Pointer to the item duplication function. If NULL the new table will
412 * be referencing the same data as the old one.
413 * @param pfnNewCB Callback which is called for all the items in the new table. Optional.
414 * @param pAllocator Custom allocator. Pass NULL to use the same allocator as pTab.
415 */
416DECLINLINE(PRTTAB) RTTabDuplicate(PCRTTAB pTab, PFNRTTABDUPLICATE pfnDuplicate, PFNRTTABCALLBACK pfnNewCB, PRTTABALLOCATOR pAllocator)
417{
418 return pTab->pOps->pfnDuplicate(pTab, pfnDuplicate, pfnNewCB, pAllocator);
419}
420
421/**
422 * Destroys a table.
423 *
424 * @param pTab The table to destroy.
425 */
426DECLINLINE(void) RTTabDestroy(PRTTAB pTab)
427{
428 return pTab->pOps->pfnDestroy(pTab);
429}
430
431/**
432 * Count the item in the table.
433 *
434 * @returns Number of items in the table.
435 * @param pTab The table to count.
436 */
437DECLINLINE(RTUINT) RTTabCount(PRTTAB pTab)
438{
439 return pTab->cItems;
440}
441
442/**
443 * Inserts an item into the table, if a matching item is encountered
444 * the pointer to the pointer to it will be returned.
445 *
446 * @returns Pointer to the item pointer in the table.
447 * This can be used to replace existing items (don't break anything, dude).
448 * @returns NULL if we failed to allocate memory for the new node.
449 * @param pTab The table.
450 * @param pvItem The item which will be inserted if an matching item was not found in the table.
451 */
452DECLINLINE(void **) RTTabProbe(PRTTAB pTab, void *pvItem)
453{
454 return pTab->pOps->pfnProbe(pTab, pvItem);
455}
456
457/**
458 * Inserts an item into the table, fail if a matching item exists.
459 *
460 * @returns NULL on success and allocation failure.
461 * @returns Pointer to the matching item.
462 * @param pTab The table.
463 * @param pvItem The item which is to be inserted.
464 */
465DECLINLINE(void *) RTTabInsert(PRTTAB pTab, void *pvItem)
466{
467 return pTab->pOps->pfnInsert(pTab, pvItem);
468}
469
470/**
471 * Inserts an item into the table, if a matching item is encountered
472 * it will be replaced and returned.
473 *
474 * @returns NULL if inserted and allocation failure.
475 * @returns Pointer to the replaced item.
476 * @param pTab The table.
477 * @param pvItem The item which is to be inserted.
478 */
479DECLINLINE(void *) RTTabReplace(PRTTAB pTab, void *pvItem)
480{
481 return pTab->pOps->pfnReplace(pTab, pvItem);
482}
483
484/**
485 * Removes an item from the table if found.
486 *
487 * @returns Pointer to the removed item.
488 * @returns NULL if no item matched pvItem.
489 * @param pTab The table.
490 * @param pvItem The item which is to be inserted.
491 */
492DECLINLINE(void *) RTTabRemove(PRTTAB pTab, const void *pvItem)
493{
494 return pTab->pOps->pfnRemove(pTab, pvItem);
495}
496
497/**
498 * Finds an item in the table.
499 *
500 * @returns Pointer to the item it found.
501 * @returns NULL if no item matched pvItem.
502 * @param pTab The table.
503 * @param pvItem The item to find the match to.
504 */
505DECLINLINE(void *) RTTabFind(PRTTAB pTab, const void *pvItem)
506{
507 return pTab->pOps->pfnFind(pTab, pvItem);
508}
509
510
511/**
512 * Common traverser core.
513 */
514typedef struct RTTABTRAVERSERCORE
515{
516 /** The table being traversed. */
517 PRTTAB pTab;
518 /** Indicates that this traverser was allocated. */
519 bool fAllocated;
520 /** The table generation id this traverser was last updated for.
521 * This is used to catch up with table changes. */
522 RTUINT idGeneration;
523} RTTABTRAVERSERCORE;
524
525/**
526 * Generic traverser structure.
527 *
528 * Tree implementations will use the tree specific part by mapping
529 * this structure onto their own internal traverser structure.
530 *
531 * @remark It would be better to use alloca() for allocating the structure,
532 * OTOH this is simpler for the user.
533 */
534typedef struct RTTABTRAVERSER
535{
536 /** The common core of the traverser data. */
537 RTTABTRAVERSERCORE Core;
538 /** The tree specific data. */
539 void *apvTreeSpecific[32];
540} RTTABTRAVERSER;
541
542
543/**
544 * Initializes a traverser to the NULL item.
545 *
546 * The NULL item is an imaginary table item before the first and after
547 * the last items in the table.
548 *
549 * @returns Pointer to the traverser positioned at the NULL item.
550 * @returns NULL on failure to allocate the traverser.
551 *
552 * @param pTab The table.
553 * @param pTravNew Pointer to a preallocated structure. Optional.
554 */
555DECLINLINE(PRTTABTRAVERSERCORE) RTTabTravInit(PRTTAB pTab, PRTTABTRAVERSER pTravNew)
556{
557 return pTab->pOps->pfnTravInit(pTab, pTravNew);
558}
559
560/**
561 * Initializes a traverser to the first item in the table.
562 *
563 * If the table is empty, the traverser will be positioned at the NULL item
564 * like with RTTabTravInit().
565 *
566 * @returns Pointer to the traverser positioned at the first item or NULL item.
567 * @returns NULL on failure to allocate the traverser.
568 *
569 * @param pTab The table.
570 * @param pTravNew Pointer to a preallocated structure. Optional.
571 */
572DECLINLINE(PRTTABTRAVERSERCORE) RTTabTravFirst(PRTTAB pTab, PRTTABTRAVERSER pTravNew)
573{
574 return pTab->pOps->pfnTravFirst(pTab, pTravNew);
575}
576
577/**
578 * Initializes a traverser to the last item in the table.
579 *
580 * If the table is empty, the traverser will be positioned at the NULL item
581 * like with RTTabTravInit().
582 *
583 * @returns Pointer to the traverser positioned at the last item or NULL item.
584 * @returns NULL on failure to allocate the traverser.
585 *
586 * @param pTab The table.
587 * @param pTravNew Pointer to a preallocated structure. Optional.
588 */
589DECLINLINE(PRTTABTRAVERSERCORE) RTTabTravLast(PRTTAB pTab, PRTTABTRAVERSER pTravNew)
590{
591 return pTab->pOps->pfnTravLast(pTab, pTravNew);
592}
593
594/**
595 * Initializes a traverser to an item matching the given one.
596 *
597 * If the item isn't found, the traverser will be positioned at the NULL item
598 * like with RTTabTravInit().
599 *
600 * @returns Pointer to the traverser positioned at the matching item or NULL item.
601 * @returns NULL on failure to allocate the traverser.
602 *
603 * @param pTab The table.
604 * @param pTravNew Pointer to a preallocated structure. Optional.
605 * @param pvItem The item to find the match to.
606 */
607DECLINLINE(PRTTABTRAVERSERCORE) RTTabTravFind(PRTTAB pTab, PRTTABTRAVERSER pTravNew, const void *pvItem)
608{
609 return pTab->pOps->pfnTravFind(pTab, pTravNew, pvItem);
610}
611
612/**
613 * Initializes a traverser to the inserted item.
614 *
615 * If there already exists an item in the tree matching pvItem, the traverser
616 * is positioned at that item like with RTTabTravFind().
617 *
618 * If the insert operation failes because of an out of memory condition, the
619 * traverser will be positioned at the NULL item like with RTTabTravInit().
620 *
621 * @returns Pointer to the traverser positioned at the inserted, existing or NULL item.
622 * @returns NULL on failure to allocate the traverser.
623 *
624 * @param pTab The table.
625 * @param pTravNew Pointer to a preallocated structure. Optional.
626 * @param pvItem The item to be inserted.
627 */
628DECLINLINE(PRTTABTRAVERSERCORE) RTTabTravInsert(PRTTAB pTab, PRTTABTRAVERSER pTravNew, void *pvItem)
629{
630 return pTab->pOps->pfnTravInsert(pTab, pTravNew, pvItem);
631}
632
633/**
634 * Duplicates a traverser.
635 *
636 * @returns The pointer to the duplicate.
637 * @returns NULL on allocation failure.
638 *
639 * @param pTrav The traverser to duplicate.
640 * @param pTravNew Pointer to a preallocated structure. Optional.
641 */
642DECLINLINE(PRTTABTRAVERSERCORE) RTTabTravDuplicate(PRTTABTRAVERSERCORE pTrav, PCRTTABTRAVERSER pTravNew)
643{
644 if (pTrav)
645 return pTrav->pTab->pOps->pfnTravDuplicate(pTrav, pTravNew);
646 return NULL;
647}
648
649/**
650 * Frees a traverser.
651 *
652 * This can safely be called even if the traverser structure
653 * wasn't dynamically allocated or the constructor failed.
654 *
655 * @param pTrav The traverser which is to be free.
656 */
657DECLINLINE(void) RTTabTravFree(PRTTABTRAVERSERCORE pTrav)
658{
659 if (pTrav && pTrav->fAllocated)
660 pTrav->pTab->pOps->pfnTravFree(pTrav);
661}
662
663/**
664 * Gets the current item.
665 *
666 * @returns The current item. (NULL indicates the imaginary NULL item.)
667 * @param pTrav The traverser.
668 */
669DECLINLINE(void *) RTTabTravCur(PCRTTABTRAVERSERCORE pTrav)
670{
671 return pTrav->pTab->pOps->pfnTravCur(pTrav);
672}
673
674/**
675 * Advances to the next item.
676 *
677 * @returns The new current item. (NULL indicates the imaginary NULL item.)
678 * @param pTrav The traverser.
679 */
680DECLINLINE(void *) RTTabTravNext(PRTTABTRAVERSERCORE pTrav)
681{
682 return pTrav->pTab->pOps->pfnTravNext(pTrav);
683}
684
685/**
686 * Advances to the previous item.
687 *
688 * @returns The new current item. (NULL indicates the imaginary NULL item.)
689 * @param pTrav The traverser.
690 */
691DECLINLINE(void *) RTTabTravPrev(PRTTABTRAVERSERCORE pTrav)
692{
693 return pTrav->pTab->pOps->pfnTravPrev(pTrav);
694}
695
696/**
697 * Replaces the current item.
698 *
699 * This has the same restrictions as RTTabProbe(), e.g. it's not permitted to
700 * break the order of the table.
701 *
702 * @returns The replaced item.
703 * @returns NULL if the current item is the NULL item. The traverser
704 * and table remains unchanged.
705 * @param pTrav The traverser.
706 * @param pvItem The item to be inserted.
707 */
708DECLINLINE(void *) RTTabTravReplace(PRTTABTRAVERSERCORE pTrav, void *pvItem)
709{
710 return pTrav->pTab->pOps->pfnTravReplace(pTrav, pvItem);
711}
712
713__END_DECLS
714
715/** @} */
716
717#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette