#ifndef BOOST_MPL_FOR_EACH_HPP_INCLUDED #define BOOST_MPL_FOR_EACH_HPP_INCLUDED // Copyright Aleksey Gurtovoy 2000-2004 // // 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. // $Source$ // $Date: 2004-09-03 21:33:47 -0400 (Fri, 03 Sep 2004) $ // $Revision: 24897 $ #include #include #include #include #include #include #include #include #include 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 { template< typename Iterator , typename LastIterator , typename TransformFunc , typename F > static void execute( Iterator* , LastIterator* , TransformFunc* , F f ) { typedef typename deref::type item; typedef typename apply1::type arg; // dwa 2002/9/10 -- make sure not to invoke undefined behavior // when we pass arg. value_initialized x; aux::unwrap(f, 0)(boost::get(x)); typedef typename mpl::next::type iter; for_each_impl::value> ::execute((iter*)0, (LastIterator*)0, (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) { typedef typename begin::type first; typedef typename end::type last; aux::for_each_impl< boost::is_same::value > ::execute((first*)0, (last*)0, (TransformOp*)0, f); } template< typename Sequence , typename F > inline void for_each(F f, Sequence* = 0) { for_each >(f); } }} #endif // BOOST_MPL_FOR_EACH_HPP_INCLUDED