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:
class MyClass {
....
//define a multi_index_container with a list-like index and an ordered index
struct SEQ {}; // Sequence
struct TID {}; // TypeID
typedef boost::multi_index::multi_index_container<
HtvValueBasePtr, // element type
boost::multi_index::indexed_by<
boost::multi_index::sequenced< // list-like index
boost::multi_index::tag<SEQ>
>, // sequenced<>
boost::multi_index::ordered_unique< // map-lik index
boost::multi_index::tag<TID>,
boost::multi_index::const_mem_fun< // key extractor
HtvValueBase, // class name
const HtvTypeBase::TypeID, // return type
&HtvValueBase::getTypeId // const mem fun name
> // const_mem_fun<>
> // ordered_unique<>
> // indexed_by<>
> TLVListMapType;
typedef TLVListMapType::index<SEQ>::type TLV_by_SEQ;
typedef TLVListMapType::index<TID>::type TLV_by_TID;
TLVListMapType mTLVs; //< indexed on both physical layout & TypeID.
....
}; // class MyClass
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 '//' comment after closing-bracket '{'
s.t. it's easier for the eyes):
(gdb) p pMyClassObj->mTLVs
$5 =
{
<boost::base_from_member<std::allocator<boost::multi_index::detail::sequenced_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<boost::shared_ptr<hipeer::HtvValueBase> > > > >,0>> =
{
member =
{
<__gnu_cxx::new_allocator<boost::multi_index::detail::sequenced_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<boost::shared_ptr<hipeer::HtvValueBase> > > > >> =
{
<No data fields>
},
<No data fields>
}
},
<boost::multi_index::detail::header_holder<boost::multi_index::detail::sequenced_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<boost::shared_ptr<hipeer::HtvValueBase> > > >,boost::multi_index::multi_index_container<boost::shared_ptr<hipeer::HtvValueBase>, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<hipeer::HipPacket::SEQ, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::multi_index::ordered_unique<boost::multi_index::tag<hipeer::HipPacket::TID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<boost::shared_ptr<hipeer::HtvValueBase> > > >> =
{
<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<boost::shared_ptr<hipeer::HtvValueBase> > > >*,0>> =
{
member = 0x85cf7a8
},
<boost::noncopyable_::noncopyable> =
{
<No data fields>
},
<No data fields>
}, // header_holder
<boost::multi_index::detail::sequenced_index<boost::multi_index::detail::nth_layer<1, boost::shared_ptr<hipeer::HtvValueBase>, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<hipeer::HipPacket::SEQ, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::multi_index::ordered_unique<boost::multi_index::tag<hipeer::HipPacket::TID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<boost::shared_ptr<hipeer::HtvValueBase> > >,boost::mpl::v_item<hipeer::HipPacket::SEQ, boost::mpl::vector0<mpl_::na>, 0> >> =
{
<boost::multi_index::detail::ordered_index<boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>,std::less<const hipeer::HtvTypeBase::TypeID>,boost::multi_index::detail::nth_layer<2, boost::shared_ptr<hipeer::HtvValueBase>, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<hipeer::HipPacket::SEQ, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::multi_index::ordered_unique<boost::multi_index::tag<hipeer::HipPacket::TID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<boost::shared_ptr<hipeer::HtvValueBase> > >,boost::mpl::v_item<hipeer::HipPacket::TID, boost::mpl::vector0<mpl_::na>, 0>,boost::multi_index::detail::ordered_unique_tag>> =
{
<boost::multi_index::detail::index_base<boost::shared_ptr<hipeer::HtvValueBase>,boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<hipeer::HipPacket::SEQ, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::multi_index::ordered_unique<boost::multi_index::tag<hipeer::HipPacket::TID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, mpl_::na>, mpl_---Type <return> to continue, or q <return> to quit---
::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>,std::allocator<boost::shared_ptr<hipeer::HtvValueBase> > >> =
{
<No data fields>
}, // index_base
<boost::multi_index::detail::safe_container<boost::multi_index::detail::ordered_index<boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, std::less<const hipeer::HtvTypeBase::TypeID>, boost::multi_index::detail::nth_layer<2, boost::shared_ptr<hipeer::HtvValueBase>, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<hipeer::HipPacket::SEQ, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::multi_index::ordered_unique<boost::multi_index::tag<hipeer::HipPacket::TID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<boost::shared_ptr<hipeer::HtvValueBase> > >, boost::mpl::v_item<hipeer::HipPacket::TID, boost::mpl::vector0<mpl_::na>, 0>, boost::multi_index::detail::ordered_unique_tag> >> =
{
<boost::multi_index::detail::safe_container_base> =
{
<boost::noncopyable_::noncopyable> =
{
<No data fields>
},
header =
{
cont = 0x0,
next = 0x0,
unchecked_ = false
},
mutex =
{
m_ =
{
__m_reserved = 0,
__m_count = 0,
__m_owner = 0x0,
__m_kind = 0,
__m_lock =
{
__status = 0,
__spinlock = 0
}
}
}
},
<No data fields>
}, // safe_container (for ordered_index?)
key =
{
<No data fields>
},
comp =
{
<> =
{
<No data fields>
},
<No data fields>
}
}, // ordered_index
<boost::multi_index::detail::safe_container<boost::multi_index::detail::sequenced_index<boost::multi_index::detail::nth_layer<1, boost::shared_ptr<hipeer::HtvValueBase>, boost::multi_index::indexed_by<boost::multi_index::sequenced<boost::multi_index::tag<hipeer::HipPacket::SEQ, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na> >, boost::multi_index::ordered_unique<boost::multi_index::tag<hipeer::HipPacket::TID, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, boost::multi_index::const_mem_fun<hipeer::HtvValueBase, const hipeer::HtvTypeBase::TypeID, &hipeer::HtvValueBase::getTypeId>, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::allocator<boost::shared_ptr<hipeer::HtvValueBase> > >, boost::mpl::v_item<hipeer::HipPacket::SEQ, boost::mpl::vector0<mpl_::na>, 0> > >> =
{
<boost::multi_index::detail::safe_container_base> =
{
<boost::noncopyable_::noncopyable> =
{
<No data fields>
},
header =
{
cont = 0x0,
next = 0x0,
unchecked_ = false
},
mutex =
{
m_ =
{
__m_reserved = 0,
__m_count = 0,
__m_owner = 0x0,
__m_kind = 0,
__m_lock =
{
__status = 0,
__spinlock = 0
}
}
}
},
<No data fields>
}, // safe_container (for sequenced_index?)
<No data fields>
}, // sequenced_index
node_count = 3
} // $5...
(gdb) p pMyClassObj->mTLVs.header
$12 = {cont = 0x0, next = 0x0, unchecked_ = false}
(gdb) p pMyClassObj->mTLVs.member
$13 = {<__gnu_cxx::new_allocator<boost::multi_index::detail::sequenced_index_node<boost::multi_index::detail::ordered_index_node<boost::multi_index::detail::index_node_base<boost::shared_ptr<hipeer::HtvValueBase> > > > >> = {<No data fields>}, <No data fields>}
(gdb) p rqInbPkt.px->mTLVs.node_count
$14 = 3
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 fields inside 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?
Thanks,
--- Jeffrey