Sacado Package Browser (Single Doxygen Collection) Version of the Day
Sacado_mpl_lambda.hpp
Go to the documentation of this file.
00001 // $Id$ 
00002 // $Source$ 
00003 // @HEADER
00004 // ***********************************************************************
00005 // 
00006 //                           Sacado Package
00007 //                 Copyright (2006) Sandia Corporation
00008 // 
00009 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
00010 // the U.S. Government retains certain rights in this software.
00011 // 
00012 // This library is free software; you can redistribute it and/or modify
00013 // it under the terms of the GNU Lesser General Public License as
00014 // published by the Free Software Foundation; either version 2.1 of the
00015 // License, or (at your option) any later version.
00016 //  
00017 // This library is distributed in the hope that it will be useful, but
00018 // WITHOUT ANY WARRANTY; without even the implied warranty of
00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020 // Lesser General Public License for more details.
00021 //  
00022 // You should have received a copy of the GNU Lesser General Public
00023 // License along with this library; if not, write to the Free Software
00024 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00025 // USA
00026 // Questions? Contact David M. Gay (dmgay@sandia.gov) or Eric T. Phipps
00027 // (etphipp@sandia.gov).
00028 // 
00029 // ***********************************************************************
00030 // @HEADER
00031 
00032 #ifndef SACADO_MPL_LAMBDA_HPP
00033 #define SACADO_MPL_LAMBDA_HPP
00034 
00035 #include "Sacado_mpl_bind.hpp"
00036 #include "Sacado_mpl_quote.hpp"
00037 #include "Sacado_mpl_type_wrap.hpp"
00038 #include "Sacado_mpl_is_placeholder.hpp"
00039 
00040 namespace Sacado {
00041 
00042   namespace mpl {
00043 
00044     template <class F> struct lambda : mpl::type_wrap<F> {};
00045     
00046     template <template<class T1> class F, 
00047               class T1> 
00048     struct lambda< F<T1> > : 
00049       mpl_if< is_placeholder< F<T1> >,
00050               type_wrap< bind1< quote1<F>, 
00051                                 typename lambda<T1>::type > >,
00052               type_wrap< F<T1> > > {};
00053 
00054     template <template<class T1, class T2> class F, 
00055               class T1, 
00056               class T2> 
00057     struct lambda< F<T1,T2> > : 
00058       mpl_if< is_placeholder< F<T1,T2> >,
00059               type_wrap< bind2< quote2<F>, 
00060                                 typename lambda<T1>::type, 
00061                                 typename lambda<T2>::type > >,
00062               type_wrap< F<T1,T2> > > {};
00063 
00064     template <template<class T1, class T2, class T3> class F, 
00065               class T1, 
00066               class T2, 
00067               class T3> 
00068     struct lambda< F<T1,T2,T3> > : 
00069       mpl_if< is_placeholder< F<T1,T2,T3> >,
00070               type_wrap< bind3< quote3<F>, 
00071                                 typename lambda<T1>::type, 
00072                                 typename lambda<T2>::type,
00073                                 typename lambda<T3>::type > >,
00074               type_wrap< F<T1,T2,T3> > > {};
00075 
00076     template <template<class T1, class T2, class T3, class T4> class F, 
00077               class T1, 
00078               class T2, 
00079               class T3,
00080               class T4> 
00081     struct lambda< F<T1,T2,T3,T4> > : 
00082       mpl_if< is_placeholder< F<T1,T2,T3,T4> >,
00083               type_wrap< bind4< quote4<F>, 
00084                                 typename lambda<T1>::type, 
00085                                 typename lambda<T2>::type,
00086                                 typename lambda<T3>::type,
00087                                 typename lambda<T4>::type > >,
00088               type_wrap< F<T1,T2,T3,T4> > > {};
00089 
00090     template <template<class T1, class T2, class T3, class T4, class T5> class F, 
00091               class T1, 
00092               class T2, 
00093               class T3,
00094               class T4,
00095               class T5> 
00096     struct lambda< F<T1,T2,T3,T4,T5> > : 
00097       mpl_if< is_placeholder< F<T1,T2,T3,T4,T5> >,
00098               type_wrap< bind5< quote5<F>, 
00099                                 typename lambda<T1>::type, 
00100                                 typename lambda<T2>::type,
00101                                 typename lambda<T3>::type,
00102                                 typename lambda<T4>::type,
00103                                 typename lambda<T5>::type > >,
00104               type_wrap< F<T1,T2,T3,T4,T5> > > {};
00105     
00106   } // namespace mpl
00107 
00108 } // namespace Sacado
00109 
00110 #endif // SACADO_MPL_LAMBDA_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines