#ifndef BOOST_MPL_FOR_EACH_HPP_INCLUDED #define BOOST_MPL_FOR_EACH_HPP_INCLUDED // Copyright Aleksey Gurtovoy 2000-2008 // // 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) // // See http://www.boost.org/libs/mpl for documentation. // $Id: for_each.hpp 55648 2009-08-18 05:16:53Z agurtovoy $ // $Date: 2009-08-18 01:16:53 -0400 (Tue, 18 Aug 2009) $ // $Revision: 55648 $ #include <boost/mpl/is_sequence.hpp> #include <boost/mpl/begin_end.hpp> #include <boost/mpl/apply.hpp> #include <boost/mpl/bool.hpp> #include <boost/mpl/next_prior.hpp> #include <boost/mpl/deref.hpp> #include <boost/mpl/identity.hpp> #include <boost/mpl/assert.hpp> #include <boost/mpl/aux_/unwrap.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/utility/value_init.hpp> namespace boost { namespace mpl { namespace aux { template< bool done = true > struct for_each_impl { template< typename Iterator , typename LastIterator , typename TransformFunc , typename F > static void execute( Iterator* , LastIterator* , TransformFunc* , F ) { } }; template<> struct for_each_impl<false> { template< typename Iterator , typename LastIterator , typename TransformFunc , typename F > static void execute( Iterator* , LastIterator* , TransformFunc* , F f ) { typedef typename deref<Iterator>::type item; typedef typename apply1<TransformFunc,item>::type arg; // dwa 2002/9/10 -- make sure not to invoke undefined behavior // when we pass arg. value_initialized<arg> x; aux::unwrap(f, 0)(boost::get(x)); typedef typename mpl::next<Iterator>::type iter; for_each_impl<boost::is_same<iter,LastIterator>::value> ::execute( static_cast<iter*>(0), static_cast<LastIterator*>(0), static_cast<TransformFunc*>(0), f); } }; } // namespace aux // agurt, 17/mar/02: pointer default parameters are necessary to workaround // MSVC 6.5 function template signature's mangling bug template< typename Sequence , typename TransformOp , typename F > inline void for_each(F f, Sequence* = 0, TransformOp* = 0) { BOOST_MPL_ASSERT(( is_sequence<Sequence> )); typedef typename begin<Sequence>::type first; typedef typename end<Sequence>::type last; aux::for_each_impl< boost::is_same<first,last>::value > ::execute(static_cast<first*>(0), static_cast<last*>(0), static_cast<TransformOp*>(0), f); } template< typename Sequence , typename F > inline void for_each(F f, Sequence* = 0) { for_each<Sequence, identity<> >(f); } }} #endif // BOOST_MPL_FOR_EACH_HPP_INCLUDED