diff --git a/include/boost/mpl/deref.hpp b/include/boost/mpl/deref.hpp new file mode 100644 index 0000000..0695ecc --- /dev/null +++ b/include/boost/mpl/deref.hpp @@ -0,0 +1,48 @@ +//----------------------------------------------------------------------------- +// boost mpl/deref.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2002-03 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_DEREF_HPP_INCLUDED +#define BOOST_MPL_DEREF_HPP_INCLUDED + +#include "boost/mpl/aux_/void_spec.hpp" +#include "boost/mpl/aux_/lambda_support.hpp" +#include "boost/mpl/aux_/config/eti.hpp" + +namespace boost { +namespace mpl { + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Iterator) + > +struct deref +{ + typedef typename Iterator::type type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,deref,(Iterator)) +}; + +#if defined(BOOST_MPL_MSVC_ETI_BUG) +template<> struct deref +{ + typedef int type; +}; +#endif + +BOOST_MPL_AUX_VOID_SPEC(1, deref) + +} // namespace mpl +} // namespace boost + +#endif // BOOST_MPL_DEREF_HPP_INCLUDED diff --git a/include/boost/mpl/select2nd.hpp b/include/boost/mpl/select2nd.hpp index 7a0360a..2637579 100644 --- a/include/boost/mpl/select2nd.hpp +++ b/include/boost/mpl/select2nd.hpp @@ -3,7 +3,7 @@ // See http://www.boost.org for updates, documentation, and revision history. //----------------------------------------------------------------------------- // -// Copyright (c) 2000-02 +// Copyright (c) 2000-03 // Aleksey Gurtovoy // // Permission to use, copy, modify, distribute and sell this software @@ -17,20 +17,30 @@ #ifndef BOOST_MPL_SELECT2ND_HPP_INCLUDED #define BOOST_MPL_SELECT2ND_HPP_INCLUDED -#include "boost/mpl/aux_/lambda_spec.hpp" +#include "boost/mpl/aux_/void_spec.hpp" +#include "boost/mpl/aux_/lambda_support.hpp" +#include "boost/mpl/aux_/config/eti.hpp" namespace boost { namespace mpl { template< - typename Pair + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Pair) > struct select2nd { typedef typename Pair::second type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(1,select2nd,(Pair)) }; -BOOST_MPL_AUX_LAMBDA_SPEC(1, select2nd) +#if defined(BOOST_MPL_MSVC_60_ETI_BUG) +template<> struct select2nd +{ + typedef int type; +}; +#endif + +BOOST_MPL_AUX_VOID_SPEC(1, select2nd) } // namespace mpl } // namespace boost diff --git a/include/boost/mpl/switch.hpp b/include/boost/mpl/switch.hpp new file mode 100644 index 0000000..45d5fea --- /dev/null +++ b/include/boost/mpl/switch.hpp @@ -0,0 +1,55 @@ +//----------------------------------------------------------------------------- +// boost mpl/switch.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2003 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_SWITCH_HPP_INCLUDED +#define BOOST_MPL_SWITCH_HPP_INCLUDED + +#include "boost/mpl/find_if.hpp" +#include "boost/mpl/select1st.hpp" +#include "boost/mpl/select2nd.hpp" +#include "boost/mpl/deref.hpp" +#include "boost/mpl/lambda.hpp" +#include "boost/mpl/apply.hpp" +#include "boost/mpl/aux_/void_spec.hpp" +#include "boost/mpl/aux_/lambda_support.hpp" + +namespace boost { +namespace mpl { + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Body) + , typename BOOST_MPL_AUX_VOID_SPEC_PARAM(T) + > +struct switch_ +{ + typedef typename find_if< + Body + , apply1< lambda< select1st<_1> >, T > + >::type iter_; + + typedef typename deref::type pair_; + typedef typename lambda< typename select2nd::type >::type f_; + typedef typename apply1::type type; + + BOOST_MPL_AUX_LAMBDA_SUPPORT(2,switch_,(Body,T)) +}; + +BOOST_MPL_AUX_VOID_SPEC(2, switch_) + +} // namespace mpl +} // namespace boost + +#endif // BOOST_MPL_SWITCH_HPP_INCLUDED