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