You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
116 lines
2.8 KiB
116 lines
2.8 KiB
|
|
#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
|
|
|