gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Fixes in the map concepts - Now Value type needn't be default constructible. - Extend the test file to check this.
0 2 0
default
2 files changed with 22 insertions and 9 deletions:
↑ Collapse diff ↑
Show white space 96 line context
... ...
@@ -2,208 +2,211 @@
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CONCEPT_MAPS_H
20 20
#define LEMON_CONCEPT_MAPS_H
21 21

	
22 22
#include <lemon/bits/utility.h>
23 23
#include <lemon/concept_check.h>
24 24

	
25 25
///\ingroup concept
26 26
///\file
27 27
///\brief Map concepts checking classes for testing and documenting.
28 28

	
29 29
namespace lemon {
30 30

	
31 31
  namespace concepts {
32 32

	
33 33
    /// \addtogroup concept
34 34
    /// @{
35 35

	
36 36
    /// Readable map concept
37 37

	
38 38
    /// Readable map concept.
39 39
    ///
40 40
    template<typename K, typename T>
41 41
    class ReadMap
42 42
    {
43 43
    public:
44 44
      /// The key type of the map.
45 45
      typedef K Key;
46 46
      /// The value type of the map. (The type of objects associated with the keys).
47 47
      typedef T Value;
48 48

	
49 49
      /// Returns the value associated with the given key.
50

	
51
      /// Returns the value associated with the given key.
52
      /// \bug Value shouldn't need to be default constructible. 
53
      Value operator[](const Key &) const { return Value(); }
50
      Value operator[](const Key &) const { 
51
        return *static_cast<Value *>(0);
52
      }
54 53

	
55 54
      template<typename _ReadMap>
56 55
      struct Constraints {
57 56
	void constraints() {
58 57
	  Value val = m[key];
59 58
	  val = m[key];
60 59
	  typename _ReadMap::Value own_val = m[own_key];
61 60
	  own_val = m[own_key];
62 61

	
63 62
	  ignore_unused_variable_warning(key);
64 63
	  ignore_unused_variable_warning(val);
65 64
	  ignore_unused_variable_warning(own_key);
66 65
	  ignore_unused_variable_warning(own_val);
67 66
	}
68 67
	const Key& key;
69 68
	const typename _ReadMap::Key& own_key;
70 69
	const _ReadMap& m;
71 70
      };
72 71

	
73 72
    };
74 73

	
75 74

	
76 75
    /// Writable map concept
77 76

	
78 77
    /// Writable map concept.
79 78
    ///
80 79
    template<typename K, typename T>
81 80
    class WriteMap
82 81
    {
83 82
    public:
84 83
      /// The key type of the map.
85 84
      typedef K Key;
86 85
      /// The value type of the map. (The type of objects associated with the keys).
87 86
      typedef T Value;
88 87

	
89 88
      /// Sets the value associated with the given key.
90 89
      void set(const Key &, const Value &) {}
91 90

	
92 91
      /// Default constructor.
93 92
      WriteMap() {}
94 93

	
95 94
      template <typename _WriteMap>
96 95
      struct Constraints {
97 96
	void constraints() {
98 97
	  m.set(key, val);
99 98
	  m.set(own_key, own_val);
100 99

	
101 100
	  ignore_unused_variable_warning(key);
102 101
	  ignore_unused_variable_warning(val);
103 102
	  ignore_unused_variable_warning(own_key);
104 103
	  ignore_unused_variable_warning(own_val);
105 104
	}
106 105
	const Key& key;
107 106
	const Value& val;
108 107
	const typename _WriteMap::Key& own_key;
109 108
	const typename _WriteMap::Value own_val;
110 109
	_WriteMap& m;
111 110
      };
112 111
    };
113 112

	
114 113
    /// Read/writable map concept
115 114

	
116 115
    /// Read/writable map concept.
117 116
    ///
118 117
    template<typename K, typename T>
119 118
    class ReadWriteMap : public ReadMap<K,T>,
120 119
			 public WriteMap<K,T>
121 120
    {
122 121
    public:
123 122
      /// The key type of the map.
124 123
      typedef K Key;
125 124
      /// The value type of the map. (The type of objects associated with the keys).
126 125
      typedef T Value;
127 126

	
128 127
      /// Returns the value associated with the given key.
129
      Value operator[](const Key &) const { return Value(); }
128
      Value operator[](const Key &) const { 
129
        return *static_cast<Value *>(0);
130
      }
130 131

	
131 132
      /// Sets the value associated with the given key.
132 133
      void set(const Key &, const Value &) {}
133 134

	
134 135
      template<typename _ReadWriteMap>
135 136
      struct Constraints {
136 137
	void constraints() {
137 138
	  checkConcept<ReadMap<K, T>, _ReadWriteMap >();
138 139
	  checkConcept<WriteMap<K, T>, _ReadWriteMap >();
139 140
	}
140 141
      };
141 142
    };
142 143

	
143 144

	
144 145
    /// Dereferable map concept
145 146

	
146 147
    /// Dereferable map concept.
147 148
    ///
148 149
    template<typename K, typename T, typename R, typename CR>
149 150
    class ReferenceMap : public ReadWriteMap<K,T>
150 151
    {
151 152
    public:
152 153
      /// Tag for reference maps.
153 154
      typedef True ReferenceMapTag;
154 155
      /// The key type of the map.
155 156
      typedef K Key;
156 157
      /// The value type of the map. (The type of objects associated with the keys).
157 158
      typedef T Value;
158 159
      /// The reference type of the map.
159 160
      typedef R Reference;
160 161
      /// The const reference type of the map.
161 162
      typedef CR ConstReference;
162 163

	
163
    protected:
164
      Value tmp;
165 164
    public:
166 165

	
167 166
      /// Returns a reference to the value associated with the given key.
168
      Reference operator[](const Key &) { return tmp; }
167
      Reference operator[](const Key &) { 
168
        return *static_cast<Value *>(0);
169
      }
169 170

	
170 171
      /// Returns a const reference to the value associated with the given key.
171
      ConstReference operator[](const Key &) const { return tmp; }
172
      ConstReference operator[](const Key &) const {
173
        return *static_cast<Value *>(0);
174
      }
172 175

	
173 176
      /// Sets the value associated with the given key.
174 177
      void set(const Key &k,const Value &t) { operator[](k)=t; }
175 178

	
176 179
      template<typename _ReferenceMap>
177 180
      struct Constraints {
178 181
	void constraints() {
179 182
	  checkConcept<ReadWriteMap<K, T>, _ReferenceMap >();
180 183
	  ref = m[key];
181 184
	  m[key] = val;
182 185
	  m[key] = ref;
183 186
	  m[key] = cref;
184 187
	  own_ref = m[own_key];
185 188
	  m[own_key] = own_val;
186 189
	  m[own_key] = own_ref;
187 190
	  m[own_key] = own_cref;
188 191
	  m[key] = m[own_key];
189 192
	  m[own_key] = m[key];
190 193
	}
191 194
	const Key& key;
192 195
	Value& val;
193 196
	Reference ref;
194 197
	ConstReference cref;
195 198
	const typename _ReferenceMap::Key& own_key;
196 199
	typename _ReferenceMap::Value& own_val;
197 200
	typename _ReferenceMap::Reference own_ref;
198 201
	typename _ReferenceMap::ConstReference own_cref;
199 202
	_ReferenceMap& m;
200 203
      };
201 204
    };
202 205

	
203 206
    // @}
204 207

	
205 208
  } //namespace concepts
206 209

	
207 210
} //namespace lemon
208 211

	
209 212
#endif // LEMON_CONCEPT_MAPS_H
Show white space 96 line context
1 1
/* -*- C++ -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#include <deque>
20 20
#include <set>
21 21

	
22 22
#include <lemon/concept_check.h>
23 23
#include <lemon/concepts/maps.h>
24 24
#include <lemon/maps.h>
25 25

	
26 26
#include "test_tools.h"
27 27

	
28 28
using namespace lemon;
29 29
using namespace lemon::concepts;
30 30

	
31 31
struct A {};
32 32
inline bool operator<(A, A) { return true; }
33 33
struct B {};
34 34

	
35
class C {
36
  int x;
37
public:
38
  C(int _x) : x(_x) {}
39
};
40

	
35 41
class F {
36 42
public:
37 43
  typedef A argument_type;
38 44
  typedef B result_type;
39 45

	
40 46
  B operator()(const A&) const { return B(); }
41 47
private:
42 48
  F& operator=(const F&);
43 49
};
44 50

	
45 51
int func(A) { return 3; }
46 52

	
47 53
int binc(int a, B) { return a+1; }
48 54

	
49 55
typedef ReadMap<A, double> DoubleMap;
50 56
typedef ReadWriteMap<A, double> DoubleWriteMap;
51 57
typedef ReferenceMap<A, double, double&, const double&> DoubleRefMap;
52 58

	
53 59
typedef ReadMap<A, bool> BoolMap;
54 60
typedef ReadWriteMap<A, bool> BoolWriteMap;
55 61
typedef ReferenceMap<A, bool, bool&, const bool&> BoolRefMap;
56 62

	
57 63
int main()
58 64
{
59 65
  // Map concepts
60 66
  checkConcept<ReadMap<A,B>, ReadMap<A,B> >();
67
  checkConcept<ReadMap<A,C>, ReadMap<A,C> >();
61 68
  checkConcept<WriteMap<A,B>, WriteMap<A,B> >();
69
  checkConcept<WriteMap<A,C>, WriteMap<A,C> >();
62 70
  checkConcept<ReadWriteMap<A,B>, ReadWriteMap<A,B> >();
71
  checkConcept<ReadWriteMap<A,C>, ReadWriteMap<A,C> >();
63 72
  checkConcept<ReferenceMap<A,B,B&,const B&>, ReferenceMap<A,B,B&,const B&> >();
73
  checkConcept<ReferenceMap<A,C,C&,const C&>, ReferenceMap<A,C,C&,const C&> >();
64 74

	
65 75
  // NullMap
66 76
  {
67 77
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
68 78
    NullMap<A,B> map1;
69 79
    NullMap<A,B> map2 = map1;
70 80
    map1 = nullMap<A,B>();
71 81
  }
72 82

	
73 83
  // ConstMap
74 84
  {
75 85
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
76 86
    ConstMap<A,B> map1;
77 87
    ConstMap<A,B> map2(B());
78 88
    ConstMap<A,B> map3 = map1;
79 89
    map1 = constMap<A>(B());
80 90
    map1.setAll(B());
81 91

	
82 92
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,int> >();
83 93
    check(constMap<A>(10)[A()] == 10, "Something is wrong with ConstMap");
84 94

	
85 95
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
86 96
    ConstMap<A,Const<int,10> > map4;
87 97
    ConstMap<A,Const<int,10> > map5 = map4;
88 98
    map4 = map5;
89 99
    check(map4[A()] == 10 && map5[A()] == 10, "Something is wrong with ConstMap");
90 100
  }
91 101

	
92 102
  // IdentityMap
93 103
  {
94 104
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
95 105
    IdentityMap<A> map1;
96 106
    IdentityMap<A> map2 = map1;
97 107
    map1 = identityMap<A>();
98 108

	
99 109
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
100 110
    check(identityMap<double>()[1.0] == 1.0 && identityMap<double>()[3.14] == 3.14,
101 111
          "Something is wrong with IdentityMap");
102 112
  }
103 113

	
104 114
  // RangeMap
105 115
  {
106 116
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
107 117
    RangeMap<B> map1;
108 118
    RangeMap<B> map2(10);
109 119
    RangeMap<B> map3(10,B());
110 120
    RangeMap<B> map4 = map1;
111 121
    RangeMap<B> map5 = rangeMap<B>();
0 comments (0 inline)