src/lemon/bits/default_map.h
changeset 1435 8e85e6bbefdf
parent 1307 d4acebef7276
equal deleted inserted replaced
1:7ddbf34a6c24 -1:000000000000
     1 /* -*- C++ -*-
       
     2  * src/lemon/default_map.h - Part of LEMON, a generic C++ optimization library
       
     3  *
       
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     5  * (Egervary Research Group on Combinatorial Optimization, 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_DEFAULT_MAP_H
       
    18 #define LEMON_DEFAULT_MAP_H
       
    19 
       
    20 
       
    21 #include <lemon/bits/array_map.h>
       
    22 #include <lemon/bits/vector_map.h>
       
    23 
       
    24 ///\ingroup graphmaps
       
    25 ///\file
       
    26 ///\brief Graph maps that construct and destruct
       
    27 ///their elements dynamically.
       
    28 
       
    29 namespace lemon {
       
    30 
       
    31 /// \addtogroup graphmaps
       
    32 /// @{
       
    33 
       
    34   /** The ArrayMap template class is graph map structure what
       
    35    *  automatically updates the map when a key is added to or erased from
       
    36    *  the map. This map uses the VectorMap if the Value is a primitive
       
    37    *  type and the ArrayMap for the other cases.
       
    38    *
       
    39    *  The template parameter is the MapRegistry that the maps
       
    40    *  will belong to and the Value.
       
    41    */
       
    42 
       
    43 
       
    44 
       
    45   template <typename _Graph, typename _Item, typename _Value>
       
    46   struct DefaultMapSelector {
       
    47     typedef ArrayMap<_Graph, _Item, _Value> Map;
       
    48   };
       
    49 
       
    50   // bool
       
    51   template <typename _Graph, typename _Item>
       
    52   struct DefaultMapSelector<_Graph, _Item, bool> {
       
    53     typedef VectorMap<_Graph, _Item, bool> Map;
       
    54   };
       
    55 
       
    56   // char
       
    57   template <typename _Graph, typename _Item>
       
    58   struct DefaultMapSelector<_Graph, _Item, char> {
       
    59     typedef VectorMap<_Graph, _Item, char> Map;
       
    60   };
       
    61 
       
    62   template <typename _Graph, typename _Item>
       
    63   struct DefaultMapSelector<_Graph, _Item, signed char> {
       
    64     typedef VectorMap<_Graph, _Item, signed char> Map;
       
    65   };
       
    66 
       
    67   template <typename _Graph, typename _Item>
       
    68   struct DefaultMapSelector<_Graph, _Item, unsigned char> {
       
    69     typedef VectorMap<_Graph, _Item, unsigned char> Map;
       
    70   };
       
    71 
       
    72 
       
    73   // int
       
    74   template <typename _Graph, typename _Item>
       
    75   struct DefaultMapSelector<_Graph, _Item, signed int> {
       
    76     typedef VectorMap<_Graph, _Item, signed int> Map;
       
    77   };
       
    78 
       
    79   template <typename _Graph, typename _Item>
       
    80   struct DefaultMapSelector<_Graph, _Item, unsigned int> {
       
    81     typedef VectorMap<_Graph, _Item, unsigned int> Map;
       
    82   };
       
    83 
       
    84 
       
    85   // short
       
    86   template <typename _Graph, typename _Item>
       
    87   struct DefaultMapSelector<_Graph, _Item, signed short> {
       
    88     typedef VectorMap<_Graph, _Item, signed short> Map;
       
    89   };
       
    90 
       
    91   template <typename _Graph, typename _Item>
       
    92   struct DefaultMapSelector<_Graph, _Item, unsigned short> {
       
    93     typedef VectorMap<_Graph, _Item, unsigned short> Map;
       
    94   };
       
    95 
       
    96 
       
    97   // long
       
    98   template <typename _Graph, typename _Item>
       
    99   struct DefaultMapSelector<_Graph, _Item, signed long> {
       
   100     typedef VectorMap<_Graph, _Item, signed long> Map;
       
   101   };
       
   102 
       
   103   template <typename _Graph, typename _Item>
       
   104   struct DefaultMapSelector<_Graph, _Item, unsigned long> {
       
   105     typedef VectorMap<_Graph, _Item, unsigned long> Map;
       
   106   };
       
   107 
       
   108   // \todo handling long long type
       
   109 
       
   110 
       
   111   // float
       
   112   template <typename _Graph, typename _Item>
       
   113   struct DefaultMapSelector<_Graph, _Item, float> {
       
   114     typedef VectorMap<_Graph, _Item, float> Map;
       
   115   };
       
   116 
       
   117 
       
   118   // double
       
   119   template <typename _Graph, typename _Item>
       
   120   struct DefaultMapSelector<_Graph, _Item, double> {
       
   121     typedef VectorMap<_Graph, _Item,  double> Map;
       
   122   };
       
   123 
       
   124 
       
   125   // long double
       
   126   template <typename _Graph, typename _Item>
       
   127   struct DefaultMapSelector<_Graph, _Item, long double> {
       
   128     typedef VectorMap<_Graph, _Item, long double> Map;
       
   129   };
       
   130 
       
   131 
       
   132   // pointer
       
   133   template <typename _Graph, typename _Item, typename _Ptr>
       
   134   struct DefaultMapSelector<_Graph, _Item, _Ptr*> {
       
   135     typedef VectorMap<_Graph, _Item, _Ptr*> Map;
       
   136   };
       
   137 
       
   138 
       
   139 
       
   140   template <
       
   141     typename _Graph, 
       
   142     typename _Item,
       
   143     typename _Value>
       
   144   class DefaultMap 
       
   145     : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
       
   146   public:
       
   147     typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
       
   148     typedef DefaultMap<_Graph, _Item, _Value> Map;
       
   149     
       
   150     typedef typename Parent::Graph Graph;
       
   151     typedef typename Parent::Value Value;
       
   152 
       
   153     DefaultMap(const Graph& _g) : Parent(_g) {}
       
   154     DefaultMap(const Graph& _g, const Value& _v) : Parent(_g, _v) {}
       
   155   };
       
   156 
       
   157 
       
   158 
       
   159   template <typename _Base> 
       
   160   class DefaultMappableGraphExtender : public _Base {
       
   161   public:
       
   162 
       
   163     typedef DefaultMappableGraphExtender<_Base> Graph;
       
   164     typedef _Base Parent;
       
   165 
       
   166     typedef typename Parent::Node Node;
       
   167     typedef typename Parent::NodeIt NodeIt;
       
   168 
       
   169     typedef typename Parent::Edge Edge;
       
   170     typedef typename Parent::EdgeIt EdgeIt;
       
   171 
       
   172     
       
   173     template <typename _Value>
       
   174     class NodeMap 
       
   175       : public IterableMapExtender<DefaultMap<Graph, Node, _Value> > {
       
   176     public:
       
   177       typedef DefaultMappableGraphExtender Graph;
       
   178       typedef IterableMapExtender<DefaultMap<Graph, Node, _Value> > Parent;
       
   179 
       
   180       NodeMap(const Graph& _g) 
       
   181 	: Parent(_g) {}
       
   182       NodeMap(const Graph& _g, const _Value& _v) 
       
   183 	: Parent(_g, _v) {}
       
   184     };
       
   185 
       
   186     template <typename _Value>
       
   187     class EdgeMap 
       
   188       : public IterableMapExtender<DefaultMap<Graph, Edge, _Value> > {
       
   189     public:
       
   190       typedef DefaultMappableGraphExtender Graph;
       
   191       typedef IterableMapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
       
   192 
       
   193       EdgeMap(const Graph& _g) 
       
   194 	: Parent(_g) {}
       
   195       EdgeMap(const Graph& _g, const _Value& _v) 
       
   196 	: Parent(_g, _v) {}
       
   197     };
       
   198     
       
   199   };
       
   200 
       
   201   template <typename _Base> 
       
   202   class MappableUndirGraphExtender : 
       
   203     public DefaultMappableGraphExtender<_Base> {
       
   204   public:
       
   205 
       
   206     typedef MappableUndirGraphExtender Graph;
       
   207     typedef DefaultMappableGraphExtender<_Base> Parent;
       
   208 
       
   209     typedef typename Parent::UndirEdge UndirEdge;
       
   210 
       
   211     template <typename _Value>
       
   212     class UndirEdgeMap 
       
   213       : public IterableMapExtender<DefaultMap<Graph, UndirEdge, _Value> > {
       
   214     public:
       
   215       typedef MappableUndirGraphExtender Graph;
       
   216       typedef IterableMapExtender<
       
   217 	DefaultMap<Graph, UndirEdge, _Value> > Parent;
       
   218 
       
   219       UndirEdgeMap(const Graph& _g) 
       
   220 	: Parent(_g) {}
       
   221       UndirEdgeMap(const Graph& _g, const _Value& _v) 
       
   222 	: Parent(_g, _v) {}
       
   223     };
       
   224 
       
   225 
       
   226   };
       
   227 
       
   228 }
       
   229 
       
   230 #endif