123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446 |
- // Copyright 2010 Christophe Henry
- // henry UNDERSCORE christophe AT hotmail DOT com
- // This is an extended version of the state machine available in the boost::mpl library
- // Distributed under the same license as the original.
- // Copyright for the original version:
- // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
- // under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #include <vector>
- #include <list>
- #include <set>
- #include <map>
- #include <iostream>
- // we need more than the default 10 states
- #define FUSION_MAX_VECTOR_SIZE 15
- #include <boost/msm/back/state_machine.hpp>
- #include <boost/msm/front/euml/euml.hpp>
- #include <boost/msm/front/euml/stl.hpp>
- using namespace std;
- using namespace boost::msm::front::euml;
- namespace msm = boost::msm;
- // how long the timer will ring when countdown elapsed.
- #define RINGING_TIME 5
- namespace // Concrete FSM implementation
- {
- // flag
- BOOST_MSM_EUML_FLAG(SomeFlag)
- // declares attributes with type and name. Can be used anywhere after
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_song)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(int,m_song_id)
- // declare that a type inheriting from OneSongDef will get these 2 attributes
- BOOST_MSM_EUML_ATTRIBUTES((attributes_ << m_song << m_song_id ), OneSongDef)
- // events
- // this event is done "manually", not using any predefined macro
- struct OneSong_impl : euml_event<OneSong_impl>,OneSongDef
- {
- OneSong_impl(){}
- OneSong_impl(const string& asong)
- {
- get_attribute(m_song)=asong;
- get_attribute(m_song_id)=1;
- }
- OneSong_impl(const OneSong_impl& asong)
- {
- get_attribute(m_song)=asong.get_attribute(m_song);
- get_attribute(m_song_id)=1;
- }
- const string& get_data() const {return get_attribute(m_song);}
- };
- // declare an instance for use in the transition table
- OneSong_impl const OneSong;
- struct SongComparator : euml_action<SongComparator>
- {
- bool operator()(const OneSong_impl& lhs,const OneSong_impl& rhs)const
- {
- return lhs.get_data() == rhs.get_data();
- }
- };
- struct SongLessComparator : euml_action<SongLessComparator>
- {
- bool operator()(const OneSong_impl& lhs,const OneSong_impl& rhs)const
- {
- return lhs.get_data() < rhs.get_data();
- }
- };
- struct Comparator
- {
- template <class T>
- bool operator()(const T& lhs,const T& rhs)const
- {
- return lhs < rhs;
- }
- };
- struct RemoveDummy
- {
- bool operator()(const OneSong_impl& lhs)const
- {
- return (lhs.get_attribute(m_song).compare(std::string("She-Dummy. Remove this one"))==0 );
- }
- };
- template <int val>
- struct LookFor
- {
- template <class T>
- bool operator()(const T& lhs)const
- {
- return lhs == val;
- }
- };
- template <int val>
- struct LessThan
- {
- template <class T>
- bool operator()(const T& lhs)const
- {
- return lhs < val;
- }
- };
- BOOST_MSM_EUML_ACTION(SongDeleter)
- {
- bool operator()(const OneSong_impl& lhs)const
- {
- return lhs.get_data() == "Twist and Shout";
- }
- };
- struct Generator
- {
- int operator()()const
- {
- return 1;
- }
- };
- struct Print
- {
- template <class T>
- void operator()(const T& lhs)const
- {
- std::cout << "Song:" << lhs.get_data() << endl;
- }
- };
- BOOST_MSM_EUML_ATTRIBUTES((attributes_ << m_song ), NotFoundDef)
- // declare an event instance called NotFound with the defined attributes
- // these attributes can then be referenced anywhere (stt, state behaviors)
- BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(NotFound,NotFoundDef)
- BOOST_MSM_EUML_ATTRIBUTES((attributes_ << m_song ), FoundDef)
- struct Found_impl : euml_event<Found_impl>,FoundDef
- {
- Found_impl(){}
- Found_impl (const string& data)
- {
- get_attribute(m_song)=data;
- }
- int foo()const {std::cout << "foo()" << std::endl; return 0;}
- int foo(int i)const {std::cout << "foo(int):" << i << std::endl; return 1;}
- int foo(int i,int j)const {std::cout << "foo(int,int):" << i <<"," << j << std::endl; return 2;}
- };
- Found_impl const Found;
- // some functions to call
- // this macro creates a functor and an eUML function wrapper. Now, foo_ can be used anywhere
- BOOST_MSM_EUML_METHOD(FoundFoo_ , foo , foo_ , int , int )
- template <class T>
- int do_print(T& t ) {std::cout << "print(T):" << typeid(T).name() << std::endl;return 1;}
- BOOST_MSM_EUML_FUNCTION(PrintState_ , do_print , print_ , int , int )
- BOOST_MSM_EUML_EVENT(Done)
- // Concrete FSM implementation
- struct some_base
- {
- int foobar()const {std::cout << "foobar()" << std::endl; return 0;}
- int foobar(int i)const {std::cout << "foobar(int):" << i << std::endl; return 1;}
- int foobar(int i,int j)const {std::cout << "foobar(int,int):" << i <<"," << j << std::endl; return 2;}
- };
- // some functions to call
- BOOST_MSM_EUML_METHOD(FooBar_ , foobar , foobar_ , int , int )
- // fsm attributes
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(vector<OneSong_impl>,m_src_container)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(list<OneSong_impl>,m_tgt_container)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(list<int>,m_var2)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(list<int>,m_var3)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(set<int>,m_var4)
- typedef std::map<int,int> int_int_map;
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(int_int_map,m_var5)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_var6)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_var7)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(vector<int>,m_var8)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(vector<int>,m_var9)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(int,m_var10)
- // The list of FSM states
- BOOST_MSM_EUML_STATE(( ( insert_(fsm_(m_tgt_container),end_(fsm_(m_tgt_container)),
- append_(event_(m_song),fsm_(m_var7)) ),//foo_(event_,Int_<0>()) ,
- //foo_(event_,Int_<0>(),Int_<1>()),print_(state_),
- process_(Done/*,fsm_*/),if_then_(true_,true_) ),
- no_action
- ),Insert)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(std::string,m_letters)
- BOOST_MSM_EUML_STATE(( if_then_else_( (string_find_(event_(m_song),state_(m_letters),Size_t_<0>()) != Npos_<string>()&&
- string_find_(event_(m_song),Char_<'S'>(),Size_t_<0>()) != Npos_<string>()&&
- string_find_first_of_(event_(m_song),Char_<'S'>()) == Size_t_<0>() &&
- string_compare_(event_(m_song),Int_<0>(),size_(event_(m_song)),event_(m_song)) == Int_<0>()
- //&& is_flag_(SomeFlag(),fsm_())
- //&& ( event_(m_song_id) == Int_<1>())
- //&& string_find_(event_(m_song),String_<mpl::string<'Sh','e'> >())
- // != Npos_<string>()
- ),
- process2_(Found,
- //string_insert_(event_(m_song),Size_t_<0>(),fsm_(m_var6)) ),
- string_replace_(
- string_assign_(
- string_erase_(
- string_insert_(
- substr_(event_(m_song),Size_t_<1>()),
- Size_t_<0>(),
- Size_t_<1>(),
- Char_<'S'>()),
- Size_t_<0>(),
- Size_t_<1>() ),
- event_(m_song) ),
- Size_t_<0>(),
- Size_t_<1>(),
- c_str_(fsm_(m_var6))
- /*Size_t_<1>(),
- Char_<'s'>()*/ ) ),
- process2_(NotFound,event_(m_song),fsm_) ) ,
- no_action,
- attributes_ << m_letters,
- configure_<< SomeFlag ),StringFind)
- BOOST_MSM_EUML_DECLARE_ATTRIBUTE(vector<OneSong_impl>::iterator,m_src_it)
- BOOST_MSM_EUML_STATE(( if_then_( (state_(m_src_it) != end_(fsm_(m_src_container)) &&
- //associative_find_(fsm_(m_var4),Int_<9>()) != end_(fsm_(m_var4))&&
- //associative_count_(fsm_(m_var4),Int_<9>()) == Size_t_<1>() &&
- //*associative_upper_bound_(fsm_(m_var4),Int_<8>()) == Int_<9>()&&
- //*associative_lower_bound_(fsm_(m_var4),Int_<9>()) == Int_<9>() &&
- //second_(associative_equal_range_(fsm_(m_var4),Int_<8>())) == associative_upper_bound_(fsm_(m_var4),Int_<8>()) &&
- //first_(associative_equal_range_(fsm_(m_var4),Int_<8>())) == associative_lower_bound_(fsm_(m_var4),Int_<8>())&&
- //second_(*associative_lower_bound_(fsm_(m_var5),Int_<0>())) == Int_<0>() && //map => pair as return
- //find_if_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Predicate_<LookFor<8> >()) != end_(fsm_(m_var4))&&
- //*lower_bound_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<9>(),Predicate_<std::less<int> >()) == Int_<9>()&&
- //*upper_bound_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<8>(),Predicate_<std::less<int> >()) == Int_<9>() &&
- //second_(equal_range_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<8>()))
- // == upper_bound_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<8>()) &&
- //first_(equal_range_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<9>(),Predicate_<std::less<int> >()))
- // == lower_bound_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<9>(),Predicate_<std::less<int> >())&&
- //binary_search_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<9>(),Predicate_<std::less<int> >())&&
- //binary_search_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<9>())&&
- //count_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Int_<9>()) == Int_<1>()&&
- //count_if_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Predicate_<LookFor<9> >()) == Int_<1>()&&
- //distance_(begin_(fsm_(m_var4)),end_(fsm_(m_var4))) == Int_<2>()&&
- //*min_element_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Predicate_<std::less<int> >()) == Int_<8>()&&
- //*max_element_(begin_(fsm_(m_var4)),end_(fsm_(m_var4)),Predicate_<std::less<int> >()) == Int_<9>()&&
- //adjacent_find_(begin_(fsm_(m_var4)),end_(fsm_(m_var4))) == end_(fsm_(m_var4))&&
- //*find_end_(begin_(fsm_(m_var8)),end_(fsm_(m_var8)),begin_(fsm_(m_var9)),end_(fsm_(m_var9)))
- // == Int_<1>()&&
- //*find_first_of_(begin_(fsm_(m_var8)),end_(fsm_(m_var8)),begin_(fsm_(m_var9)),end_(fsm_(m_var9)))
- // == Int_<1>()&&
- //equal_(begin_(fsm_(m_var9)),end_(fsm_(m_var9)),begin_(fsm_(m_var8)))&&
- //*search_(begin_(fsm_(m_var8)),end_(fsm_(m_var8)),begin_(fsm_(m_var9)),end_(fsm_(m_var9)))
- // == Int_<1>()&&
- //includes_(begin_(fsm_(m_var8)),end_(fsm_(m_var8)),begin_(fsm_(m_var9)),end_(fsm_(m_var9)))&&
- //!lexicographical_compare_(begin_(fsm_(m_var8)),end_(fsm_(m_var8)),
- // begin_(fsm_(m_var9)),end_(fsm_(m_var9)))&&
- //first_(mismatch_(begin_(fsm_(m_var9)),end_(fsm_(m_var9)),begin_(fsm_(m_var8))))
- // == end_(fsm_(m_var9)) &&
- accumulate_(begin_(fsm_(m_var9)),end_(fsm_(m_var9)),Int_<1>(),
- Predicate_<std::plus<int> >()) == Int_<1>()
- ),
- (process2_(OneSong,*(state_(m_src_it)++))/*,foobar_(fsm_,Int_<0>())*/ ) ),
- no_action,
- attributes_ << m_src_it
- , configure_<< SomeFlag ),Foreach)
- // replaces the old transition table
- BOOST_MSM_EUML_TRANSITION_TABLE((
- StringFind == Foreach + OneSong[if_then_else_(true_,true_,true_)],
- Insert == StringFind + Found / (if_then_(true_,no_action)),
- Foreach == StringFind + NotFound ,
- Foreach == Insert + Done
- // +------------------------------------------------------------------------------+
- ),transition_table )
- BOOST_MSM_EUML_ACTION(Log_No_Transition)
- {
- template <class FSM,class Event>
- void operator()(Event const& e,FSM&,int state)
- {
- std::cout << "no transition from state " << state
- << " on event " << typeid(e).name() << std::endl;
- }
- };
- // create a state machine "on the fly"
- BOOST_MSM_EUML_DECLARE_STATE_MACHINE(( transition_table, //STT
- init_ << Foreach, // Init
- //insert_(state_(m_var4),begin_(state_(m_var2)),end_(state_(m_var2))),
- (insert_(state_(m_var4),Int_<5>()),insert_(state_(m_var4),Int_<6>()),insert_(state_(m_var4),Int_<7>()),
- insert_(state_(m_var4),Int_<8>()),insert_(state_(m_var4),Int_<9>()),
- associative_erase_(state_(m_var4),Int_<6>()),associative_erase_(state_(m_var4),begin_(state_(m_var4))),
- associative_erase_(state_(m_var4),begin_(state_(m_var4)),++begin_(state_(m_var4))),
- insert_(state_(m_var2),begin_(state_(m_var2)),begin_(state_(m_var3)),end_(state_(m_var3))),
- state_(m_var5)[Int_<0>()]=Int_<0>(),state_(m_var5)[Int_<1>()]=Int_<1>()
- ,attribute_(substate_(Foreach,fsm_),m_src_it)
- = begin_(fsm_(m_src_container))
- //,fill_(begin_(state_(m_var9)),end_(state_(m_var9)),Int_<0>())
- //,fill_n_(begin_(state_(m_var9)),Size_t_<2>(),Int_<0>())
- //,transform_(begin_(state_(m_var4)),end_(state_(m_var4)),begin_(state_(m_var2)),begin_(state_(m_var4)),
- // Predicate_<std::plus<int> >())
- //,process_(Done,fsm_(),fsm_)
- //,process_(Done,fsm_)
- //,fsm_
- //,foobar_(state_,Int_<0>(),Int_<1>())
- //,nth_element_(begin_(state_(m_var9)),++begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,partial_sort_(begin_(state_(m_var9)),end_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,partial_sort_copy_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,list_sort_(state_(m_var2))
- //,sort_(begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,inner_product_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)),Int_<1>())
- //,replace_copy_(begin_(state_(m_var4)),end_(state_(m_var4)),begin_(state_(m_var4)),Int_<8>(),Int_<7>())
- //,replace_copy_if_(begin_(state_(m_var4)),end_(state_(m_var4)),begin_(state_(m_var4)),Predicate_<LookFor<9> >(),Int_<8>())
- //,replace_(begin_(state_(m_var4)),end_(state_(m_var4)),Int_<8>(),Int_<7>())
- //,replace_if_(begin_(state_(m_var4)),end_(state_(m_var4)),Predicate_<LookFor<9> >(),Int_<8>())
- //,adjacent_difference_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)))
- //,partial_sum_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)))
- //,inner_product_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)),Int_<1>())
- //,next_permutation_(begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,prev_permutation_(begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,set_union_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)))
- //,inplace_merge_(begin_(state_(m_var9)),end_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,merge_(begin_(state_(m_var9)),end_(state_(m_var9)),begin_(state_(m_var9)),end_(state_(m_var9))
- // ,begin_(state_(m_var9)),Predicate_<std::less<int> >())
- //,stable_sort_(begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<std::less<int> >())
- //,partition_(begin_(state_(m_var2)),end_(state_(m_var2)),Predicate_<LessThan<3> >())
- //,stable_partition_(begin_(state_(m_var2)),end_(state_(m_var2)),Predicate_<LessThan<3> >())
- //,rotate_copy_(begin_(state_(m_var2)),++begin_(state_(m_var2)),end_(state_(m_var2)),begin_(state_(m_var2)))
- //,rotate_(begin_(state_(m_var2)),++begin_(state_(m_var2)),end_(state_(m_var2)))
- //,unique_(begin_(state_(m_var2)),end_(state_(m_var2)))
- //,unique_copy_(begin_(state_(m_var2)),end_(state_(m_var2)),begin_(state_(m_var2)))
- //,random_shuffle_(begin_(state_(m_var9)),end_(state_(m_var9)))
- //,generate_(begin_(state_(m_var9)),end_(state_(m_var9)),Predicate_<Generator>())
- //,generate_n_(begin_(state_(m_var9)),Int_<2>(),Predicate_<Generator>())
- //,reverse_copy_(begin_(state_(m_var2)),end_(state_(m_var2)),begin_(state_(m_var2)))
- //erase_(state_(m_src_container),
- // remove_if_(begin_(state_(m_src_container)),end_(state_(m_src_container)),
- // Predicate_<RemoveDummy>()),
- // end_(state_(m_src_container))),
- //list_remove_(state_(m_var2),Int_<3>()),
- //remove_copy_if_(begin_(state_(m_var9)),end_(state_(m_var9)),back_inserter_(state_(m_var2)),
- // Predicate_<LookFor<2> >() )
- //for_each_(begin_(state_(m_src_container)),end_(state_m_src_container()),
- // Predicate_<Print>() ),
- //copy_(begin_(state_(m_var9)),end_(state_(m_var9)),inserter_(state_(m_var2),end_(state_(m_var2)))),
- //reverse_(begin_(state_(m_var2)),end_(state_(m_var2)))
- ),
- //no_action, // Entry
- //splice_(state_(m_var2),begin_(state_(m_var2)),state_(m_var3),begin_(state_(m_var3)),end_(state_(m_var3))),
- //(list_remove_(state_(m_var2),Int_<3>()),list_merge_(state_(m_var2),state_(m_var3),Comparator())),//no_action, // Entry
- no_action, // Exit
- attributes_ << m_src_container // song list
- << m_tgt_container // result
- << m_var2
- << m_var3
- << m_var4
- << m_var5
- << m_var6
- << m_var7
- << m_var8
- << m_var9
- << m_var10,
- configure_<< no_configure_,
- Log_No_Transition
- ),iPodSearch_helper)
- struct iPodSearch_ : public iPodSearch_helper, public some_base
- {
- };
- // choice of back-end
- typedef msm::back::state_machine<iPodSearch_> iPodSearch;
- void test()
- {
- iPodSearch search;
- // fill our song list
- //search.get_attribute<m_src_container>().push_back(OneSong("She-Dummy. Remove this one"));
- search.get_attribute(m_src_container).push_back(OneSong_impl("Let it be"));
- search.get_attribute(m_src_container).push_back(OneSong_impl("Yellow submarine"));
- search.get_attribute(m_src_container).push_back(OneSong_impl("Twist and Shout"));
- search.get_attribute(m_src_container).push_back(OneSong_impl("She Loves You"));
- search.get_attribute(m_var2).push_back(1);
- search.get_attribute(m_var2).push_back(3);
- search.get_attribute(m_var2).push_back(4);
- search.get_attribute(m_var3).push_back(2);
- search.get_attribute(m_var3).push_back(4);
- search.get_attribute(m_var6) = "S";
- search.get_attribute(m_var7) = "- Some text";
- search.get_attribute(m_var8).push_back(1);
- search.get_attribute(m_var8).push_back(2);
- search.get_attribute(m_var8).push_back(3);
- search.get_attribute(m_var8).push_back(4);
- search.get_attribute(m_var9).push_back(1);
- search.get_attribute(m_var9).push_back(2);
- // look for "She Loves You" using the first letters
- // BOOST_MSM_EUML_STATE_NAME returns the name of the event type of which StringFind is an instance
- search.get_state<BOOST_MSM_EUML_STATE_NAME(StringFind)&>().get_attribute(m_letters)="Sh";
- // needed to start the highest-level SM. This will call on_entry and mark the start of the SM
- search.start();
- // display all the songs
- for (list<OneSong_impl>::const_iterator it = search.get_attribute(m_tgt_container).begin();
- it != search.get_attribute(m_tgt_container).end();++it)
- {
- cout << "candidate song:" << (*it).get_data() << endl;
- }
- for (list<int>::const_iterator iti = search.get_attribute(m_var2).begin();
- iti != search.get_attribute(m_var2).end();++iti)
- {
- cout << "int in attribute m_var2:" << (*iti) << endl;
- }
- for (set<int>::const_iterator its = search.get_attribute(m_var4).begin();
- its != search.get_attribute(m_var4).end();++its)
- {
- cout << "int in attribute m_var4:" << (*its) << endl;
- }
- cout << "search using more letters" << endl;
- // look for "She Loves You" using more letters
- search.get_state<BOOST_MSM_EUML_STATE_NAME(StringFind)&>().get_attribute(m_letters)="She";
- search.get_attribute(m_tgt_container).clear();
- search.start();
- // display all the songs
- for (list<OneSong_impl>::const_iterator it = search.get_attribute(m_tgt_container).begin();
- it != search.get_attribute(m_tgt_container).end();++it)
- {
- cout << "candidate song:" << (*it).get_data() << endl;
- }
- }
- }
- int main()
- {
- test();
- return 0;
- }
|