123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- /*=============================================================================
- For Boost Bind:
- Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.
- Copyright (c) 2001 David Abrahams
- Copyright (c) 2005 Peter Dimov
- For Boost Phoenix:
- Copyright (c) 2001-2010 Joel de Guzman
- Copyright (c) 2010 Thomas Heller
- For the example:
- Copyright (c) 2011 Paul Heil
- Copyright (c) 2015 John Fletcher
- 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)
- ==============================================================================*/
- // bind_goose.cpp
- // This example is based on code by Paul Heil to be found here:
- // http://www.codeproject.com/Tips/248492/How-does-boost-phoenix-improve-boost-bind
- //
- // Show different ways of using boost bind and phoenix to handle deletion.
- //
- #include <iostream>
- #include <boost/function.hpp>
- #include <boost/bind.hpp>
- #include <boost/phoenix/core.hpp>
- #include <boost/phoenix/bind.hpp>
- #include <boost/phoenix/operator/comparison.hpp>
- #include <boost/phoenix/stl/algorithm/transformation.hpp>
- #include <functional>
- #include <string>
- #include <vector>
- ////////////////////////////////////////////
- // Set up the list here
- ////////////////////////////////////////////
- std::vector< std::string > make_list() {
- std::vector< std::string > list;
- list.push_back( "duck" );
- list.push_back( "duck" );
- list.push_back( "goose" );
- return list;
- }
- //////////////////////////////////////////////
- // First example using standard library only
- //////////////////////////////////////////////
- bool IsGoose( const std::string& s )
- {
- return s == "goose";
- }
- void delete_value1(std::vector< std::string > &list )
- {
- list.erase( std::remove_if( list.begin(), list.end(), IsGoose ), list.end() );
- }
- void out_string(const std::string &s)
- {
- std::cout << s << std::endl;
- }
- void show_list1( const std::vector< std::string > &list )
- {
- std::for_each(list.begin(), list.end(), out_string);
- }
- //////////////////////////////////////////////
- // Second example using boost bind
- //////////////////////////////////////////////
- bool isValue(const std::string &s1, const std::string &s2)
- {
- return s1==s2;
- }
- void delete_value2(std::vector< std::string > &list, const std::string & value)
- {
- list.erase(
- std::remove_if(
- list.begin(),
- list.end(),
- boost::bind(
- isValue, // &isValue works as well.
- _1, // Boost.Bind placeholder
- boost::cref( value ) ) ),
- list.end() );
- }
- ///////////////////////////////////////////////////////
- // Third example using boost phoenix for the comparison
- ///////////////////////////////////////////////////////
- namespace phx = boost::phoenix;
- using phx::placeholders::arg1;
- using phx::placeholders::arg2;
- void delete_value3(std::vector< std::string > &list, const std::string & value)
- {
- list.erase( std::remove_if(
- list.begin(),
- list.end(),
- // This needs header boost/phoenix/operator/comparison.
- // arg1 is a Boost.Phoenix placeholder.
- arg1 == phx::cref( value ) ),
- list.end() );
- }
- //////////////////////////////////////////////////////////////
- // Third example using boost phoenix for the algorithm as well
- //////////////////////////////////////////////////////////////
- void delete_value4(std::vector< std::string > &list, const std::string & value)
- {
- // This need header boost/phoenix/stl/algorithm/transformation
- list.erase( phx::remove_if( arg1, arg2 )
- ( list, arg1 == phx::cref( value ) ),
- list.end() );
- }
- int main() {
- std::cout << "--------------------------------" << std::endl;
- std::cout << "Delete the goose examples." << std::endl;
- std::cout << "--------------------------------" << std::endl;
- std::string value = "goose";
- std::vector< std::string > list1 = make_list();
- delete_value1(list1);
- show_list1(list1);
- std::cout << "--------------------------------" << std::endl;
- std::vector< std::string > list2 = make_list();
- delete_value2(list2,value);
- show_list1(list2);
- std::cout << "--------------------------------" << std::endl;
- std::vector< std::string > list3 = make_list();
- delete_value3(list3,value);
- show_list1(list3);
- std::cout << "--------------------------------" << std::endl;
- std::vector< std::string > list4 = make_list();
- delete_value4(list4,value);
- show_list1(list4);
- std::cout << "--------------------------------" << std::endl;
- return 0;
- }
|