Hi Jeffrey
----- Mensaje original -----
De: Jeffrey Chang
Hi,
I've been compiling & using multi_index without problem for a while; but when I use gdb to print multi_index_container objects, I couldn't find a way to easily traverse through its internal data structure.
Here' s my multi_index_container object declaration: [...] The program is running fine without problem; and I wanna use gdb to check its runtime status by printing out the object. Here's the gdb output when I print the object (I've manully indexed the gdb output & add '//' commentafter closing-bracket '{' s.t. it's easier for the eyes):
(gdb) p pMyClassObj->mTLVs $5 = [...] According to the 'node_count', there're 3 objects stored in the multi_index_container of '*pMyClassObj'. But I couldn't find a way to traverse all 3 objects in gdb: I see there're two 'member' data fieldsinside MyClass container, the first one doesn't contain any data, while the second one (at address 0x85cf7a8 inside the header_holder class???) seems to be the right place to start traversing... but I don't know if there's any convenient way to traverse it at the symbolic level via container's data members. Any hint?
As you correctly guess, the member at header_holder_class is where you have to look at in order to reach for the elements. This member is of type (in your particular case) boost::base_from_member< boost::multi_index::detail::sequenced_index_node< boost::multi_index::detail::ordered_index_node< boost::multi_index::detail::index_node_base< HtvValueBasePtr > > >*, 0
The base_from_member base class in turn contains a member of type pointer to boost::multi_index::detail::sequenced_index_node< boost::multi_index::detail::ordered_index_node< boost::multi_index::detail::index_node_base< HtvValueBasePtr > >
which is a pointer to the "header" of the container, from where you can jump to the elements. This class contains the element values proper (inside index_node_base<...>) as well as linking stuff for each of the indices the multi-index container is comprised of. sequenced_index_node<...> multiply inherits from ordered_index_node<...> and from a class sequenced_index_node_trampoline<...>, which in turn inherits from sequenced_index_node_impl, which has members called prior_ and next_. Since the header is conceptually the end node of the container, just follow the prior_ pointers to traverse all the elements. You could also do the traversal following the pointers in ordered_index_node<...>, but this is a little more complicated since the data structure implemented by this is an rb tree. Hope this helps, Joaquín M López Muñoz Telefónica, Investigación y Desarrollo