52 /// Null map. (a.k.a. DoNothingMap) |
50 /// Null map. (a.k.a. DoNothingMap) |
53 |
51 |
54 /// If you have to provide a map only for its type definitions, |
52 /// If you have to provide a map only for its type definitions, |
55 /// or if you have to provide a writable map, but |
53 /// or if you have to provide a writable map, but |
56 /// data written to it will sent to <tt>/dev/null</tt>... |
54 /// data written to it will sent to <tt>/dev/null</tt>... |
57 template<typename K, typename T, typename NC = False> |
55 template<typename K, typename T> |
58 class NullMap : public MapBase<K, T, NC> { |
56 class NullMap : public MapBase<K, T> { |
59 public: |
57 public: |
60 typedef MapBase<K, T, NC> Parent; |
58 typedef MapBase<K, T> Parent; |
61 typedef typename Parent::Key Key; |
59 typedef typename Parent::Key Key; |
62 typedef typename Parent::Value Value; |
60 typedef typename Parent::Value Value; |
63 |
61 |
64 /// Gives back a default constructed element. |
62 /// Gives back a default constructed element. |
65 T operator[](const K&) const { return T(); } |
63 T operator[](const K&) const { return T(); } |
66 /// Absorbs the value. |
64 /// Absorbs the value. |
67 void set(const K&, const T&) {} |
65 void set(const K&, const T&) {} |
68 }; |
66 }; |
69 |
67 |
70 template <typename K, typename V> |
68 template <typename K, typename V> |
71 NullMap<K, V, True> nullMap() { |
69 NullMap<K, V> nullMap() { |
72 return NullMap<K, V, True>(); |
70 return NullMap<K, V>(); |
73 } |
71 } |
74 |
72 |
75 |
73 |
76 /// Constant map. |
74 /// Constant map. |
77 |
75 |
78 /// This is a readable map which assigns a specified value to each key. |
76 /// This is a readable map which assigns a specified value to each key. |
79 /// In other aspects it is equivalent to the \ref NullMap. |
77 /// In other aspects it is equivalent to the \ref NullMap. |
80 /// \todo set could be used to set the value. |
78 /// \todo set could be used to set the value. |
81 template<typename K, typename T, typename NC = False> |
79 template<typename K, typename T> |
82 class ConstMap : public MapBase<K, T, NC> { |
80 class ConstMap : public MapBase<K, T> { |
83 private: |
81 private: |
84 T v; |
82 T v; |
85 public: |
83 public: |
86 |
84 |
87 typedef MapBase<K, T, NC> Parent; |
85 typedef MapBase<K, T> Parent; |
88 typedef typename Parent::Key Key; |
86 typedef typename Parent::Key Key; |
89 typedef typename Parent::Value Value; |
87 typedef typename Parent::Value Value; |
90 |
88 |
91 /// Default constructor |
89 /// Default constructor |
92 |
90 |
114 ///Returns a \ref ConstMap class |
112 ///Returns a \ref ConstMap class |
115 |
113 |
116 ///This function just returns a \ref ConstMap class. |
114 ///This function just returns a \ref ConstMap class. |
117 ///\relates ConstMap |
115 ///\relates ConstMap |
118 template<typename K, typename V> |
116 template<typename K, typename V> |
119 inline ConstMap<K, V, True> constMap(const V &v) { |
117 inline ConstMap<K, V> constMap(const V &v) { |
120 return ConstMap<K, V, True>(v); |
118 return ConstMap<K, V>(v); |
121 } |
119 } |
122 |
120 |
123 |
121 |
124 //\todo to document later |
122 //\todo to document later |
125 template<typename T, T v> |
123 template<typename T, T v> |
126 struct Const { }; |
124 struct Const { }; |
127 |
125 |
128 //\todo to document later |
126 //\todo to document later |
129 template<typename K, typename V, V v, typename NC> |
127 template<typename K, typename V, V v> |
130 class ConstMap<K, Const<V, v>, NC > : public MapBase<K, V, NC> { |
128 class ConstMap<K, Const<V, v> > : public MapBase<K, V> { |
131 public: |
129 public: |
132 typedef MapBase<K, V, False> Parent; |
130 typedef MapBase<K, V> Parent; |
133 typedef typename Parent::Key Key; |
131 typedef typename Parent::Key Key; |
134 typedef typename Parent::Value Value; |
132 typedef typename Parent::Value Value; |
135 |
133 |
136 ConstMap() { } |
134 ConstMap() { } |
137 V operator[](const K&) const { return v; } |
135 V operator[](const K&) const { return v; } |
141 ///Returns a \ref ConstMap class |
139 ///Returns a \ref ConstMap class |
142 |
140 |
143 ///This function just returns a \ref ConstMap class. |
141 ///This function just returns a \ref ConstMap class. |
144 ///\relates ConstMap |
142 ///\relates ConstMap |
145 template<typename K, typename V, V v> |
143 template<typename K, typename V, V v> |
146 inline ConstMap<K, Const<V, v>, True> constMap() { |
144 inline ConstMap<K, Const<V, v> > constMap() { |
147 return ConstMap<K, Const<V, v>, True>(); |
145 return ConstMap<K, Const<V, v> >(); |
148 } |
146 } |
149 |
147 |
150 /// \c std::map wrapper |
148 /// \c std::map wrapper |
151 |
149 |
152 /// This is essentially a wrapper for \c std::map. With addition that |
150 /// This is essentially a wrapper for \c std::map. With addition that |
223 |
221 |
224 /// \brief Identity mapping. |
222 /// \brief Identity mapping. |
225 /// |
223 /// |
226 /// This mapping gives back the given key as value without any |
224 /// This mapping gives back the given key as value without any |
227 /// modification. |
225 /// modification. |
228 template <typename T, typename NC = False> |
226 template <typename T> |
229 class IdentityMap : public MapBase<T, T, NC> { |
227 class IdentityMap : public MapBase<T, T> { |
230 public: |
228 public: |
231 typedef MapBase<T, T, NC> Parent; |
229 typedef MapBase<T, T> Parent; |
232 typedef typename Parent::Key Key; |
230 typedef typename Parent::Key Key; |
233 typedef typename Parent::Value Value; |
231 typedef typename Parent::Value Value; |
234 |
232 |
235 const T& operator[](const T& t) const { |
233 const T& operator[](const T& t) const { |
236 return t; |
234 return t; |
240 ///Returns an \ref IdentityMap class |
238 ///Returns an \ref IdentityMap class |
241 |
239 |
242 ///This function just returns an \ref IdentityMap class. |
240 ///This function just returns an \ref IdentityMap class. |
243 ///\relates IdentityMap |
241 ///\relates IdentityMap |
244 template<typename T> |
242 template<typename T> |
245 inline IdentityMap<T, True> identityMap() { |
243 inline IdentityMap<T> identityMap() { |
246 return IdentityMap<T, True>(); |
244 return IdentityMap<T>(); |
247 } |
245 } |
248 |
246 |
249 |
247 |
250 ///Convert the \c Value of a map to another type. |
248 ///Convert the \c Value of a map to another type. |
251 |
249 |
252 ///This \ref concept::ReadMap "read only map" |
250 ///This \ref concept::ReadMap "read only map" |
253 ///converts the \c Value of a maps to type \c T. |
251 ///converts the \c Value of a maps to type \c T. |
254 ///Its \c Key is inherited from \c M. |
252 ///Its \c Key is inherited from \c M. |
255 template <typename M, typename T, typename NC = False> |
253 template <typename M, typename T> |
256 class ConvertMap : public MapBase<typename M::Key, T, NC> { |
254 class ConvertMap : public MapBase<typename M::Key, T> { |
257 typename SmartConstReference<M>::Type m; |
255 const M& m; |
258 public: |
256 public: |
259 typedef MapBase<typename M::Key, T, NC> Parent; |
257 typedef MapBase<typename M::Key, T> Parent; |
260 typedef typename Parent::Key Key; |
258 typedef typename Parent::Key Key; |
261 typedef typename Parent::Value Value; |
259 typedef typename Parent::Value Value; |
262 |
260 |
263 ///Constructor |
261 ///Constructor |
264 |
262 |
278 |
276 |
279 ///This function just returns an \ref ConvertMap class. |
277 ///This function just returns an \ref ConvertMap class. |
280 ///\relates ConvertMap |
278 ///\relates ConvertMap |
281 ///\todo The order of the template parameters are changed. |
279 ///\todo The order of the template parameters are changed. |
282 template<typename T, typename M> |
280 template<typename T, typename M> |
283 inline ConvertMap<M, T, True> convertMap(const M &m) { |
281 inline ConvertMap<M, T> convertMap(const M &m) { |
284 return ConvertMap<M, T, True>(m); |
282 return ConvertMap<M, T>(m); |
285 } |
283 } |
286 |
284 |
287 ///Sum of two maps |
285 ///Sum of two maps |
288 |
286 |
289 ///This \ref concept::ReadMap "read only map" returns the sum of the two |
287 ///This \ref concept::ReadMap "read only map" returns the sum of the two |
290 ///given maps. Its \c Key and \c Value will be inherited from \c M1. |
288 ///given maps. Its \c Key and \c Value will be inherited from \c M1. |
291 ///The \c Key and \c Value of M2 must be convertible to those of \c M1. |
289 ///The \c Key and \c Value of M2 must be convertible to those of \c M1. |
292 |
290 |
293 template<typename M1, typename M2, typename NC = False> |
291 template<typename M1, typename M2> |
294 class AddMap : public MapBase<typename M1::Key, typename M1::Value, NC> { |
292 class AddMap : public MapBase<typename M1::Key, typename M1::Value> { |
295 typename SmartConstReference<M1>::Type m1; |
293 const M1& m1; |
296 typename SmartConstReference<M2>::Type m2; |
294 const M2& m2; |
297 |
295 |
298 public: |
296 public: |
299 typedef MapBase<typename M1::Key, typename M1::Value, NC> Parent; |
297 typedef MapBase<typename M1::Key, typename M1::Value> Parent; |
300 typedef typename Parent::Key Key; |
298 typedef typename Parent::Key Key; |
301 typedef typename Parent::Value Value; |
299 typedef typename Parent::Value Value; |
302 |
300 |
303 ///Constructor |
301 ///Constructor |
304 AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
302 AddMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
311 ///\todo How to call these type of functions? |
309 ///\todo How to call these type of functions? |
312 /// |
310 /// |
313 ///\relates AddMap |
311 ///\relates AddMap |
314 ///\todo Wrong scope in Doxygen when \c \\relates is used |
312 ///\todo Wrong scope in Doxygen when \c \\relates is used |
315 template<typename M1, typename M2> |
313 template<typename M1, typename M2> |
316 inline AddMap<M1, M2, True> addMap(const M1 &m1,const M2 &m2) { |
314 inline AddMap<M1, M2> addMap(const M1 &m1,const M2 &m2) { |
317 return AddMap<M1, M2, True>(m1,m2); |
315 return AddMap<M1, M2>(m1,m2); |
318 } |
316 } |
319 |
317 |
320 ///Shift a map with a constant. |
318 ///Shift a map with a constant. |
321 |
319 |
322 ///This \ref concept::ReadMap "read only map" returns the sum of the |
320 ///This \ref concept::ReadMap "read only map" returns the sum of the |
330 ///is equivalent with |
328 ///is equivalent with |
331 ///\code |
329 ///\code |
332 /// ConstMap<X::Key, X::Value> c_tmp(v); |
330 /// ConstMap<X::Key, X::Value> c_tmp(v); |
333 /// AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v); |
331 /// AddMap<X, ConstMap<X::Key, X::Value> > sh(x,v); |
334 ///\endcode |
332 ///\endcode |
335 template<typename M, typename C = typename M::Value, typename NC = False> |
333 template<typename M, typename C = typename M::Value> |
336 class ShiftMap : public MapBase<typename M::Key, typename M::Value, NC> { |
334 class ShiftMap : public MapBase<typename M::Key, typename M::Value> { |
337 typename SmartConstReference<M>::Type m; |
335 const M& m; |
338 C v; |
336 C v; |
339 public: |
337 public: |
340 typedef MapBase<typename M::Key, typename M::Value, NC> Parent; |
338 typedef MapBase<typename M::Key, typename M::Value> Parent; |
341 typedef typename Parent::Key Key; |
339 typedef typename Parent::Key Key; |
342 typedef typename Parent::Value Value; |
340 typedef typename Parent::Value Value; |
343 |
341 |
344 ///Constructor |
342 ///Constructor |
345 |
343 |
354 |
352 |
355 ///This function just returns an \ref ShiftMap class. |
353 ///This function just returns an \ref ShiftMap class. |
356 ///\relates ShiftMap |
354 ///\relates ShiftMap |
357 ///\todo A better name is required. |
355 ///\todo A better name is required. |
358 template<typename M, typename C> |
356 template<typename M, typename C> |
359 inline ShiftMap<M, C, True> shiftMap(const M &m,const C &v) { |
357 inline ShiftMap<M, C> shiftMap(const M &m,const C &v) { |
360 return ShiftMap<M, C, True>(m,v); |
358 return ShiftMap<M, C>(m,v); |
361 } |
359 } |
362 |
360 |
363 ///Difference of two maps |
361 ///Difference of two maps |
364 |
362 |
365 ///This \ref concept::ReadMap "read only map" returns the difference |
363 ///This \ref concept::ReadMap "read only map" returns the difference |
366 ///of the values of the two |
364 ///of the values of the two |
367 ///given maps. Its \c Key and \c Value will be inherited from \c M1. |
365 ///given maps. Its \c Key and \c Value will be inherited from \c M1. |
368 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1. |
366 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1. |
369 |
367 |
370 template<typename M1, typename M2, typename NC = False> |
368 template<typename M1, typename M2> |
371 class SubMap : public MapBase<typename M1::Key, typename M1::Value, NC> { |
369 class SubMap : public MapBase<typename M1::Key, typename M1::Value> { |
372 typename SmartConstReference<M1>::Type m1; |
370 const M1& m1; |
373 typename SmartConstReference<M2>::Type m2; |
371 const M2& m2; |
374 public: |
372 public: |
375 typedef MapBase<typename M1::Key, typename M1::Value, NC> Parent; |
373 typedef MapBase<typename M1::Key, typename M1::Value> Parent; |
376 typedef typename Parent::Key Key; |
374 typedef typename Parent::Key Key; |
377 typedef typename Parent::Value Value; |
375 typedef typename Parent::Value Value; |
378 |
376 |
379 ///Constructor |
377 ///Constructor |
380 SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
378 SubMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
385 |
383 |
386 ///This function just returns a \ref SubMap class. |
384 ///This function just returns a \ref SubMap class. |
387 /// |
385 /// |
388 ///\relates SubMap |
386 ///\relates SubMap |
389 template<typename M1, typename M2> |
387 template<typename M1, typename M2> |
390 inline SubMap<M1, M2, True> subMap(const M1 &m1, const M2 &m2) { |
388 inline SubMap<M1, M2> subMap(const M1 &m1, const M2 &m2) { |
391 return SubMap<M1, M2, True>(m1, m2); |
389 return SubMap<M1, M2>(m1, m2); |
392 } |
390 } |
393 |
391 |
394 ///Product of two maps |
392 ///Product of two maps |
395 |
393 |
396 ///This \ref concept::ReadMap "read only map" returns the product of the |
394 ///This \ref concept::ReadMap "read only map" returns the product of the |
397 ///values of the two |
395 ///values of the two |
398 ///given |
396 ///given |
399 ///maps. Its \c Key and \c Value will be inherited from \c M1. |
397 ///maps. Its \c Key and \c Value will be inherited from \c M1. |
400 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1. |
398 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1. |
401 |
399 |
402 template<typename M1, typename M2, typename NC = False> |
400 template<typename M1, typename M2> |
403 class MulMap : public MapBase<typename M1::Key, typename M1::Value, NC> { |
401 class MulMap : public MapBase<typename M1::Key, typename M1::Value> { |
404 typename SmartConstReference<M1>::Type m1; |
402 const M1& m1; |
405 typename SmartConstReference<M2>::Type m2; |
403 const M2& m2; |
406 public: |
404 public: |
407 typedef MapBase<typename M1::Key, typename M1::Value, NC> Parent; |
405 typedef MapBase<typename M1::Key, typename M1::Value> Parent; |
408 typedef typename Parent::Key Key; |
406 typedef typename Parent::Key Key; |
409 typedef typename Parent::Value Value; |
407 typedef typename Parent::Value Value; |
410 |
408 |
411 ///Constructor |
409 ///Constructor |
412 MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
410 MulMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
416 ///Returns a \ref MulMap class |
414 ///Returns a \ref MulMap class |
417 |
415 |
418 ///This function just returns a \ref MulMap class. |
416 ///This function just returns a \ref MulMap class. |
419 ///\relates MulMap |
417 ///\relates MulMap |
420 template<typename M1, typename M2> |
418 template<typename M1, typename M2> |
421 inline MulMap<M1, M2, True> mulMap(const M1 &m1,const M2 &m2) { |
419 inline MulMap<M1, M2> mulMap(const M1 &m1,const M2 &m2) { |
422 return MulMap<M1, M2, True>(m1,m2); |
420 return MulMap<M1, M2>(m1,m2); |
423 } |
421 } |
424 |
422 |
425 ///Scales a maps with a constant. |
423 ///Scales a maps with a constant. |
426 |
424 |
427 ///This \ref concept::ReadMap "read only map" returns the value of the |
425 ///This \ref concept::ReadMap "read only map" returns the value of the |
435 ///is equivalent with |
433 ///is equivalent with |
436 ///\code |
434 ///\code |
437 /// ConstMap<X::Key, X::Value> c_tmp(v); |
435 /// ConstMap<X::Key, X::Value> c_tmp(v); |
438 /// MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v); |
436 /// MulMap<X, ConstMap<X::Key, X::Value> > sc(x,v); |
439 ///\endcode |
437 ///\endcode |
440 template<typename M, typename C = typename M::Value, typename NC = False> |
438 template<typename M, typename C = typename M::Value> |
441 class ScaleMap : public MapBase<typename M::Key, typename M::Value, NC> { |
439 class ScaleMap : public MapBase<typename M::Key, typename M::Value> { |
442 typename SmartConstReference<M>::Type m; |
440 const M& m; |
443 C v; |
441 C v; |
444 public: |
442 public: |
445 typedef MapBase<typename M::Key, typename M::Value, NC> Parent; |
443 typedef MapBase<typename M::Key, typename M::Value> Parent; |
446 typedef typename Parent::Key Key; |
444 typedef typename Parent::Key Key; |
447 typedef typename Parent::Value Value; |
445 typedef typename Parent::Value Value; |
448 |
446 |
449 ///Constructor |
447 ///Constructor |
450 |
448 |
459 |
457 |
460 ///This function just returns an \ref ScaleMap class. |
458 ///This function just returns an \ref ScaleMap class. |
461 ///\relates ScaleMap |
459 ///\relates ScaleMap |
462 ///\todo A better name is required. |
460 ///\todo A better name is required. |
463 template<typename M, typename C> |
461 template<typename M, typename C> |
464 inline ScaleMap<M, C, True> scaleMap(const M &m,const C &v) { |
462 inline ScaleMap<M, C> scaleMap(const M &m,const C &v) { |
465 return ScaleMap<M, C, True>(m,v); |
463 return ScaleMap<M, C>(m,v); |
466 } |
464 } |
467 |
465 |
468 ///Quotient of two maps |
466 ///Quotient of two maps |
469 |
467 |
470 ///This \ref concept::ReadMap "read only map" returns the quotient of the |
468 ///This \ref concept::ReadMap "read only map" returns the quotient of the |
471 ///values of the two |
469 ///values of the two |
472 ///given maps. Its \c Key and \c Value will be inherited from \c M1. |
470 ///given maps. Its \c Key and \c Value will be inherited from \c M1. |
473 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1. |
471 ///The \c Key and \c Value of \c M2 must be convertible to those of \c M1. |
474 |
472 |
475 template<typename M1, typename M2, typename NC = False> |
473 template<typename M1, typename M2> |
476 class DivMap : public MapBase<typename M1::Key, typename M1::Value, NC> { |
474 class DivMap : public MapBase<typename M1::Key, typename M1::Value> { |
477 typename SmartConstReference<M1>::Type m1; |
475 const M1& m1; |
478 typename SmartConstReference<M2>::Type m2; |
476 const M2& m2; |
479 public: |
477 public: |
480 typedef MapBase<typename M1::Key, typename M1::Value, NC> Parent; |
478 typedef MapBase<typename M1::Key, typename M1::Value> Parent; |
481 typedef typename Parent::Key Key; |
479 typedef typename Parent::Key Key; |
482 typedef typename Parent::Value Value; |
480 typedef typename Parent::Value Value; |
483 |
481 |
484 ///Constructor |
482 ///Constructor |
485 DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
483 DivMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
489 ///Returns a \ref DivMap class |
487 ///Returns a \ref DivMap class |
490 |
488 |
491 ///This function just returns a \ref DivMap class. |
489 ///This function just returns a \ref DivMap class. |
492 ///\relates DivMap |
490 ///\relates DivMap |
493 template<typename M1, typename M2> |
491 template<typename M1, typename M2> |
494 inline DivMap<M1, M2, True> divMap(const M1 &m1,const M2 &m2) { |
492 inline DivMap<M1, M2> divMap(const M1 &m1,const M2 &m2) { |
495 return DivMap<M1, M2, True>(m1,m2); |
493 return DivMap<M1, M2>(m1,m2); |
496 } |
494 } |
497 |
495 |
498 ///Composition of two maps |
496 ///Composition of two maps |
499 |
497 |
500 ///This \ref concept::ReadMap "read only map" returns the composition of |
498 ///This \ref concept::ReadMap "read only map" returns the composition of |
510 ///Its \c Key is inherited from \c M2 and its \c Value is from |
508 ///Its \c Key is inherited from \c M2 and its \c Value is from |
511 ///\c M1. |
509 ///\c M1. |
512 ///The \c M2::Value must be convertible to \c M1::Key. |
510 ///The \c M2::Value must be convertible to \c M1::Key. |
513 ///\todo Check the requirements. |
511 ///\todo Check the requirements. |
514 |
512 |
515 template <typename M1, typename M2, typename NC = False> |
513 template <typename M1, typename M2> |
516 class ComposeMap : public MapBase<typename M2::Key, typename M1::Value, NC> { |
514 class ComposeMap : public MapBase<typename M2::Key, typename M1::Value> { |
517 typename SmartConstReference<M1>::Type m1; |
515 const M1& m1; |
518 typename SmartConstReference<M2>::Type m2; |
516 const M2& m2; |
519 public: |
517 public: |
520 typedef MapBase<typename M2::Key, typename M1::Value, NC> Parent; |
518 typedef MapBase<typename M2::Key, typename M1::Value> Parent; |
521 typedef typename Parent::Key Key; |
519 typedef typename Parent::Key Key; |
522 typedef typename Parent::Value Value; |
520 typedef typename Parent::Value Value; |
523 |
521 |
524 ///Constructor |
522 ///Constructor |
525 ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
523 ComposeMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
529 |
527 |
530 ///This function just returns a \ref ComposeMap class. |
528 ///This function just returns a \ref ComposeMap class. |
531 /// |
529 /// |
532 ///\relates ComposeMap |
530 ///\relates ComposeMap |
533 template <typename M1, typename M2> |
531 template <typename M1, typename M2> |
534 inline ComposeMap<M1, M2, True> composeMap(const M1 &m1,const M2 &m2) { |
532 inline ComposeMap<M1, M2> composeMap(const M1 &m1,const M2 &m2) { |
535 return ComposeMap<M1, M2, True>(m1,m2); |
533 return ComposeMap<M1, M2>(m1,m2); |
536 } |
534 } |
537 |
535 |
538 ///Combines of two maps using an STL (binary) functor. |
536 ///Combines of two maps using an STL (binary) functor. |
539 |
537 |
540 ///Combines of two maps using an STL (binary) functor. |
538 ///Combines of two maps using an STL (binary) functor. |
559 ///\todo Check the requirements. |
557 ///\todo Check the requirements. |
560 |
558 |
561 template<typename M1, typename M2, typename F, |
559 template<typename M1, typename M2, typename F, |
562 typename V = typename F::result_type, |
560 typename V = typename F::result_type, |
563 typename NC = False> |
561 typename NC = False> |
564 class CombineMap : public MapBase<typename M1::Key, V, NC> { |
562 class CombineMap : public MapBase<typename M1::Key, V> { |
565 typename SmartConstReference<M1>::Type m1; |
563 const M1& m1; |
566 typename SmartConstReference<M2>::Type m2; |
564 const M2& m2; |
567 F f; |
565 F f; |
568 public: |
566 public: |
569 typedef MapBase<typename M1::Key, V, NC> Parent; |
567 typedef MapBase<typename M1::Key, V> Parent; |
570 typedef typename Parent::Key Key; |
568 typedef typename Parent::Key Key; |
571 typedef typename Parent::Value Value; |
569 typedef typename Parent::Value Value; |
572 |
570 |
573 ///Constructor |
571 ///Constructor |
574 CombineMap(const M1 &_m1,const M2 &_m2,const F &_f) |
572 CombineMap(const M1 &_m1,const M2 &_m2,const F &_f) |
591 ///addMap(m1,m2) |
589 ///addMap(m1,m2) |
592 ///\endcode |
590 ///\endcode |
593 /// |
591 /// |
594 ///\relates CombineMap |
592 ///\relates CombineMap |
595 template<typename M1, typename M2, typename F, typename V> |
593 template<typename M1, typename M2, typename F, typename V> |
596 inline CombineMap<M1, M2, F, V, True> |
594 inline CombineMap<M1, M2, F, V> |
597 combineMap(const M1& m1,const M2& m2, const F& f) { |
595 combineMap(const M1& m1,const M2& m2, const F& f) { |
598 return CombineMap<M1, M2, F, V, True>(m1,m2,f); |
596 return CombineMap<M1, M2, F, V>(m1,m2,f); |
599 } |
597 } |
600 |
598 |
601 template<typename M1, typename M2, typename F> |
599 template<typename M1, typename M2, typename F> |
602 inline CombineMap<M1, M2, F, typename F::result_type, True> |
600 inline CombineMap<M1, M2, F, typename F::result_type> |
603 combineMap(const M1& m1, const M2& m2, const F& f) { |
601 combineMap(const M1& m1, const M2& m2, const F& f) { |
604 return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f); |
602 return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f); |
605 } |
603 } |
606 |
604 |
607 template<typename M1, typename M2, typename K1, typename K2, typename V> |
605 template<typename M1, typename M2, typename K1, typename K2, typename V> |
608 inline CombineMap<M1, M2, V (*)(K1, K2), V, True> |
606 inline CombineMap<M1, M2, V (*)(K1, K2), V> |
609 combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) { |
607 combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) { |
610 return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f); |
608 return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f); |
611 } |
609 } |
612 |
610 |
613 ///Negative value of a map |
611 ///Negative value of a map |
616 ///value of the |
614 ///value of the |
617 ///value returned by the |
615 ///value returned by the |
618 ///given map. Its \c Key and \c Value will be inherited from \c M. |
616 ///given map. Its \c Key and \c Value will be inherited from \c M. |
619 ///The unary \c - operator must be defined for \c Value, of course. |
617 ///The unary \c - operator must be defined for \c Value, of course. |
620 |
618 |
621 template<typename M, typename NC = False> |
619 template<typename M> |
622 class NegMap : public MapBase<typename M::Key, typename M::Value, NC> { |
620 class NegMap : public MapBase<typename M::Key, typename M::Value> { |
623 typename SmartConstReference<M>::Type m; |
621 const M& m; |
624 public: |
622 public: |
625 typedef MapBase<typename M::Key, typename M::Value, NC> Parent; |
623 typedef MapBase<typename M::Key, typename M::Value> Parent; |
626 typedef typename Parent::Key Key; |
624 typedef typename Parent::Key Key; |
627 typedef typename Parent::Value Value; |
625 typedef typename Parent::Value Value; |
628 |
626 |
629 ///Constructor |
627 ///Constructor |
630 NegMap(const M &_m) : m(_m) {}; |
628 NegMap(const M &_m) : m(_m) {}; |
662 /// template<> inline double t_abs<>(double n) {return fabs(n);} |
660 /// template<> inline double t_abs<>(double n) {return fabs(n);} |
663 /// template<> inline long double t_abs<>(long double n) {return fabsl(n);} |
661 /// template<> inline long double t_abs<>(long double n) {return fabsl(n);} |
664 ///\endcode |
662 ///\endcode |
665 |
663 |
666 |
664 |
667 template<typename M, typename NC = False> |
665 template<typename M> |
668 class AbsMap : public MapBase<typename M::Key, typename M::Value, NC> { |
666 class AbsMap : public MapBase<typename M::Key, typename M::Value> { |
669 typename SmartConstReference<M>::Type m; |
667 const M& m; |
670 public: |
668 public: |
671 typedef MapBase<typename M::Key, typename M::Value, NC> Parent; |
669 typedef MapBase<typename M::Key, typename M::Value> Parent; |
672 typedef typename Parent::Key Key; |
670 typedef typename Parent::Key Key; |
673 typedef typename Parent::Value Value; |
671 typedef typename Parent::Value Value; |
674 |
672 |
675 ///Constructor |
673 ///Constructor |
676 AbsMap(const M &_m) : m(_m) {}; |
674 AbsMap(const M &_m) : m(_m) {}; |
705 |
703 |
706 template<typename F, |
704 template<typename F, |
707 typename K = typename F::argument_type, |
705 typename K = typename F::argument_type, |
708 typename V = typename F::result_type, |
706 typename V = typename F::result_type, |
709 typename NC = False> |
707 typename NC = False> |
710 class FunctorMap : public MapBase<K, V, NC> { |
708 class FunctorMap : public MapBase<K, V> { |
711 F f; |
709 F f; |
712 public: |
710 public: |
713 typedef MapBase<K, V, NC> Parent; |
711 typedef MapBase<K, V> Parent; |
714 typedef typename Parent::Key Key; |
712 typedef typename Parent::Key Key; |
715 typedef typename Parent::Value Value; |
713 typedef typename Parent::Value Value; |
716 |
714 |
717 ///Constructor |
715 ///Constructor |
718 FunctorMap(const F &_f) : f(_f) {} |
716 FunctorMap(const F &_f) : f(_f) {} |
725 ///This function just returns a \ref FunctorMap class. |
723 ///This function just returns a \ref FunctorMap class. |
726 /// |
724 /// |
727 ///The third template parameter isn't necessary to be given. |
725 ///The third template parameter isn't necessary to be given. |
728 ///\relates FunctorMap |
726 ///\relates FunctorMap |
729 template<typename K, typename V, typename F> inline |
727 template<typename K, typename V, typename F> inline |
730 FunctorMap<F, K, V, True> functorMap(const F &f) { |
728 FunctorMap<F, K, V> functorMap(const F &f) { |
731 return FunctorMap<F, K, V, True>(f); |
729 return FunctorMap<F, K, V>(f); |
732 } |
730 } |
733 |
731 |
734 template <typename F> inline |
732 template <typename F> inline |
735 FunctorMap<F, typename F::argument_type, typename F::result_type, True> |
733 FunctorMap<F, typename F::argument_type, typename F::result_type> |
736 functorMap(const F &f) { |
734 functorMap(const F &f) { |
737 return FunctorMap<F, typename F::argument_type, |
735 return FunctorMap<F, typename F::argument_type, |
738 typename F::result_type, True>(f); |
736 typename F::result_type>(f); |
739 } |
737 } |
740 |
738 |
741 template <typename K, typename V> inline |
739 template <typename K, typename V> inline |
742 FunctorMap<V (*)(K), K, V, True> functorMap(V (*f)(K)) { |
740 FunctorMap<V (*)(K), K, V> functorMap(V (*f)(K)) { |
743 return FunctorMap<V (*)(K), K, V, True>(f); |
741 return FunctorMap<V (*)(K), K, V>(f); |
744 } |
742 } |
745 |
743 |
746 |
744 |
747 ///Converts a map to an STL style (unary) functor |
745 ///Converts a map to an STL style (unary) functor |
748 |
746 |
751 /// |
749 /// |
752 ///For the sake of convenience it also works as |
750 ///For the sake of convenience it also works as |
753 ///a ususal \ref concept::ReadMap "readable map", |
751 ///a ususal \ref concept::ReadMap "readable map", |
754 ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist. |
752 ///i.e. <tt>operator[]</tt> and the \c Key and \c Value typedefs also exist. |
755 |
753 |
756 template <typename M, typename NC = False> |
754 template <typename M> |
757 class MapFunctor : public MapBase<typename M::Key, typename M::Value, NC> { |
755 class MapFunctor : public MapBase<typename M::Key, typename M::Value> { |
758 typename SmartConstReference<M>::Type m; |
756 const M& m; |
759 public: |
757 public: |
760 typedef MapBase<typename M::Key, typename M::Value, NC> Parent; |
758 typedef MapBase<typename M::Key, typename M::Value> Parent; |
761 typedef typename Parent::Key Key; |
759 typedef typename Parent::Key Key; |
762 typedef typename Parent::Value Value; |
760 typedef typename Parent::Value Value; |
763 |
761 |
764 ///\e |
762 ///\e |
765 typedef typename M::Key argument_type; |
763 typedef typename M::Key argument_type; |
793 ///corresponding values of \c M1. |
791 ///corresponding values of \c M1. |
794 /// |
792 /// |
795 ///The \c Key and \c Value will be inherited from \c M1. |
793 ///The \c Key and \c Value will be inherited from \c M1. |
796 ///The \c Key and \c Value of M2 must be convertible from those of \c M1. |
794 ///The \c Key and \c Value of M2 must be convertible from those of \c M1. |
797 |
795 |
798 template<typename M1, typename M2, typename NC = False> |
796 template<typename M1, typename M2> |
799 class ForkMap : public MapBase<typename M1::Key, typename M1::Value, NC> { |
797 class ForkMap : public MapBase<typename M1::Key, typename M1::Value> { |
800 typename SmartConstReference<M1>::Type m1; |
798 const M1& m1; |
801 typename SmartConstReference<M2>::Type m2; |
799 const M2& m2; |
802 public: |
800 public: |
803 typedef MapBase<typename M1::Key, typename M1::Value, NC> Parent; |
801 typedef MapBase<typename M1::Key, typename M1::Value> Parent; |
804 typedef typename Parent::Key Key; |
802 typedef typename Parent::Key Key; |
805 typedef typename Parent::Value Value; |
803 typedef typename Parent::Value Value; |
806 |
804 |
807 ///Constructor |
805 ///Constructor |
808 ForkMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
806 ForkMap(const M1 &_m1,const M2 &_m2) : m1(_m1), m2(_m2) {}; |
816 ///\todo How to call these type of functions? |
814 ///\todo How to call these type of functions? |
817 /// |
815 /// |
818 ///\relates ForkMap |
816 ///\relates ForkMap |
819 ///\todo Wrong scope in Doxygen when \c \\relates is used |
817 ///\todo Wrong scope in Doxygen when \c \\relates is used |
820 template <typename M1, typename M2> |
818 template <typename M1, typename M2> |
821 inline ForkMap<M1, M2, True> forkMap(const M1 &m1,const M2 &m2) { |
819 inline ForkMap<M1, M2> forkMap(const M1 &m1,const M2 &m2) { |
822 return ForkMap<M1, M2, True>(m1,m2); |
820 return ForkMap<M1, M2>(m1,m2); |
823 } |
821 } |
824 |
822 |
825 |
823 |
826 |
824 |
827 /* ************* BOOL MAPS ******************* */ |
825 /* ************* BOOL MAPS ******************* */ |
832 ///logical negation of |
830 ///logical negation of |
833 ///value returned by the |
831 ///value returned by the |
834 ///given map. Its \c Key and will be inherited from \c M, |
832 ///given map. Its \c Key and will be inherited from \c M, |
835 ///its Value is <tt>bool</tt>. |
833 ///its Value is <tt>bool</tt>. |
836 |
834 |
837 template <typename M, typename NC = False> |
835 template <typename M> |
838 class NotMap : public MapBase<typename M::Key, bool, NC> { |
836 class NotMap : public MapBase<typename M::Key, bool> { |
839 typename SmartConstReference<M>::Type m; |
837 const M& m; |
840 public: |
838 public: |
841 typedef MapBase<typename M::Key, bool, NC> Parent; |
839 typedef MapBase<typename M::Key, bool> Parent; |
842 typedef typename Parent::Key Key; |
840 typedef typename Parent::Key Key; |
843 typedef typename Parent::Value Value; |
841 typedef typename Parent::Value Value; |
844 |
842 |
845 ///Constructor |
843 ///Constructor |
846 NotMap(const M &_m) : m(_m) {}; |
844 NotMap(const M &_m) : m(_m) {}; |