src/lemon/concept/maps.h
changeset 970 09f9abe22df2
child 987 87f7c54892df
equal deleted inserted replaced
-1:000000000000 0:912e98ccf39b
       
     1 /* -*- C++ -*-
       
     2  * src/lemon/concept/maps.h - Part of LEMON, a generic C++ optimization library
       
     3  *
       
     4  * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     5  * (Egervary Combinatorial Optimization Research Group, 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_MAPS_H
       
    18 #define LEMON_CONCEPT_MAPS_H
       
    19 
       
    20 #include <lemon/concept_check.h>
       
    21 
       
    22 ///\ingroup concept
       
    23 ///\file
       
    24 ///\brief Map concepts checking classes for testing and documenting.
       
    25 
       
    26 namespace lemon {
       
    27 
       
    28   namespace concept {
       
    29   
       
    30     /// \addtogroup concept
       
    31     /// @{
       
    32 
       
    33     /// Readable map concept
       
    34     template<typename K, typename T>
       
    35     class ReadMap
       
    36     {
       
    37     public:
       
    38       /// Map's key type.
       
    39       typedef K KeyType;    
       
    40       /// Map's value type. (The type of objects associated with the keys).
       
    41       typedef T ValueType;
       
    42 
       
    43       /// Returns the value associated with a key.
       
    44       ValueType operator[](const KeyType &k) const {return ValueType();}
       
    45 
       
    46       ///Default constructor
       
    47       ReadMap() {}
       
    48     };
       
    49 
       
    50 
       
    51     /// Writable map concept
       
    52     template<typename K, typename T>
       
    53     class WriteMap
       
    54     {
       
    55     public:
       
    56       /// Map's key type.
       
    57       typedef K KeyType;    
       
    58       /// Map's value type. (The type of objects associated with the keys).
       
    59       typedef T ValueType;
       
    60 
       
    61       /// Sets the value associated with a key.
       
    62       void set(const KeyType &k,const ValueType &t) {}
       
    63 
       
    64       ///Default constructor
       
    65       WriteMap() {}
       
    66     };
       
    67 
       
    68     ///Read/Writable map concept
       
    69     template<typename K, typename T>
       
    70     class ReadWriteMap : public ReadMap<K,T>,
       
    71 			    public WriteMap<K,T>
       
    72     {
       
    73     public:
       
    74       /// Map's key type.
       
    75       typedef K KeyType;    
       
    76       /// Map's value type. (The type of objects associated with the keys).
       
    77       typedef T ValueType;
       
    78 
       
    79       /// Returns the value associated with a key.
       
    80       ValueType operator[](const KeyType &k) const {return ValueType();}
       
    81       /// Sets the value associated with a key.
       
    82       void set(const KeyType &k,const ValueType &t) {}
       
    83 
       
    84       ///Default constructor
       
    85       ReadWriteMap() {}
       
    86     };
       
    87   
       
    88   
       
    89     ///Dereferable map concept
       
    90     template<typename K, typename T>
       
    91     class ReferenceMap : public ReadWriteMap<K,T>
       
    92     {
       
    93     public:
       
    94       /// Map's key type.
       
    95       typedef K KeyType;    
       
    96       /// Map's value type. (The type of objects associated with the keys).
       
    97       typedef T ValueType;
       
    98 
       
    99     protected:
       
   100       ValueType tmp;
       
   101     public:
       
   102       typedef ValueType& ReferenceType;
       
   103       /// Map's const reference type.
       
   104       typedef const ValueType& ConstReferenceType;
       
   105 
       
   106       ///Returns a reference to the value associated to a key.
       
   107       ReferenceType operator[](const KeyType &i) { return tmp; }
       
   108       ///Returns a const reference to the value associated to a key.
       
   109       ConstReferenceType operator[](const KeyType &i) const
       
   110       { return tmp; }
       
   111       /// Sets the value associated with a key.
       
   112       void set(const KeyType &k,const ValueType &t) { operator[](k)=t; }
       
   113 
       
   114       ///Default constructor
       
   115       ReferenceMap() {}
       
   116     };
       
   117 
       
   118 
       
   119     template<typename Item, typename T, typename Graph>
       
   120     class GraphMap : public ReadWriteMap<Item, T> {
       
   121       // I really, really don't like the idea that every graph should have
       
   122       // reference maps! --klao
       
   123 
       
   124     private:
       
   125       // We state explicitly that graph maps have no default constructor?
       
   126       GraphMap();
       
   127 
       
   128     public:
       
   129       explicit GraphMap(Graph const&) {}
       
   130       // value for initializing
       
   131       GraphMap(Graph const&, T) {}
       
   132 
       
   133       // this probably should be required:
       
   134       GraphMap(GraphMap const&) {}
       
   135       GraphMap& operator=(GraphMap const&) { return *this; }
       
   136 
       
   137       // but this is a absolute no-op! We should provide a more generic
       
   138       // graph-map-copy operation.
       
   139       //
       
   140       // template<typename TT>
       
   141       // GraphMap(GraphMap<TT> const&);
       
   142       //
       
   143       // template<typename TT>
       
   144       // GraphMap& operator=(const GraphMap<TT>&);
       
   145     };
       
   146 
       
   147 
       
   148     /****************  Concept-checking classes  ****************/
       
   149 
       
   150     template<typename ReadMap>
       
   151     struct ReadMapConcept {
       
   152       typedef typename ReadMap::KeyType KeyType;
       
   153       typedef typename ReadMap::ValueType ValueType;
       
   154 
       
   155       void constraints() {
       
   156 	// No constraints for constructor.
       
   157 
       
   158 	// What are the requirement for the ValueType?
       
   159 	// CopyConstructible? Assignable? None of these?
       
   160 	ValueType v = m[k];
       
   161 	v = m[k];
       
   162 
       
   163 	// FIXME:
       
   164 	ignore_unused_variable_warning(v);
       
   165       }
       
   166 
       
   167       ReadMap m;
       
   168       KeyType k;
       
   169     };
       
   170 
       
   171     template<typename WriteMap>
       
   172     struct WriteMapConcept {
       
   173       typedef typename WriteMap::KeyType KeyType;
       
   174       typedef typename WriteMap::ValueType ValueType;
       
   175 
       
   176       void constraints() {
       
   177 	// No constraints for constructor.
       
   178 
       
   179 	m.set(k, v);
       
   180       }
       
   181 
       
   182       WriteMap m;
       
   183       KeyType k;
       
   184       ValueType v;
       
   185     };
       
   186 
       
   187     template<typename ReadWriteMap>
       
   188     struct ReadWriteMapConcept {
       
   189       void constraints() {
       
   190 	function_requires< ReadMapConcept<ReadWriteMap> >();
       
   191 	function_requires< WriteMapConcept<ReadWriteMap> >();
       
   192       }
       
   193     };
       
   194 
       
   195     template<typename ReferenceMap>
       
   196     struct ReferenceMapConcept {
       
   197       typedef typename ReferenceMap::KeyType KeyType;
       
   198       typedef typename ReferenceMap::ValueType ValueType;
       
   199       typedef typename ReferenceMap::ReferenceType ReferenceType;
       
   200 
       
   201       // What for is this?
       
   202       typedef typename ReferenceMap::ConstReferenceType ConstReferenceType;
       
   203 
       
   204       void constraints() {
       
   205 	function_requires< ReadWriteMapConcept<ReferenceMap> >();
       
   206 
       
   207 	m[k] = v;
       
   208 	// Or should we require real reference?
       
   209 	// Like this:
       
   210 	// ValueType &vv = m[k];
       
   211 	// ignore_unused_variable_warning(vv);
       
   212       }
       
   213 
       
   214       ReferenceMap m;
       
   215       KeyType k;
       
   216       ValueType v;
       
   217     };
       
   218 
       
   219     /// \todo GraphMapConceptCheck
       
   220 
       
   221     template<typename GraphMap, typename Graph>
       
   222     struct GraphMapConcept {
       
   223       void constraints() {
       
   224 	function_requires< ReadWriteMapConcept<GraphMap> >();
       
   225 	// Construction with a graph parameter
       
   226 	GraphMap a(g);
       
   227 	// Ctor with a graph and a default value parameter
       
   228 	GraphMap a2(g,t);
       
   229 	// Copy ctor. Do we need it?
       
   230 	GraphMap b=c;
       
   231 	// Copy operator. Do we need it?
       
   232 	a=b;
       
   233 
       
   234 	ignore_unused_variable_warning(a2);
       
   235       }
       
   236       const GraphMap &c;
       
   237       const Graph &g;
       
   238       const typename GraphMap::ValueType &t;
       
   239     };
       
   240     
       
   241 
       
   242     // @}
       
   243 
       
   244   } //namespace concept
       
   245 } //namespace lemon
       
   246 #endif // LEMON_CONCEPT_MAPS_H