VirtualBox

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

Last change on this file since 73768 was 69475, checked in by vboxsync, 7 years ago

*: scm updates - header files should have 'svn:keywords=Id Revision' too (doesn't mean they have to use them).

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

© 2023 Oracle
ContactPrivacy policyTerms of Use