gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Small improvements in maps.h - Add a new version of constMap() function. - Fix in FunctorToMap class.
0 2 0
default
2 files changed with 18 insertions and 6 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -23,219 +23,224 @@
23 23
#include <functional>
24 24
#include <vector>
25 25

	
26 26
#include <lemon/bits/utility.h>
27 27
#include <lemon/bits/traits.h>
28 28

	
29 29
///\file
30 30
///\ingroup maps
31 31
///\brief Miscellaneous property maps
32 32

	
33 33
#include <map>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \addtogroup maps
38 38
  /// @{
39 39

	
40 40
  /// Base class of maps.
41 41

	
42 42
  /// Base class of maps. It provides the necessary type definitions
43 43
  /// required by the map %concepts.
44 44
  template<typename K, typename V>
45 45
  class MapBase {
46 46
  public:
47 47
    /// \biref The key type of the map.
48 48
    typedef K Key;
49 49
    /// \brief The value type of the map.
50 50
    /// (The type of objects associated with the keys).
51 51
    typedef V Value;
52 52
  };
53 53

	
54 54

	
55 55
  /// Null map. (a.k.a. DoNothingMap)
56 56

	
57 57
  /// This map can be used if you have to provide a map only for
58 58
  /// its type definitions, or if you have to provide a writable map,
59 59
  /// but data written to it is not required (i.e. it will be sent to
60 60
  /// <tt>/dev/null</tt>).
61 61
  /// It conforms the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
62 62
  ///
63 63
  /// \sa ConstMap
64 64
  template<typename K, typename V>
65 65
  class NullMap : public MapBase<K, V> {
66 66
  public:
67 67
    typedef MapBase<K, V> Parent;
68 68
    typedef typename Parent::Key Key;
69 69
    typedef typename Parent::Value Value;
70 70

	
71 71
    /// Gives back a default constructed element.
72 72
    Value operator[](const Key&) const { return Value(); }
73 73
    /// Absorbs the value.
74 74
    void set(const Key&, const Value&) {}
75 75
  };
76 76

	
77 77
  /// Returns a \ref NullMap class
78 78

	
79 79
  /// This function just returns a \ref NullMap class.
80 80
  /// \relates NullMap
81 81
  template <typename K, typename V>
82 82
  NullMap<K, V> nullMap() {
83 83
    return NullMap<K, V>();
84 84
  }
85 85

	
86 86

	
87 87
  /// Constant map.
88 88

	
89 89
  /// This \ref concepts::ReadMap "readable map" assigns a specified
90 90
  /// value to each key.
91 91
  ///
92 92
  /// In other aspects it is equivalent to \ref NullMap.
93 93
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
94 94
  /// concept, but it absorbs the data written to it.
95 95
  ///
96 96
  /// The simplest way of using this map is through the constMap()
97 97
  /// function.
98 98
  ///
99 99
  /// \sa NullMap
100 100
  /// \sa IdentityMap
101 101
  template<typename K, typename V>
102 102
  class ConstMap : public MapBase<K, V> {
103 103
  private:
104 104
    V _value;
105 105
  public:
106 106
    typedef MapBase<K, V> Parent;
107 107
    typedef typename Parent::Key Key;
108 108
    typedef typename Parent::Value Value;
109 109

	
110 110
    /// Default constructor
111 111

	
112 112
    /// Default constructor.
113 113
    /// The value of the map will be default constructed.
114 114
    ConstMap() {}
115 115

	
116 116
    /// Constructor with specified initial value
117 117

	
118 118
    /// Constructor with specified initial value.
119
    /// \param v is the initial value of the map.
119
    /// \param v The initial value of the map.
120 120
    ConstMap(const Value &v) : _value(v) {}
121 121

	
122 122
    /// Gives back the specified value.
123 123
    Value operator[](const Key&) const { return _value; }
124 124

	
125 125
    /// Absorbs the value.
126 126
    void set(const Key&, const Value&) {}
127 127

	
128 128
    /// Sets the value that is assigned to each key.
129 129
    void setAll(const Value &v) {
130 130
      _value = v;
131 131
    }
132 132

	
133 133
    template<typename V1>
134 134
    ConstMap(const ConstMap<K, V1> &, const Value &v) : _value(v) {}
135 135
  };
136 136

	
137 137
  /// Returns a \ref ConstMap class
138 138

	
139 139
  /// This function just returns a \ref ConstMap class.
140 140
  /// \relates ConstMap
141 141
  template<typename K, typename V>
142 142
  inline ConstMap<K, V> constMap(const V &v) {
143 143
    return ConstMap<K, V>(v);
144 144
  }
145 145

	
146
  template<typename K, typename V>
147
  inline ConstMap<K, V> constMap() {
148
    return ConstMap<K, V>();
149
  }
150

	
146 151

	
147 152
  template<typename T, T v>
148 153
  struct Const {};
149 154

	
150 155
  /// Constant map with inlined constant value.
151 156

	
152 157
  /// This \ref concepts::ReadMap "readable map" assigns a specified
153 158
  /// value to each key.
154 159
  ///
155 160
  /// In other aspects it is equivalent to \ref NullMap.
156 161
  /// So it conforms the \ref concepts::ReadWriteMap "ReadWriteMap"
157 162
  /// concept, but it absorbs the data written to it.
158 163
  ///
159 164
  /// The simplest way of using this map is through the constMap()
160 165
  /// function.
161 166
  ///
162 167
  /// \sa NullMap
163 168
  /// \sa IdentityMap
164 169
  template<typename K, typename V, V v>
165 170
  class ConstMap<K, Const<V, v> > : public MapBase<K, V> {
166 171
  public:
167 172
    typedef MapBase<K, V> Parent;
168 173
    typedef typename Parent::Key Key;
169 174
    typedef typename Parent::Value Value;
170 175

	
171 176
    /// Constructor.
172 177
    ConstMap() {}
173 178

	
174 179
    /// Gives back the specified value.
175 180
    Value operator[](const Key&) const { return v; }
176 181

	
177 182
    /// Absorbs the value.
178 183
    void set(const Key&, const Value&) {}
179 184
  };
180 185

	
181 186
  /// Returns a \ref ConstMap class with inlined constant value
182 187

	
183 188
  /// This function just returns a \ref ConstMap class with inlined
184 189
  /// constant value.
185 190
  /// \relates ConstMap
186 191
  template<typename K, typename V, V v>
187 192
  inline ConstMap<K, Const<V, v> > constMap() {
188 193
    return ConstMap<K, Const<V, v> >();
189 194
  }
190 195

	
191 196

	
192 197
  /// Identity map.
193 198

	
194 199
  /// This \ref concepts::ReadMap "read-only map" gives back the given
195 200
  /// key as value without any modification.
196 201
  ///
197 202
  /// \sa ConstMap
198 203
  template <typename T>
199 204
  class IdentityMap : public MapBase<T, T> {
200 205
  public:
201 206
    typedef MapBase<T, T> Parent;
202 207
    typedef typename Parent::Key Key;
203 208
    typedef typename Parent::Value Value;
204 209

	
205 210
    /// Gives back the given value without any modification.
206 211
    Value operator[](const Key &k) const {
207 212
      return k;
208 213
    }
209 214
  };
210 215

	
211 216
  /// Returns an \ref IdentityMap class
212 217

	
213 218
  /// This function just returns an \ref IdentityMap class.
214 219
  /// \relates IdentityMap
215 220
  template<typename T>
216 221
  inline IdentityMap<T> identityMap() {
217 222
    return IdentityMap<T>();
218 223
  }
219 224

	
220 225

	
221 226
  /// \brief Map for storing values for integer keys from the range
222 227
  /// <tt>[0..size-1]</tt>.
223 228
  ///
224 229
  /// This map is essentially a wrapper for \c std::vector. It assigns
225 230
  /// values to integer keys from the range <tt>[0..size-1]</tt>.
226 231
  /// It can be used with some data structures, for example
227 232
  /// \ref UnionFind, \ref BinHeap, when the used items are small
228 233
  /// integers. This map conforms the \ref concepts::ReferenceMap
229 234
  /// "ReferenceMap" concept.
230 235
  ///
231 236
  /// The simplest way of using this map is through the rangeMap()
232 237
  /// function.
233 238
  template <typename V>
234 239
  class RangeMap : public MapBase<int, V> {
235 240
    template <typename V1>
236 241
    friend class RangeMap;
237 242
  private:
238 243

	
239 244
    typedef std::vector<V> Vector;
240 245
    Vector _vector;
241 246

	
... ...
@@ -520,193 +525,193 @@
520 525
  /// binary functor and returns the combination of the two given maps
521 526
  /// using the functor.
522 527
  /// That is to say, if \c m1 is of type \c M1 and \c m2 is of \c M2
523 528
  /// and \c f is of \c F, then for
524 529
  /// \code
525 530
  ///   CombineMap<M1,M2,F,V> cm(m1,m2,f);
526 531
  /// \endcode
527 532
  /// <tt>cm[x]</tt> will be equal to <tt>f(m1[x],m2[x])</tt>.
528 533
  ///
529 534
  /// The \c Key type of the map is inherited from \c M1 (\c M1::Key
530 535
  /// must be convertible to \c M2::Key) and the \c Value type is \c V.
531 536
  /// \c M2::Value and \c M1::Value must be convertible to the
532 537
  /// corresponding input parameter of \c F and the return type of \c F
533 538
  /// must be convertible to \c V.
534 539
  ///
535 540
  /// The simplest way of using this map is through the combineMap()
536 541
  /// function.
537 542
  ///
538 543
  /// \sa ComposeMap
539 544
  ///
540 545
  /// \todo Check the requirements.
541 546
  template<typename M1, typename M2, typename F,
542 547
	   typename V = typename F::result_type>
543 548
  class CombineMap : public MapBase<typename M1::Key, V> {
544 549
    const M1 &_m1;
545 550
    const M2 &_m2;
546 551
    F _f;
547 552
  public:
548 553
    typedef MapBase<typename M1::Key, V> Parent;
549 554
    typedef typename Parent::Key Key;
550 555
    typedef typename Parent::Value Value;
551 556

	
552 557
    /// Constructor
553 558
    CombineMap(const M1 &m1, const M2 &m2, const F &f = F())
554 559
      : _m1(m1), _m2(m2), _f(f) {}
555 560
    /// \e
556 561
    Value operator[](const Key &k) const { return _f(_m1[k],_m2[k]); }
557 562
  };
558 563

	
559 564
  /// Returns a \ref CombineMap class
560 565

	
561 566
  /// This function just returns a \ref CombineMap class.
562 567
  ///
563 568
  /// For example, if \c m1 and \c m2 are both maps with \c double
564 569
  /// values, then
565 570
  /// \code
566 571
  ///   combineMap(m1,m2,std::plus<double>())
567 572
  /// \endcode
568 573
  /// is equivalent to
569 574
  /// \code
570 575
  ///   addMap(m1,m2)
571 576
  /// \endcode
572 577
  ///
573 578
  /// This function is specialized for adaptable binary function
574 579
  /// classes and C++ functions.
575 580
  ///
576 581
  /// \relates CombineMap
577 582
  template<typename M1, typename M2, typename F, typename V>
578 583
  inline CombineMap<M1, M2, F, V>
579 584
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
580 585
    return CombineMap<M1, M2, F, V>(m1,m2,f);
581 586
  }
582 587

	
583 588
  template<typename M1, typename M2, typename F>
584 589
  inline CombineMap<M1, M2, F, typename F::result_type>
585 590
  combineMap(const M1 &m1, const M2 &m2, const F &f) {
586 591
    return combineMap<M1, M2, F, typename F::result_type>(m1,m2,f);
587 592
  }
588 593

	
589 594
  template<typename M1, typename M2, typename K1, typename K2, typename V>
590 595
  inline CombineMap<M1, M2, V (*)(K1, K2), V>
591 596
  combineMap(const M1 &m1, const M2 &m2, V (*f)(K1, K2)) {
592 597
    return combineMap<M1, M2, V (*)(K1, K2), V>(m1,m2,f);
593 598
  }
594 599

	
595 600

	
596 601
  /// Converts an STL style (unary) functor to a map
597 602

	
598 603
  /// This \ref concepts::ReadMap "read-only map" returns the value
599 604
  /// of a given functor. Actually, it just wraps the functor and
600 605
  /// provides the \c Key and \c Value typedefs.
601 606
  ///
602 607
  /// Template parameters \c K and \c V will become its \c Key and
603 608
  /// \c Value. In most cases they have to be given explicitly because
604 609
  /// a functor typically does not provide \c argument_type and
605 610
  /// \c result_type typedefs.
606 611
  /// Parameter \c F is the type of the used functor.
607 612
  ///
608 613
  /// The simplest way of using this map is through the functorToMap()
609 614
  /// function.
610 615
  ///
611 616
  /// \sa MapToFunctor
612 617
  template<typename F,
613 618
	   typename K = typename F::argument_type,
614 619
	   typename V = typename F::result_type>
615 620
  class FunctorToMap : public MapBase<K, V> {
616
    const F &_f;
621
    F _f;
617 622
  public:
618 623
    typedef MapBase<K, V> Parent;
619 624
    typedef typename Parent::Key Key;
620 625
    typedef typename Parent::Value Value;
621 626

	
622 627
    /// Constructor
623 628
    FunctorToMap(const F &f = F()) : _f(f) {}
624 629
    /// \e
625 630
    Value operator[](const Key &k) const { return _f(k); }
626 631
  };
627 632

	
628 633
  /// Returns a \ref FunctorToMap class
629 634

	
630 635
  /// This function just returns a \ref FunctorToMap class.
631 636
  ///
632 637
  /// This function is specialized for adaptable binary function
633 638
  /// classes and C++ functions.
634 639
  ///
635 640
  /// \relates FunctorToMap
636 641
  template<typename K, typename V, typename F>
637 642
  inline FunctorToMap<F, K, V> functorToMap(const F &f) {
638 643
    return FunctorToMap<F, K, V>(f);
639 644
  }
640 645

	
641 646
  template <typename F>
642 647
  inline FunctorToMap<F, typename F::argument_type, typename F::result_type>
643 648
    functorToMap(const F &f)
644 649
  {
645 650
    return FunctorToMap<F, typename F::argument_type,
646 651
      typename F::result_type>(f);
647 652
  }
648 653

	
649 654
  template <typename K, typename V>
650 655
  inline FunctorToMap<V (*)(K), K, V> functorToMap(V (*f)(K)) {
651 656
    return FunctorToMap<V (*)(K), K, V>(f);
652 657
  }
653 658

	
654 659

	
655 660
  /// Converts a map to an STL style (unary) functor
656 661

	
657 662
  /// This class converts a map to an STL style (unary) functor.
658 663
  /// That is it provides an <tt>operator()</tt> to read its values.
659 664
  ///
660 665
  /// For the sake of convenience it also works as a usual
661 666
  /// \ref concepts::ReadMap "readable map", i.e. <tt>operator[]</tt>
662 667
  /// and the \c Key and \c Value typedefs also exist.
663 668
  ///
664 669
  /// The simplest way of using this map is through the mapToFunctor()
665 670
  /// function.
666 671
  ///
667 672
  ///\sa FunctorToMap
668 673
  template <typename M>
669 674
  class MapToFunctor : public MapBase<typename M::Key, typename M::Value> {
670 675
    const M &_m;
671 676
  public:
672 677
    typedef MapBase<typename M::Key, typename M::Value> Parent;
673 678
    typedef typename Parent::Key Key;
674 679
    typedef typename Parent::Value Value;
675 680

	
676 681
    typedef typename Parent::Key argument_type;
677 682
    typedef typename Parent::Value result_type;
678 683

	
679 684
    /// Constructor
680 685
    MapToFunctor(const M &m) : _m(m) {}
681 686
    /// \e
682 687
    Value operator()(const Key &k) const { return _m[k]; }
683 688
    /// \e
684 689
    Value operator[](const Key &k) const { return _m[k]; }
685 690
  };
686 691

	
687 692
  /// Returns a \ref MapToFunctor class
688 693

	
689 694
  /// This function just returns a \ref MapToFunctor class.
690 695
  /// \relates MapToFunctor
691 696
  template<typename M>
692 697
  inline MapToFunctor<M> mapToFunctor(const M &m) {
693 698
    return MapToFunctor<M>(m);
694 699
  }
695 700

	
696 701

	
697 702
  /// \brief Map adaptor to convert the \c Value type of a map to
698 703
  /// another type using the default conversion.
699 704

	
700 705
  /// Map adaptor to convert the \c Value type of a \ref concepts::ReadMap
701 706
  /// "readable map" to another type using the default conversion.
702 707
  /// The \c Key type of it is inherited from \c M and the \c Value
703 708
  /// type is \c V.
704 709
  /// This type conforms the \ref concepts::ReadMap "ReadMap" concept.
705 710
  ///
706 711
  /// The simplest way of using this map is through the convertMap()
707 712
  /// function.
708 713
  template <typename M, typename V>
709 714
  class ConvertMap : public MapBase<typename M::Key, V> {
710 715
    const M &_m;
711 716
  public:
712 717
    typedef MapBase<typename M::Key, V> Parent;
Ignore white space 192 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 35
class C {
36 36
  int x;
37 37
public:
38 38
  C(int _x) : x(_x) {}
39 39
};
40 40

	
41 41
class F {
42 42
public:
43 43
  typedef A argument_type;
44 44
  typedef B result_type;
45 45

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

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

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

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

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

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

	
75 75
  // NullMap
76 76
  {
77 77
    checkConcept<ReadWriteMap<A,B>, NullMap<A,B> >();
78 78
    NullMap<A,B> map1;
79 79
    NullMap<A,B> map2 = map1;
80 80
    map1 = nullMap<A,B>();
81 81
  }
82 82

	
83 83
  // ConstMap
84 84
  {
85 85
    checkConcept<ReadWriteMap<A,B>, ConstMap<A,B> >();
86
    checkConcept<ReadWriteMap<A,C>, ConstMap<A,C> >();
86 87
    ConstMap<A,B> map1;
87 88
    ConstMap<A,B> map2(B());
88 89
    ConstMap<A,B> map3 = map1;
89 90
    map1 = constMap<A>(B());
91
    map1 = constMap<A,B>();
90 92
    map1.setAll(B());
93
    ConstMap<A,C> map4(C(1));
94
    ConstMap<A,C> map5 = map4;
95
    map4 = constMap<A>(C(2));
96
    map4.setAll(C(3));
91 97

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

	
95 101
    checkConcept<ReadWriteMap<A,int>, ConstMap<A,Const<int,10> > >();
96
    ConstMap<A,Const<int,10> > map4;
97
    ConstMap<A,Const<int,10> > map5 = map4;
98
    map4 = map5;
99
    check(map4[A()] == 10 && map5[A()] == 10, "Something is wrong with ConstMap");
102
    ConstMap<A,Const<int,10> > map6;
103
    ConstMap<A,Const<int,10> > map7 = map6;
104
    map6 = constMap<A,int,10>();
105
    map7 = constMap<A,Const<int,10> >();
106
    check(map6[A()] == 10 && map7[A()] == 10, "Something is wrong with ConstMap");
100 107
  }
101 108

	
102 109
  // IdentityMap
103 110
  {
104 111
    checkConcept<ReadMap<A,A>, IdentityMap<A> >();
105 112
    IdentityMap<A> map1;
106 113
    IdentityMap<A> map2 = map1;
107 114
    map1 = identityMap<A>();
108 115

	
109 116
    checkConcept<ReadMap<double,double>, IdentityMap<double> >();
110 117
    check(identityMap<double>()[1.0] == 1.0 && identityMap<double>()[3.14] == 3.14,
111 118
          "Something is wrong with IdentityMap");
112 119
  }
113 120

	
114 121
  // RangeMap
115 122
  {
116 123
    checkConcept<ReferenceMap<int,B,B&,const B&>, RangeMap<B> >();
117 124
    RangeMap<B> map1;
118 125
    RangeMap<B> map2(10);
119 126
    RangeMap<B> map3(10,B());
120 127
    RangeMap<B> map4 = map1;
121 128
    RangeMap<B> map5 = rangeMap<B>();
122 129
    RangeMap<B> map6 = rangeMap<B>(10);
123 130
    RangeMap<B> map7 = rangeMap(10,B());
124 131

	
125 132
    checkConcept< ReferenceMap<int, double, double&, const double&>,
126 133
                  RangeMap<double> >();
127 134
    std::vector<double> v(10, 0);
128 135
    v[5] = 100;
129 136
    RangeMap<double> map8(v);
130 137
    RangeMap<double> map9 = rangeMap(v);
131 138
    check(map9.size() == 10 && map9[2] == 0 && map9[5] == 100,
132 139
          "Something is wrong with RangeMap");
133 140
  }
134 141

	
135 142
  // SparseMap
136 143
  {
137 144
    checkConcept<ReferenceMap<A,B,B&,const B&>, SparseMap<A,B> >();
138 145
    SparseMap<A,B> map1;
139 146
    SparseMap<A,B> map2(B());
140 147
    SparseMap<A,B> map3 = sparseMap<A,B>();
141 148
    SparseMap<A,B> map4 = sparseMap<A>(B());
142 149

	
143 150
    checkConcept< ReferenceMap<double, int, int&, const int&>,
144 151
                  SparseMap<double, int> >();
145 152
    std::map<double, int> m;
146 153
    SparseMap<double, int> map5(m);
147 154
    SparseMap<double, int> map6(m,10);
148 155
    SparseMap<double, int> map7 = sparseMap(m);
149 156
    SparseMap<double, int> map8 = sparseMap(m,10);
150 157

	
151 158
    check(map5[1.0] == 0 && map5[3.14] == 0 && map6[1.0] == 10 && map6[3.14] == 10,
152 159
          "Something is wrong with SparseMap");
153 160
    map5[1.0] = map6[3.14] = 100;
154 161
    check(map5[1.0] == 100 && map5[3.14] == 0 && map6[1.0] == 10 && map6[3.14] == 100,
155 162
          "Something is wrong with SparseMap");
156 163
  }
157 164

	
158 165
  // ComposeMap
159 166
  {
160 167
    typedef ComposeMap<DoubleMap, ReadMap<B,A> > CompMap;
161 168
    checkConcept<ReadMap<B,double>, CompMap>();
162 169
    CompMap map1(DoubleMap(),ReadMap<B,A>());
163 170
    CompMap map2 = composeMap(DoubleMap(), ReadMap<B,A>());
164 171

	
165 172
    SparseMap<double, bool> m1(false); m1[3.14] = true;
166 173
    RangeMap<double> m2(2); m2[0] = 3.0; m2[1] = 3.14;
167 174
    check(!composeMap(m1,m2)[0] && composeMap(m1,m2)[1], "Something is wrong with ComposeMap")
168 175
  }
169 176

	
170 177
  // CombineMap
171 178
  {
172 179
    typedef CombineMap<DoubleMap, DoubleMap, std::plus<double> > CombMap;
173 180
    checkConcept<ReadMap<A,double>, CombMap>();
174 181
    CombMap map1(DoubleMap(), DoubleMap());
175 182
    CombMap map2 = combineMap(DoubleMap(), DoubleMap(), std::plus<double>());
176 183

	
177 184
    check(combineMap(constMap<B,int,2>(), identityMap<B>(), &binc)[B()] == 3,
178 185
          "Something is wrong with CombineMap");
179 186
  }
180 187

	
181 188
  // FunctorToMap, MapToFunctor
182 189
  {
183 190
    checkConcept<ReadMap<A,B>, FunctorToMap<F,A,B> >();
184 191
    checkConcept<ReadMap<A,B>, FunctorToMap<F> >();
185 192
    FunctorToMap<F> map1;
186 193
    FunctorToMap<F> map2(F());
187 194
    B b = functorToMap(F())[A()];
188 195

	
189 196
    checkConcept<ReadMap<A,B>, MapToFunctor<ReadMap<A,B> > >();
190 197
    MapToFunctor<ReadMap<A,B> > map(ReadMap<A,B>());
191 198

	
192 199
    check(functorToMap(&func)[A()] == 3, "Something is wrong with FunctorToMap");
193 200
    check(mapToFunctor(constMap<A,int>(2))(A()) == 2, "Something is wrong with MapToFunctor");
194 201
    check(mapToFunctor(functorToMap(&func))(A()) == 3 && mapToFunctor(functorToMap(&func))[A()] == 3,
195 202
          "Something is wrong with FunctorToMap or MapToFunctor");
0 comments (0 inline)