PageRenderTime 29ms CodeModel.GetById 8ms app.highlight 15ms RepoModel.GetById 2ms app.codeStats 0ms

/src/contrib/boost/mpl/for_each.hpp

http://pythonocc.googlecode.com/
C++ Header | 116 lines | 84 code | 18 blank | 14 comment | 0 complexity | 49c671acb7526cec4f282eedd17a82de MD5 | raw file
  1
  2#ifndef BOOST_MPL_FOR_EACH_HPP_INCLUDED
  3#define BOOST_MPL_FOR_EACH_HPP_INCLUDED
  4
  5// Copyright Aleksey Gurtovoy 2000-2008
  6//
  7// Distributed under the Boost Software License, Version 1.0. 
  8// (See accompanying file LICENSE_1_0.txt or copy at 
  9// http://www.boost.org/LICENSE_1_0.txt)
 10//
 11// See http://www.boost.org/libs/mpl for documentation.
 12
 13// $Id: for_each.hpp 55648 2009-08-18 05:16:53Z agurtovoy $
 14// $Date: 2009-08-18 01:16:53 -0400 (Tue, 18 Aug 2009) $
 15// $Revision: 55648 $
 16
 17#include <boost/mpl/is_sequence.hpp>
 18#include <boost/mpl/begin_end.hpp>
 19#include <boost/mpl/apply.hpp>
 20#include <boost/mpl/bool.hpp>
 21#include <boost/mpl/next_prior.hpp>
 22#include <boost/mpl/deref.hpp>
 23#include <boost/mpl/identity.hpp>
 24#include <boost/mpl/assert.hpp>
 25#include <boost/mpl/aux_/unwrap.hpp>
 26
 27#include <boost/type_traits/is_same.hpp>
 28#include <boost/utility/value_init.hpp>
 29
 30namespace boost { namespace mpl {
 31
 32namespace aux {
 33
 34template< bool done = true >
 35struct for_each_impl
 36{
 37    template<
 38          typename Iterator
 39        , typename LastIterator
 40        , typename TransformFunc
 41        , typename F
 42        >
 43    static void execute(
 44          Iterator*
 45        , LastIterator*
 46        , TransformFunc*
 47        , F
 48        )
 49    {
 50    }
 51};
 52
 53template<>
 54struct for_each_impl<false>
 55{
 56    template<
 57          typename Iterator
 58        , typename LastIterator
 59        , typename TransformFunc
 60        , typename F
 61        >
 62    static void execute(
 63          Iterator*
 64        , LastIterator*
 65        , TransformFunc* 
 66        , F f
 67        )
 68    {
 69        typedef typename deref<Iterator>::type item;
 70        typedef typename apply1<TransformFunc,item>::type arg;
 71    
 72        // dwa 2002/9/10 -- make sure not to invoke undefined behavior
 73        // when we pass arg.
 74        value_initialized<arg> x;
 75        aux::unwrap(f, 0)(boost::get(x));
 76        
 77        typedef typename mpl::next<Iterator>::type iter;
 78        for_each_impl<boost::is_same<iter,LastIterator>::value>
 79            ::execute( static_cast<iter*>(0), static_cast<LastIterator*>(0), static_cast<TransformFunc*>(0), f);
 80    }
 81};
 82
 83} // namespace aux
 84
 85// agurt, 17/mar/02: pointer default parameters are necessary to workaround 
 86// MSVC 6.5 function template signature's mangling bug
 87template<
 88      typename Sequence
 89    , typename TransformOp
 90    , typename F
 91    >
 92inline
 93void for_each(F f, Sequence* = 0, TransformOp* = 0)
 94{
 95    BOOST_MPL_ASSERT(( is_sequence<Sequence> ));
 96
 97    typedef typename begin<Sequence>::type first;
 98    typedef typename end<Sequence>::type last;
 99
100    aux::for_each_impl< boost::is_same<first,last>::value >
101        ::execute(static_cast<first*>(0), static_cast<last*>(0), static_cast<TransformOp*>(0), f);
102}
103
104template<
105      typename Sequence
106    , typename F
107    >
108inline
109void for_each(F f, Sequence* = 0)
110{
111    for_each<Sequence, identity<> >(f);
112}
113
114}}
115
116#endif // BOOST_MPL_FOR_EACH_HPP_INCLUDED