| [29] | 1 | // | 
|---|
 | 2 | //======================================================================= | 
|---|
 | 3 | // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. | 
|---|
 | 4 | // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek | 
|---|
 | 5 | // | 
|---|
 | 6 | // Distributed under the Boost Software License, Version 1.0. (See | 
|---|
 | 7 | // accompanying file LICENSE_1_0.txt or copy at | 
|---|
 | 8 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
 | 9 | //======================================================================= | 
|---|
 | 10 | // | 
|---|
 | 11 |  | 
|---|
 | 12 | #ifndef BOOST_INDIRECT_CMP_HPP | 
|---|
 | 13 | #define BOOST_INDIRECT_CMP_HPP | 
|---|
 | 14 |  | 
|---|
 | 15 | #include <functional> | 
|---|
 | 16 | #include <boost/config.hpp> | 
|---|
 | 17 | #include <boost/property_map.hpp> | 
|---|
 | 18 |  | 
|---|
 | 19 | namespace boost { | 
|---|
 | 20 |  | 
|---|
 | 21 |   //: indirect_cmp | 
|---|
 | 22 |   // | 
|---|
 | 23 |   // could also do this with compose_f_gx_hx, and the member binder... | 
|---|
 | 24 |   // | 
|---|
 | 25 |   //!category: functors | 
|---|
 | 26 |   //!component: type | 
|---|
 | 27 |   //!tparam: ReadablePropertyMap - a model of ReadablePropertyMap | 
|---|
 | 28 |   //!definition: functor.h | 
|---|
 | 29 |   template <class ReadablePropertyMap, class Compare> | 
|---|
 | 30 |   class indirect_cmp { | 
|---|
 | 31 |   public: | 
|---|
 | 32 |     typedef typename boost::property_traits<ReadablePropertyMap>::value_type T; | 
|---|
 | 33 |     typedef typename boost::property_traits<ReadablePropertyMap>::key_type K; | 
|---|
 | 34 |     typedef K first_argument_type; | 
|---|
 | 35 |     typedef K second_argument_type; | 
|---|
 | 36 |     typedef T result_type; | 
|---|
 | 37 |     inline indirect_cmp(const ReadablePropertyMap& df, const Compare& c = Compare()) | 
|---|
 | 38 |       : d(df), cmp(c) { } | 
|---|
 | 39 |  | 
|---|
 | 40 |     template <class A, class B> | 
|---|
 | 41 |     inline bool  | 
|---|
 | 42 |     operator()(const A& u, const B& v) const { | 
|---|
 | 43 |       T du = get(d, u), dv = get(d, v); | 
|---|
 | 44 |       return cmp(du, dv); | 
|---|
 | 45 |     } | 
|---|
 | 46 |   protected: | 
|---|
 | 47 |     ReadablePropertyMap d; | 
|---|
 | 48 |     Compare cmp; | 
|---|
 | 49 |   }; | 
|---|
 | 50 |  | 
|---|
 | 51 |   template <typename Compare, typename ReadablePropertyMap> | 
|---|
 | 52 |   indirect_cmp<ReadablePropertyMap, Compare> | 
|---|
 | 53 |   make_indirect_cmp(const Compare& cmp, ReadablePropertyMap pmap) { | 
|---|
 | 54 |     indirect_cmp<ReadablePropertyMap, Compare> p(pmap, cmp); | 
|---|
 | 55 |     return p; | 
|---|
 | 56 |   } | 
|---|
 | 57 |  | 
|---|
 | 58 |   template <class ReadablePropertyMap> | 
|---|
 | 59 |   class indirect_pmap { | 
|---|
 | 60 |   public: | 
|---|
 | 61 |     typedef typename boost::property_traits<ReadablePropertyMap>::value_type T; | 
|---|
 | 62 |     typedef typename boost::property_traits<ReadablePropertyMap>::key_type K; | 
|---|
 | 63 |     typedef K argument_type; | 
|---|
 | 64 |     typedef T result_type; | 
|---|
 | 65 |     inline indirect_pmap(const ReadablePropertyMap& df) | 
|---|
 | 66 |       : d(df) { } | 
|---|
 | 67 |  | 
|---|
 | 68 |     inline bool operator()(const K& u) const { | 
|---|
 | 69 |       return get(d, u); | 
|---|
 | 70 |     } | 
|---|
 | 71 |   protected: | 
|---|
 | 72 |     ReadablePropertyMap d; | 
|---|
 | 73 |   }; | 
|---|
 | 74 |  | 
|---|
 | 75 |   template <typename ReadablePropertyMap> | 
|---|
 | 76 |   indirect_pmap<ReadablePropertyMap> | 
|---|
 | 77 |   make_indirect_pmap(ReadablePropertyMap pmap) { | 
|---|
 | 78 |     indirect_pmap<ReadablePropertyMap> f(pmap); | 
|---|
 | 79 |     return f; | 
|---|
 | 80 |   } | 
|---|
 | 81 |  | 
|---|
 | 82 |  | 
|---|
 | 83 | } // namespace boost | 
|---|
 | 84 |  | 
|---|
 | 85 |  | 
|---|
 | 86 | #endif // GGCL_INDIRECT_CMP_HPP | 
|---|