diff options
Diffstat (limited to '3rdParty/Boost/src/boost/mpl/for_each.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/mpl/for_each.hpp | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/mpl/for_each.hpp b/3rdParty/Boost/src/boost/mpl/for_each.hpp new file mode 100644 index 0000000..668ec6a --- /dev/null +++ b/3rdParty/Boost/src/boost/mpl/for_each.hpp @@ -0,0 +1,116 @@ + +#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 49267 2008-10-11 06:19:02Z agurtovoy $ +// $Date: 2008-10-11 02:19:02 -0400 (Sat, 11 Oct 2008) $ +// $Revision: 49267 $ + +#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((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) +{ + 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((first*)0, (last*)0, (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 |