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' 카테고리의 다른 글

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
      Boost  |  2016. 1. 31. 23:23



홍쿤사마's Blog is powered by Daum