1 /*============================================================================= 2 Copyright (c) 2003 Joel de Guzman 3 Copyright (c) 2004 Peder Holt 4 5 Use, modification and distribution is subject to the Boost Software 6 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 7 http://www.boost.org/LICENSE_1_0.txt) 8 ==============================================================================*/ 9 #if !defined(FUSION_ALGORITHM_FIND_HPP) 10 #define FUSION_ALGORITHM_FIND_HPP 11 12 #include <boost/spirit/fusion/algorithm/detail/find_if.ipp> 13 #include <boost/spirit/fusion/sequence/begin.hpp> 14 #include <boost/spirit/fusion/sequence/end.hpp> 15 #include <boost/type_traits/is_same.hpp> 16 17 namespace boost { namespace fusion 18 { 19 namespace meta 20 { 21 template <typename Sequence, typename T> 22 struct find 23 { 24 typedef typename 25 detail::static_find_if< 26 typename meta::begin<Sequence>::type 27 , typename meta::end<Sequence>::type 28 , is_same<mpl::_, T> 29 >::type 30 type; 31 }; 32 } 33 34 namespace function 35 { 36 struct find 37 { 38 template <typename Sequence, typename T> 39 struct apply : meta::find<Sequence, T> {}; 40 41 template <typename Sequence, typename T> 42 typename apply<Sequence const, typename T::type>::type operator ()boost::fusion::function::find43 operator()(Sequence const& seq, T) const 44 { 45 typedef 46 detail::static_find_if< 47 BOOST_DEDUCED_TYPENAME meta::begin<Sequence const>::type 48 , BOOST_DEDUCED_TYPENAME meta::end<Sequence const>::type 49 , is_same<mpl::_, BOOST_DEDUCED_TYPENAME T::type> 50 > 51 filter; 52 53 return filter::call(fusion::begin(seq)); 54 } 55 56 template <typename Sequence, typename T> 57 typename apply<Sequence, typename T::type>::type operator ()boost::fusion::function::find58 operator()(Sequence& seq, T) const 59 { 60 typedef 61 detail::static_find_if< 62 BOOST_DEDUCED_TYPENAME meta::begin<Sequence>::type 63 , BOOST_DEDUCED_TYPENAME meta::end<Sequence>::type 64 , is_same<mpl::_, BOOST_DEDUCED_TYPENAME T::type> 65 > 66 filter; 67 68 return filter::call(fusion::begin(seq)); 69 } 70 }; 71 } 72 73 function::find const find = function::find(); 74 }} 75 76 #endif 77 78