/////////////////////////////////////////////////////////////////////////////// // noinvoke.hpp // // Copyright 2008 Eric Niebler. 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 #include #include #include #include namespace proto=boost::proto; using proto::_; struct Test : proto::when< _ , proto::noinvoke< // This remove_pointer invocation is bloked by noinvoke boost::remove_pointer< // This add_pointer invocation is *not* blocked by noinvoke boost::add_pointer<_> > >() > {}; struct Test2 : proto::when< _ // This add_pointer gets invoked because a substitution takes place // within it. , boost::add_pointer< proto::noinvoke< // This remove_pointer invocation is bloked by noinvoke boost::remove_pointer< // This add_pointer invocation is *not* blocked by noinvoke boost::add_pointer<_> > > >() > {}; template struct select2nd { typedef U type; }; struct Test3 : proto::when< _ // This add_pointer gets invoked because a substitution takes place // within it. , select2nd< void , proto::noinvoke< // This remove_pointer invocation is bloked by noinvoke select2nd< void // This add_pointer invocation is *not* blocked by noinvoke , boost::add_pointer<_> > > >() > {}; void test_noinvoke() { typedef proto::terminal::type Int; Int i = {42}; BOOST_MPL_ASSERT(( boost::is_same< boost::result_of::type , boost::remove_pointer > )); boost::remove_pointer t = Test()(i); BOOST_MPL_ASSERT(( boost::is_same< boost::result_of::type , boost::remove_pointer * > )); boost::remove_pointer * t2 = Test2()(i); BOOST_MPL_ASSERT(( boost::is_same< boost::result_of::type , select2nd > )); select2nd t3 = Test3()(i); } using namespace boost::unit_test; /////////////////////////////////////////////////////////////////////////////// // init_unit_test_suite // test_suite* init_unit_test_suite( int argc, char* argv[] ) { test_suite *test = BOOST_TEST_SUITE("test proto::noinvoke"); test->add(BOOST_TEST_CASE(&test_noinvoke)); return test; }