|
1 |
|
2 #ifndef BOOST_MPL_MAX_ELEMENT_HPP_INCLUDED |
|
3 #define BOOST_MPL_MAX_ELEMENT_HPP_INCLUDED |
|
4 |
|
5 // Copyright Aleksey Gurtovoy 2000-2004 |
|
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 // $Source: /cvsroot/boost/boost/boost/mpl/max_element.hpp,v $ |
|
14 // $Date: 2004/09/02 15:40:41 $ |
|
15 // $Revision: 1.7 $ |
|
16 |
|
17 #include <boost/mpl/less.hpp> |
|
18 #include <boost/mpl/iter_fold.hpp> |
|
19 #include <boost/mpl/begin_end.hpp> |
|
20 #include <boost/mpl/if.hpp> |
|
21 #include <boost/mpl/deref.hpp> |
|
22 #include <boost/mpl/apply.hpp> |
|
23 #include <boost/mpl/aux_/common_name_wknd.hpp> |
|
24 #include <boost/mpl/aux_/na_spec.hpp> |
|
25 |
|
26 namespace boost { namespace mpl { |
|
27 |
|
28 BOOST_MPL_AUX_COMMON_NAME_WKND(max_element) |
|
29 |
|
30 namespace aux { |
|
31 |
|
32 template< typename Predicate > |
|
33 struct select_max |
|
34 { |
|
35 template< typename OldIterator, typename Iterator > |
|
36 struct apply |
|
37 { |
|
38 typedef typename apply2< |
|
39 Predicate |
|
40 , typename deref<OldIterator>::type |
|
41 , typename deref<Iterator>::type |
|
42 >::type condition_; |
|
43 |
|
44 typedef typename if_< |
|
45 condition_ |
|
46 , Iterator |
|
47 , OldIterator |
|
48 >::type type; |
|
49 }; |
|
50 }; |
|
51 |
|
52 } // namespace aux |
|
53 |
|
54 |
|
55 template< |
|
56 typename BOOST_MPL_AUX_NA_PARAM(Sequence) |
|
57 , typename Predicate = less<_,_> |
|
58 > |
|
59 struct max_element |
|
60 : iter_fold< |
|
61 Sequence |
|
62 , typename begin<Sequence>::type |
|
63 , protect< aux::select_max<Predicate> > |
|
64 > |
|
65 { |
|
66 }; |
|
67 |
|
68 BOOST_MPL_AUX_NA_SPEC(1, max_element) |
|
69 |
|
70 }} |
|
71 |
|
72 #endif // BOOST_MPL_MAX_ELEMENT_HPP_INCLUDED |