carb::dictionary::walkDictionary
Defined in carb/dictionary/DictionaryUtils.h
-
template<typename ElementData, typename OnItemFnType, typename ItemPtrType = const Item, typename GetChildByIndexFuncType>
inline void carb::dictionary::walkDictionary(IDictionary *dict, WalkerMode walkerMode, ItemPtrType *root, ElementData rootElementData, OnItemFnType onItemFn, void *userData, GetChildByIndexFuncType getChildByIndexFunc = getChildByIndex<ItemPtrType>) Walk a dictionary item to enumerate all of its values.
Remark
This walks a dictionary and enumerates all of its values of all types. This includes even ItemType::eDictionary items. Non-leaf items in the walk will be passed to the
onItemFn
callback before walking through its children. ThegetChildByIndexFunc
callback function can be used to control the order in which the children of each level of the dictionary are enumerated. The default implementation simply enumerates the items in the order they are stored in (which is generally arbitrary). The dictionary’s full tree is walked in a depth first manner so sibling items are not guaranteed to be enumerated consecutively.- Thread Safety
This function is thread safe as long as nothing else is concurrently modifying the dictionary being walked. It is the caller’s responsibility to ensure that neither the dictionary nor any of its children will be modified until the walk is complete.
- Template Parameters
ElementData – The data type for the per-item element data that is maintained during the walk. This can be used for example to track which level of the dictionary a given item is at by using an
int
type here.OnItemFnType – The type for the
onItemFn
callback function.ItemPtrType – The type used for the item type in the
GetChildByIndexFuncType
callback. This must either beconst Item
orItem
. This defaults toconst Item
. If a non-const type is used here it is possible that items’ values could be modified during the walk. Using a non-const value is discouraged however since it can lead to unsafe use or undefined behavior.GetChildByIndexFuncType – The type for the
getChildByIndexFunc
callback function.
- Parameters
dict – [in] The IDictionary interface to use to access the items in the dictionary. This must not be
nullptr
. This must be the same interface that was originally used to create the dictionaryroot
being walked.walkerMode – [in] The mode to walk the given dictionary in.
root – [in] The root dictionary to walk. This must not be
nullptr
.rootElementData – [in] The user specified element data value that is to be associated with the
root
element. This value can be changed during the walk by theonItemFn
callback function.onItemFn – [in] The callback function that is performed for each value in the given dictionary. The user specified element data value can be modified on each non-leaf item. This modified element data value is then passed to all further children of the given item. The element data value returned for leaf items is discarded. This must not be
nullptr
.userData – [in] Opaque user data object that is passed to each
onItemFn
callback. The caller is responsible for knowing how to interpret and access this value.getChildByIndexFunc – [in] Callback function to enumerate the children of a given item in the dictionary being walked. This must not be
nullptr
. This can be used to either control the order in which the child items are enumerated (ie: sort them before returning), or to return them as non-const objects so that the item’s value can be changed during enumeration. Attempting to insert or remove items by using a non-const child enumerator is unsafe and will generally result in undefined behavior.
- Returns
No return value.