williamr@2: // williamr@2: //======================================================================= williamr@2: // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. williamr@2: // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek williamr@2: // williamr@2: // Distributed under the Boost Software License, Version 1.0. (See williamr@2: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: //======================================================================= williamr@2: // williamr@2: williamr@2: #ifndef BOOST_INDIRECT_CMP_HPP williamr@2: #define BOOST_INDIRECT_CMP_HPP williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace boost { williamr@2: williamr@2: //: indirect_cmp williamr@2: // williamr@2: // could also do this with compose_f_gx_hx, and the member binder... williamr@2: // williamr@2: //!category: functors williamr@2: //!component: type williamr@2: //!tparam: ReadablePropertyMap - a model of ReadablePropertyMap williamr@2: //!definition: functor.h williamr@2: template williamr@2: class indirect_cmp { williamr@2: public: williamr@2: typedef typename boost::property_traits::value_type T; williamr@2: typedef typename boost::property_traits::key_type K; williamr@2: typedef K first_argument_type; williamr@2: typedef K second_argument_type; williamr@2: typedef T result_type; williamr@2: inline indirect_cmp(const ReadablePropertyMap& df, const Compare& c = Compare()) williamr@2: : d(df), cmp(c) { } williamr@2: williamr@2: template williamr@2: inline bool williamr@2: operator()(const A& u, const B& v) const { williamr@2: T du = get(d, u), dv = get(d, v); williamr@2: return cmp(du, dv); williamr@2: } williamr@2: protected: williamr@2: ReadablePropertyMap d; williamr@2: Compare cmp; williamr@2: }; williamr@2: williamr@2: template williamr@2: indirect_cmp williamr@2: make_indirect_cmp(const Compare& cmp, ReadablePropertyMap pmap) { williamr@2: indirect_cmp p(pmap, cmp); williamr@2: return p; williamr@2: } williamr@2: williamr@2: template williamr@2: class indirect_pmap { williamr@2: public: williamr@2: typedef typename boost::property_traits::value_type T; williamr@2: typedef typename boost::property_traits::key_type K; williamr@2: typedef K argument_type; williamr@2: typedef T result_type; williamr@2: inline indirect_pmap(const ReadablePropertyMap& df) williamr@2: : d(df) { } williamr@2: williamr@2: inline bool operator()(const K& u) const { williamr@2: return get(d, u); williamr@2: } williamr@2: protected: williamr@2: ReadablePropertyMap d; williamr@2: }; williamr@2: williamr@2: template williamr@2: indirect_pmap williamr@2: make_indirect_pmap(ReadablePropertyMap pmap) { williamr@2: indirect_pmap f(pmap); williamr@2: return f; williamr@2: } williamr@2: williamr@2: williamr@2: } // namespace boost williamr@2: williamr@2: williamr@2: #endif // GGCL_INDIRECT_CMP_HPP