lemon/bits/extended_pair.h
author ladanyi
Thu, 11 Aug 2005 15:24:24 +0000
changeset 1626 e251336be488
parent 1430 48b4f46f9d4e
permissions -rw-r--r--
Added copyright header and description.
alpar@906
     1
/* -*- C++ -*-
ladanyi@1435
     2
 * lemon/bits/extended_pair.h - Part of LEMON, a generic C++ optimization library
alpar@906
     3
 *
alpar@1164
     4
 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@1359
     5
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@906
     6
 *
alpar@906
     7
 * Permission to use, modify and distribute this software is granted
alpar@906
     8
 * provided that this copyright notice appears in all copies. For
alpar@906
     9
 * precise terms see the accompanying LICENSE file.
alpar@906
    10
 *
alpar@906
    11
 * This software is provided "AS IS" with no warranty of any kind,
alpar@906
    12
 * express or implied, and with no claim as to its suitability for any
alpar@906
    13
 * purpose.
alpar@906
    14
 *
alpar@906
    15
 */
alpar@906
    16
alpar@921
    17
#ifndef LEMON_EXTENDED_PAIR_H
alpar@921
    18
#define LEMON_EXTENDED_PAIR_H
deba@782
    19
deba@1430
    20
///\ingroup misc
deba@1430
    21
///\file
deba@1430
    22
///\brief A more customizable pair type than std::pair.
deba@782
    23
deba@1430
    24
namespace lemon {
deba@1430
    25
  
deba@1430
    26
  /// \brief A more customizable pair type than std::pair.
deba@1430
    27
  ///
deba@1430
    28
  /// This type is a customizable pair type. The main goal
deba@1430
    29
  /// is that the constructor's parameter type does not depend
deba@1430
    30
  /// on the stored data type. This way it is possible to store
deba@1430
    31
  /// references in the extended_pair.
deba@1430
    32
  /// \code
deba@1430
    33
  /// int a; char b;
deba@1430
    34
  /// typedef extended_pair<int&, int&, char&, char&> ICPair;
deba@1430
    35
  /// ICPair p(a, b); 
deba@1430
    36
  /// // like a real reference to an std::pair<int, char>
deba@1430
    37
  /// // but the pair does not exist
deba@1430
    38
  /// p.first = 42;
deba@1430
    39
  /// p.second = '@';
deba@1430
    40
  /// \endcode
deba@1430
    41
  /// \param T1 The type of first.
deba@1430
    42
  /// \param A1 The parameter type for first.
deba@1430
    43
  /// \param T2 The type of second.
deba@1430
    44
  /// \param A2 The parameter type for second.
deba@1430
    45
  template <typename T1, typename A1, typename T2, typename A2>
deba@1430
    46
  struct extended_pair {
deba@1430
    47
    /// \brief The type of first.
deba@1430
    48
    ///
deba@1430
    49
    /// The type of first.
deba@1430
    50
    typedef T1 first_type;
deba@1430
    51
    /// \brief The type of second.
deba@1430
    52
    ///
deba@1430
    53
    /// The type of second.
deba@1430
    54
    typedef T2 second_type;
deba@782
    55
deba@1430
    56
    /// \brief Default constructor.
deba@1430
    57
    ///
deba@1430
    58
    /// Default constructor. It calls the default constructor of
deba@1430
    59
    /// first and second.
deba@1430
    60
    extended_pair() : first(), second() {}
deba@782
    61
deba@1430
    62
    /// \brief Constructor.
deba@1430
    63
    ///
deba@1430
    64
    /// Constructor. 
deba@1430
    65
    extended_pair(A1 f, A2 s) : first(f), second(s) {}
deba@782
    66
deba@1430
    67
    /// \brief Template constructor.
deba@1430
    68
    ///
deba@1430
    69
    /// Template constructor. It copies everything which has
deba@1430
    70
    /// \c first and \c second member.
deba@1430
    71
    template <class Pair>
deba@1430
    72
    extended_pair(const Pair& pair) : first(pair.first), second(pair.second) {}
deba@782
    73
deba@1430
    74
    /// \brief The first value
deba@1430
    75
    /// 
deba@1430
    76
    /// The first value
deba@1430
    77
    T1 first;
deba@1430
    78
    /// \brief The second value
deba@1430
    79
    /// 
deba@1430
    80
    /// The second value
deba@1430
    81
    T2 second;
deba@1430
    82
  };
deba@1430
    83
deba@1430
    84
  /// \brief Equality operator
deba@1430
    85
  /// 
deba@1430
    86
  /// Equality operator
deba@1430
    87
  template <typename T1, typename T2, 
deba@1430
    88
	    typename LA1, typename LA2, typename RA1, typename RA2>
deba@1430
    89
  bool operator==(const extended_pair<T1, LA1, T2, LA2>& left, 
deba@1430
    90
		  const extended_pair<T1, RA1, T2, RA2>& right) {
deba@1430
    91
    return left.first == right.first && left.second == right.second;
deba@1430
    92
  }
deba@1430
    93
deba@1430
    94
  /// \brief Inequality operator.
deba@1430
    95
  /// 
deba@1430
    96
  /// Inequality operator.
deba@1430
    97
  template <typename T1, typename T2, 
deba@1430
    98
	    typename LA1, typename LA2, typename RA1, typename RA2>
deba@1430
    99
  bool operator!=(const extended_pair<T1, LA1, T2, LA2>& left, 
deba@1430
   100
		  const extended_pair<T1, RA1, T2, RA2>& right) {
deba@1430
   101
    return  !(left == right);
deba@1430
   102
  }
deba@1430
   103
deba@1430
   104
  /// \brief Less operator.
deba@1430
   105
  /// 
deba@1430
   106
  /// Less operator.
deba@1430
   107
  template <typename T1, typename T2, 
deba@1430
   108
	    typename LA1, typename LA2, typename RA1, typename RA2>
deba@1430
   109
  bool operator<(const extended_pair<T1, LA1, T2, LA2>& left, 
deba@1430
   110
		 const extended_pair<T1, RA1, T2, RA2>& right) {
deba@1430
   111
    return left.first < right.first || 
deba@1430
   112
      (!(right.first<left.first) && left.second < right.second);
deba@1430
   113
  }
deba@1430
   114
deba@1430
   115
  /// \brief Greater operator.
deba@1430
   116
  /// 
deba@1430
   117
  /// Greater operator.
deba@1430
   118
  template <typename T1, typename T2, 
deba@1430
   119
	    typename LA1, typename LA2, typename RA1, typename RA2>
deba@1430
   120
  bool operator>(const extended_pair<T1, LA1, T2, LA2>& left, 
deba@1430
   121
		 const extended_pair<T1, RA1, T2, RA2>& right) {
deba@1430
   122
    return right < left;
deba@1430
   123
  }
deba@1430
   124
deba@1430
   125
  /// \brief Less or equal operator.
deba@1430
   126
  /// 
deba@1430
   127
  /// Less or equal operator.
deba@1430
   128
  template <typename T1, typename T2, 
deba@1430
   129
	    typename LA1, typename LA2, typename RA1, typename RA2>
deba@1430
   130
  bool operator<=(const extended_pair<T1, LA1, T2, LA2>& left, 
deba@1430
   131
		  const extended_pair<T1, RA1, T2, RA2>& right) {
deba@1430
   132
    return !(right > left);
deba@1430
   133
  }
deba@1430
   134
deba@1430
   135
  /// \brief Greater or equal operator.
deba@1430
   136
  /// 
deba@1430
   137
  /// Greater or equal operator.
deba@1430
   138
  template <typename T1, typename T2, 
deba@1430
   139
	    typename LA1, typename LA2, typename RA1, typename RA2>
deba@1430
   140
  bool operator>=(const extended_pair<T1, LA1, T2, LA2>& left, 
deba@1430
   141
		  const extended_pair<T1, RA1, T2, RA2>& right) {
deba@1430
   142
    return !(right < left);
deba@1430
   143
  }
deba@1430
   144
deba@782
   145
}
deba@782
   146
#endif