一位网友说他不能在ACE中正常地使用嵌套使Hash_Map,我写下下面的代码作了简单测试,发现在ACE使用Hasp_Map还是可以的.
// TestHaspMap.cpp:Definestheentrypointfortheconsoleapplication.
//
#include " stdafx.h "
#include " ACE/Basic_Types.h "
#include " ACE/Map_Manager.h "
#include " ACE/SString.h "
#include " ACE/Log_Msg.h "
#include " ACE/Null_Mutex.h "
class PhoneNumber
{
public :
PhoneNumber( const char * number):number_(number)
{
}
const char * getNumber( void )
{
return number_.c_str();
}
private :
ACE_SStringnumber_;
};
typedefACE_UINT16CONNECTION_ID;
typedefACE_Null_MutexMAP_MUTEX;
typedefACE_Map_Manager < CONNECTION_ID,PhoneNumber * ,MAP_MUTEX >
CONNECTION_MAP;
typedefACE_Map_Iterator < CONNECTION_ID,PhoneNumber * ,MAP_MUTEX >
CONNECTION_MAP_ITERATOR;
typedefACE_Map_Entry < CONNECTION_ID,PhoneNumber *>
CONNECTION_MAP_ENTRY;
typedefACE_Map_Manager < CONNECTION_ID,CONNECTION_MAP * ,MAP_MUTEX >
MAP_MAP;
typedefACE_Map_Iterator < CONNECTION_ID,CONNECTION_MAP * ,MAP_MUTEX >
MAP_MAP_ITERATOR;
typedefACE_Map_Entry < CONNECTION_ID,CONNECTION_MAP *>
MAP_MAP_ENTRY;
int ACE_TMAIN( int argc,_TCHAR * argv[])
{
CONNECTION_MAPconnection_map;
PhoneNumberme( " 13717928*** " );
PhoneNumberoffice( " 010-82378*** " );
PhoneNumberhome( " 13366686** " );
int result = - 1 ;
result = connection_map.bind( 1 , & me);
ACE_ASSERT(result == 0 );
result = connection_map.bind( 2 , & office);
ACE_ASSERT(result == 0 );
result = connection_map.bind( 3 , & home);
ACE_ASSERT(result == 0 );
result = connection_map.bind( 5 , & home);
ACE_ASSERT(result == 0 );
connection_map.unbind( 3 );
CONNECTION_MAP_ITERATORit(connection_map);
for (CONNECTION_MAP_ENTRY * i = 0 ;
it.next(i) != 0 ;
it.advance())
{
PhoneNumber * phone = i -> int_id_;
ACE_DEBUG((LM_INFO,ACE_TEXT( " 连接号码 %d,电话号码%s\n " ),
i -> ext_id_,
phone -> getNumber()));
}
PhoneNumber * any_phone = 0 ;
CONNECTION_IDany_id = 5 ;
result = connection_map.find(any_id,any_phone);
if (result != - 1 )
{
ACE_DEBUG((LM_INFO,ACE_TEXT( " 连接号码 %d,电话号码%s\n " ),
any_id,
any_phone -> getNumber()));
}
else
{
ACE_DEBUG((LM_INFO,ACE_TEXT( " 连接号码 %d,电话号码%s\n " ),
any_id,
" notfound. " ));
}
MAP_MAPmap_map;
map_map.bind( 1 , & connection_map);
size_tn = map_map.current_size();
MAP_MAP_ITERATORmap_it(map_map);
for (MAP_MAP_ENTRY * j = 0 ;
map_it.next(j) != 0 ;
map_it.advance())
{
CONNECTION_MAP * cur_map = j -> int_id_;
size_tcount = cur_map -> current_size();
PhoneNumber * any_phone2 = 0 ;
if (cur_map -> find( 2 ,any_phone2) !=- 1 )
{
ACE_DEBUG((LM_INFO,ACE_TEXT( " 内部map中电话号码%s\n " ),
any_phone2 -> getNumber()));
}
}
return 0 ;
}