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