Boost 1.55 버전 기준으로 작성했습니다.
#pragma once
#include <iostream>
#include <string>
// multi index
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/composite_key.hpp>
#include <iostream>
#include <string>
// 클라스
class CPlayer
{
public:
int _ID;
std::string _Name;
//bool _Sex;
int getID() const { return _ID; }
std::string getName() const { return _Name; }
bool getSex() const
{
if( _Name == "test" )
return false;
return true;
}
void setID( int id ) { _ID = id; }
void setName( std::string const& name ) { _Name = name; }
//void setSex( bool sex ) { _Sex = sex; }
CPlayer( int id, std::string name ) : _ID( id ), _Name( name ) {}
};
// 태그들
struct tagID {};
struct tagName {};
struct tagBoth {};
struct tagSex {};
// 멀티 인덱스 container
typedef boost::multi_index::multi_index_container
<
CPlayer,
boost::multi_index::indexed_by
<
// 첫번째 키
boost::multi_index::ordered_non_unique
<
boost::multi_index::tag< tagID >, boost::multi_index::const_mem_fun< CPlayer, int, &CPlayer::getID >
>,
// 두번째 키
boost::multi_index::hashed_non_unique
<
boost::multi_index::tag< tagName >, boost::multi_index::const_mem_fun< CPlayer, std::string, &CPlayer::getName >
>,
// 세번째 조합 키( hole numer 와 player name )
boost::multi_index::ordered_non_unique
<
boost::multi_index::tag< tagBoth >, boost::multi_index::composite_key< CPlayer,
boost::multi_index::const_mem_fun< CPlayer, int, &CPlayer::getID >,
boost::multi_index::const_mem_fun< CPlayer, std::string, &CPlayer::getName >,
boost::multi_index::const_mem_fun< CPlayer, bool, &CPlayer::getSex >
>
>,
// 네번째 키
boost::multi_index::hashed_non_unique
<
boost::multi_index::tag< tagSex >, boost::multi_index::const_mem_fun< CPlayer, bool, &CPlayer::getSex >
>
>
> TurnMultiindex;
typedef TurnMultiindex::index< tagID >::type IDIndex;
typedef TurnMultiindex::index< tagName >::type NameIndex;
typedef TurnMultiindex::index< tagBoth >::type BothIndex;
typedef TurnMultiindex::index< tagSex >::type SexIndex;
std::ostream& operator << ( std::ostream& rOut, CPlayer const& rPlayer )
{
return rOut << rPlayer.getID() << " / " << rPlayer.getName() << " / " << std::boolalpha << rPlayer.getSex() << std::endl;
}
void set( CPlayer& p )
{
p.setID( 10 );
p.setName( "test" );
//p.setSex( false );
}
void multi_index_test()
{
TurnMultiindex players;
players.insert( CPlayer( 0, "skhong" ) );
players.insert( CPlayer( 0, "skhong" ) );
players.insert( CPlayer( 0, "skhong" ) );
players.insert( CPlayer( 0, "skhong" ) );
/*players.insert( CPlayer( 2, "okidoki" ) );
players.insert( CPlayer( 3, "skhong" ) );
players.insert( CPlayer( 1, "woowoo" ) );
players.insert( CPlayer( 5, "Nok" ) );
players.insert( CPlayer( 0, "filco" ) );*/
//TurnMultiindex::iterator it = players.find( 0 );
//players.modify( it, set );
// id로 검색
std::cout << "find ID" << std::endl;
IDIndex::const_iterator itIDLower;
IDIndex::const_iterator itIDUpper;
boost::tie( itIDLower, itIDUpper ) = players.get< tagID >().equal_range( 0 );
std::copy( itIDLower, itIDUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
//players.get< tagID >().modify( itIDLower, set );
// 이름으로 검색
std::cout << "find Name" << std::endl;
NameIndex::const_iterator itNameLower;
NameIndex::const_iterator itNameUpper;
boost::tie( itNameLower, itNameUpper ) = players.get< tagName >().equal_range( "test" );
std::copy( itNameLower, itNameUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
//players.get< tagID >().modify( itIDLower, set );
//// id 와 이름으로 검색
std::cout << "find All" << std::endl;
BothIndex::const_iterator itBothLower;
BothIndex::const_iterator itBothUpper;
boost::tie( itBothLower, itBothUpper ) = players.get< tagBoth >().equal_range( boost::make_tuple( 0, "skhong", true ) );
std::copy( itBothLower, itBothUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
boost::tie( itBothLower, itBothUpper ) = players.get< tagBoth >().equal_range( boost::make_tuple( 10, "test", false ) );
std::copy( itBothLower, itBothUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
BothIndex::const_iterator itBothF = players.get< tagBoth >().find( boost::make_tuple( 0, "skhong", true ) );
//std::copy( itBothLower, itBothUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
//// id 와 이름으로 검색
std::cout << "find sex" << std::endl;
SexIndex::const_iterator itSexLower;
SexIndex::const_iterator itSexUpper;
boost::tie( itSexLower, itSexUpper ) = players.get< tagSex >().equal_range( true );
std::copy( itSexLower, itSexUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
boost::tie( itSexLower, itSexUpper ) = players.get< tagSex >().equal_range( false );
std::copy( itSexLower, itSexUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
//// 순차적인거
//SquencedIndex::const_iterator itSquenceLower;
//SquencedIndex::const_iterator itSquenceUpper;
//SquencedIndex& squenceIndex = players.get< tagSquenced >();
//boost::tie( itSquenceLower, itSquenceUpper ) = players.get< tagSquenced >().equal_range( 0, 3 );
//std::copy( itSquenceLower, itSquenceUpper, std::ostream_iterator< CPlayer >( std::cout << "\n" ) );
}
Boost Pool 샘플 (0) | 2016.01.31 |
---|---|
Boost Optional 샘플 (0) | 2016.01.31 |
Boost MPL 샘플 (0) | 2016.01.29 |
Boost Meta State Machine 테스트 2 (0) | 2016.01.29 |
Boost Meta State Machine 테스트 (0) | 2016.01.29 |