lemon/concept/matrix_maps.h
author alpar
Mon, 24 Oct 2005 15:58:38 +0000
changeset 1738 470aa67893f5
child 1875 98698b69a902
permissions -rw-r--r--
Euler tour iterator.
     1 /* -*- C++ -*-
     2  * lemon/concept/matrix_maps.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 #ifndef LEMON_CONCEPT_MATRIX_MAPS_H
    18 #define LEMON_CONCEPT_MATRIX_MAPS_H
    19 
    20 #include <lemon/utility.h>
    21 #include <lemon/concept_check.h>
    22 
    23 ///\ingroup concept
    24 ///\file
    25 ///\brief MatrixMap concepts checking classes for testing and documenting.
    26 
    27 namespace lemon {
    28 
    29   namespace concept {
    30   
    31     /// \addtogroup concept
    32     /// @{
    33 
    34     /// Readable matrix map concept
    35     template <typename K1, typename K2, typename V>
    36     class ReadMatrixMap
    37     {
    38     public:
    39       /// Map's first key type.
    40       typedef K1 FirstKey;    
    41       /// Map's second key type.
    42       typedef K2 SecondKey;    
    43       /// \brief Map's value type. 
    44       /// (The type of objects associated with the pairs of keys).
    45       typedef V Value;
    46 
    47       // \bug Value don't need to be default constructible.
    48       /// Returns the value associated with a key.
    49       Value operator()(const FirstKey&, const SecondKey&) const {
    50 	return Value();
    51       }
    52 
    53       template <typename _ReadMatrixMap>
    54       struct Constraints {
    55 
    56 	void constraints() {
    57 	  Value val = m(first_key, second_key);
    58 	  val = m(first_key, second_key);
    59 	  typename _ReadMatrixMap::Value own_val = 
    60 	    m(own_first_key, own_second_key); 
    61 	  own_val = m(own_first_key, own_second_key);
    62 	  ignore_unused_variable_warning(val);
    63 	  ignore_unused_variable_warning(own_val);
    64 	}
    65 
    66 	FirstKey& first_key;
    67 	SecondKey& second_key;	
    68 	typename _ReadMatrixMap::FirstKey& own_first_key;
    69 	typename _ReadMatrixMap::SecondKey& own_second_key;
    70 	_ReadMatrixMap& m;
    71       };
    72       
    73     };
    74 
    75 
    76     /// Writable map concept
    77     template <typename K1, typename K2, typename V>
    78     class WriteMatrixMap {
    79     public:
    80       /// Map's first key type.
    81       typedef K1 FirstKey;    
    82       /// Map's second key type.
    83       typedef K2 SecondKey;    
    84       /// \brief Map's value type. 
    85       /// (The type of objects associated with the pairs of keys).
    86       typedef V Value;
    87 
    88       /// Sets the value associated with the pair of keys.
    89       void set(const FirstKey&, const SecondKey& ,const Value&) {}
    90 
    91       template <typename _WriteMatrixMap>
    92       struct Constraints {
    93 	void constraints() {
    94 	  // No constraints for constructor.
    95 	  m.set(first_key, second_key, val);
    96 	  m.set(own_first_key, own_second_key, own_val);
    97 	}
    98 
    99 	Value& val;
   100 	typename _WriteMatrixMap::Value own_val;
   101 	FirstKey& first_key;
   102 	SecondKey& second_key;
   103 	typename _WriteMatrixMap::FirstKey& own_first_key;
   104 	typename _WriteMatrixMap::SecondKey& own_second_key;
   105 	_WriteMatrixMap& m;
   106 
   107       };
   108     };
   109 
   110     ///Read/Writable map concept
   111     template<typename K1, typename K2, typename V>
   112     class ReadWriteMatrixMap 
   113       : public ReadMatrixMap<K1, K2, V>, public WriteMatrixMap<K1, K2, V> {
   114     public:
   115       /// Map's first key type.
   116       typedef K1 FirstKey;    
   117       /// Map's second key type.
   118       typedef K2 SecondKey;    
   119       /// \brief Map's value type. 
   120       /// (The type of objects associated with the pairs of keys).
   121       typedef V Value;
   122 
   123       /// Returns the value associated with a pair of keys.
   124       Value operator()(const FirstKey&, const SecondKey&) const { 
   125 	return Value(); 
   126       }
   127       /// Sets the value associated with the pair of keys.
   128       void set(const FirstKey&, const SecondKey& ,const Value&) {}
   129 
   130       template<typename _ReadWriteMatrixMap>
   131       struct Constraints {
   132 	void constraints() {
   133 	  checkConcept<ReadMatrixMap<K1, K2, V>, _ReadWriteMatrixMap >();
   134 	  checkConcept<WriteMatrixMap<K1, K2, V>, _ReadWriteMatrixMap >();
   135 	}
   136       };
   137     };
   138   
   139   
   140     ///Dereferable matrix map concept
   141     template<typename K1, typename K2, typename V, typename R, typename CR>
   142     class ReferenceMatrixMap : public ReadWriteMatrixMap<K1, K2, V>
   143     {
   144     public:
   145       /// Tag for reference maps.
   146       typedef True ReferenceMapTag;
   147       /// Map's first key type.
   148       typedef K1 FirstKey;    
   149       /// Map's second key type.
   150       typedef K1 SecondKey;    
   151       /// Map's value type. (The type of objects associated with the keys).
   152       typedef V Value;
   153       /// Map's reference type.
   154       typedef R Reference;
   155       /// Map's const reference type.
   156       typedef CR ConstReference;
   157 
   158     protected:
   159       Value tmp;
   160     public:
   161 
   162       ///Returns a reference to the value associated to a pair of keys.
   163       Reference operator()(const FirstKey&, const SecondKey&) { 
   164 	return tmp; 
   165       }
   166       ///Returns a const reference to the value associated to a pair of keys.
   167       ConstReference operator()(const FirstKey&, const SecondKey&) const { 
   168 	return tmp; 
   169       }
   170       /// Sets the value associated with the pair of keys.
   171       void set(const FirstKey&, const SecondKey& ,const Value&) {}
   172 
   173       // \todo rethink this concept
   174       template<typename _ReferenceMatrixMap>
   175       struct ReferenceMapConcept {
   176 
   177 	void constraints() {
   178 	  checkConcept<ReadWriteMatrixMap, _ReferenceMatrixMap >();
   179 	  m(first_key, second_key) = val;
   180 	  val  = m(first_key, second_key);
   181 	  m(first_key, second_key) = ref;
   182 	  ref = m(first_key, second_key);
   183 	  m(own_first_key, own_second_key) = own_val;
   184 	  own_val  = m(own_first_key, own_second_key);
   185 	  m(own_first_key, own_second_key) = own_ref;
   186 	  own_ref = m(own_first_key, own_second_key); 
   187 	}
   188 
   189 	typename _ReferenceMatrixMap::Key& own_first_key;
   190 	typename _ReferenceMatrixMap::Key& own_second_key;
   191 	typename _ReferenceMatrixMap::Value& own_val;
   192 	typename _ReferenceMatrixMap::Reference& own_ref;
   193 	FirstKey& first_key;
   194 	SecondKey& second_key;
   195 	Value& val;
   196 	Reference& ref;
   197 	_ReferenceMatrixMap& m;
   198       };
   199     };
   200 
   201     // @}
   202 
   203   } //namespace concept
   204 } //namespace lemon
   205 #endif // LEMON_CONCEPT_MATRIX_MAPS_H