3rdParty/boost/1.78.0/libs/assign/doc/email_example.html
// Boost.Assign library // // Copyright Thorsten Ottosen 2003-2004. Use, modification and // distribution is subject to 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) // // For more information, see http://www.boost.org/libs/assign/ // #include \<boost/detail/workaround.hpp\> #if BOOST\_WORKAROUND(\_\_BORLANDC\_\_, BOOST\_TESTED\_AT(0x564))###pragma warn -8091 // suppress warning in Boost.Test###pragma warn -8057 // unused argument argc/argv in Boost.Test#endif #include \<boost/assign/list\_inserter.hpp\>#include \<boost/test/unit\_test.hpp\>#include \<boost/test/test\_tools.hpp\>#include \<boost/function.hpp\>#include \<boost/bind.hpp\>#include \<vector\>#include \<map\> namespace ba = boost::assign; class email{public: enum address\_option { check\_addr\_book, dont\_check\_addr\_book }; typedef std::pair\<std::string,address\_option\> bcc\_type; typedef std::vector\< bcc\_type \> bcc\_map; typedef std::map\<std::string,address\_option\> address\_map; private: mutable address\_map cc\_list; mutable address\_map to\_list; bcc\_map bcc\_list; struct add\_to\_map { address\_map& m; add\_to\_map( address\_map& m ) : m(m) {} void operator()( const std::string& name, address\_option ao ) { m[name] = ao; } void operator()( const std::string& name ) { m[name] = check\_addr\_book; } }; struct add\_to\_vector { bcc\_map& m; add\_to\_vector( bcc\_map& m ) : m(m) {} void operator()( const bcc\_type& r ) { m.push\_back( r ); } }; public: ba::list\_inserter\< add\_to\_map \> add\_cc( std::string name, address\_option ao ) { return ba::make\_list\_inserter( add\_to\_map( cc\_list ) )( name, ao ); } ba::list\_inserter\< add\_to\_map \> add\_to( const std::string& name ) { return ba::make\_list\_inserter( add\_to\_map( to\_list ) )( name ); } ba::list\_inserter\< add\_to\_vector, bcc\_type \> add\_bcc( const bcc\_type& bcc ) { return ba::make\_list\_inserter( add\_to\_vector( bcc\_list ) )( bcc ); } address\_option cc\_at( const std::string& name ) const { return cc\_list[name]; } address\_option to\_at( const std::string& name ) const { return to\_list[name]; } address\_option bcc\_at( unsigned index ) const { return bcc\_list.at( index ).second; }}; void check\_list\_inserter(){ using namespace boost::assign; email e; e.add\_cc( "franz", email::dont\_check\_addr\_book ) ( "hanz", email::check\_addr\_book ) ( "betty", email::dont\_check\_addr\_book ); BOOST\_CHECK\_EQUAL( e.cc\_at( "franz" ), email::dont\_check\_addr\_book ); BOOST\_CHECK\_EQUAL( e.cc\_at( "hanz" ), email::check\_addr\_book ); BOOST\_CHECK\_EQUAL( e.cc\_at( "betty" ), email::dont\_check\_addr\_book ); e.add\_to( "betsy" )( "peter" ); BOOST\_CHECK\_EQUAL( e.cc\_at( "betsy" ), email::check\_addr\_book ); BOOST\_CHECK\_EQUAL( e.cc\_at( "peter" ), email::check\_addr\_book ); e.add\_bcc( email::bcc\_type( "Mr. Foo", email::check\_addr\_book ) ) ( "Mr. Bar", email::dont\_check\_addr\_book ); BOOST\_CHECK\_EQUAL( e.bcc\_at( 0 ), email::check\_addr\_book ); BOOST\_CHECK\_EQUAL( e.bcc\_at( 1 ), email::dont\_check\_addr\_book ); } #include \<boost/test/included/unit\_test\_framework.hpp\> using boost::unit\_test\_framework::test\_suite; test\_suite\* init\_unit\_test\_suite( int argc, char\* argv[] ){ test\_suite\* test = BOOST\_TEST\_SUITE( "List Test Suite" ); test-\>add( BOOST\_TEST\_CASE( &check\_list\_inserter ) ); return test;}