2 * lemon/concept/matrix_maps.h - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Research Group on Combinatorial Optimization, EGRES).
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.
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
17 #ifndef LEMON_CONCEPT_MATRIX_MAPS_H
18 #define LEMON_CONCEPT_MATRIX_MAPS_H
20 #include <lemon/utility.h>
21 #include <lemon/concept_check.h>
25 ///\brief MatrixMap concepts checking classes for testing and documenting.
31 /// \addtogroup concept
34 /// Readable matrix map concept
35 template <typename K1, typename K2, typename V>
39 /// Map's first key type.
41 /// Map's second key type.
43 /// \brief Map's value type.
44 /// (The type of objects associated with the pairs of keys).
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 {
53 template <typename _ReadMatrixMap>
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);
67 SecondKey& second_key;
68 typename _ReadMatrixMap::FirstKey& own_first_key;
69 typename _ReadMatrixMap::SecondKey& own_second_key;
76 /// Writable map concept
77 template <typename K1, typename K2, typename V>
78 class WriteMatrixMap {
80 /// Map's first key type.
82 /// Map's second key type.
84 /// \brief Map's value type.
85 /// (The type of objects associated with the pairs of keys).
88 /// Sets the value associated with the pair of keys.
89 void set(const FirstKey&, const SecondKey& ,const Value&) {}
91 template <typename _WriteMatrixMap>
94 // No constraints for constructor.
95 m.set(first_key, second_key, val);
96 m.set(own_first_key, own_second_key, own_val);
100 typename _WriteMatrixMap::Value own_val;
102 SecondKey& second_key;
103 typename _WriteMatrixMap::FirstKey& own_first_key;
104 typename _WriteMatrixMap::SecondKey& own_second_key;
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> {
115 /// Map's first key type.
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).
123 /// Returns the value associated with a pair of keys.
124 Value operator()(const FirstKey&, const SecondKey&) const {
127 /// Sets the value associated with the pair of keys.
128 void set(const FirstKey&, const SecondKey& ,const Value&) {}
130 template<typename _ReadWriteMatrixMap>
133 checkConcept<ReadMatrixMap<K1, K2, V>, _ReadWriteMatrixMap >();
134 checkConcept<WriteMatrixMap<K1, K2, V>, _ReadWriteMatrixMap >();
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>
145 /// Tag for reference maps.
146 typedef True ReferenceMapTag;
147 /// Map's first key type.
149 /// Map's second key type.
150 typedef K1 SecondKey;
151 /// Map's value type. (The type of objects associated with the keys).
153 /// Map's reference type.
155 /// Map's const reference type.
156 typedef CR ConstReference;
162 ///Returns a reference to the value associated to a pair of keys.
163 Reference operator()(const FirstKey&, const SecondKey&) {
166 ///Returns a const reference to the value associated to a pair of keys.
167 ConstReference operator()(const FirstKey&, const SecondKey&) const {
170 /// Sets the value associated with the pair of keys.
171 void set(const FirstKey&, const SecondKey& ,const Value&) {}
173 // \todo rethink this concept
174 template<typename _ReferenceMatrixMap>
175 struct ReferenceMapConcept {
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);
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;
194 SecondKey& second_key;
197 _ReferenceMatrixMap& m;
203 } //namespace concept
205 #endif // LEMON_CONCEPT_MATRIX_MAPS_H