lemon/bits/default_map.h
author deba
Tue, 30 Oct 2007 10:51:07 +0000
changeset 2504 46a82ce84cc6
parent 2333 8070a099ffb6
child 2553 bfced05fa852
permissions -rw-r--r--
Bug fix
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2007
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_BITS_DEFAULT_MAP_H
    20 #define LEMON_BITS_DEFAULT_MAP_H
    21 
    22 
    23 #include <lemon/bits/array_map.h>
    24 #include <lemon/bits/vector_map.h>
    25 #include <lemon/bits/debug_map.h>
    26 
    27 ///\ingroup graphbits
    28 ///\file
    29 ///\brief Graph maps that construct and destruct their elements dynamically.
    30 
    31 namespace lemon {
    32   
    33   
    34 #ifndef LEMON_USE_DEBUG_MAP
    35 
    36   template <typename _Graph, typename _Item, typename _Value>
    37   struct DefaultMapSelector {
    38     typedef ArrayMap<_Graph, _Item, _Value> Map;
    39   };
    40 
    41   // bool
    42   template <typename _Graph, typename _Item>
    43   struct DefaultMapSelector<_Graph, _Item, bool> {
    44     typedef VectorMap<_Graph, _Item, bool> Map;
    45   };
    46 
    47   // char
    48   template <typename _Graph, typename _Item>
    49   struct DefaultMapSelector<_Graph, _Item, char> {
    50     typedef VectorMap<_Graph, _Item, char> Map;
    51   };
    52 
    53   template <typename _Graph, typename _Item>
    54   struct DefaultMapSelector<_Graph, _Item, signed char> {
    55     typedef VectorMap<_Graph, _Item, signed char> Map;
    56   };
    57 
    58   template <typename _Graph, typename _Item>
    59   struct DefaultMapSelector<_Graph, _Item, unsigned char> {
    60     typedef VectorMap<_Graph, _Item, unsigned char> Map;
    61   };
    62 
    63 
    64   // int
    65   template <typename _Graph, typename _Item>
    66   struct DefaultMapSelector<_Graph, _Item, signed int> {
    67     typedef VectorMap<_Graph, _Item, signed int> Map;
    68   };
    69 
    70   template <typename _Graph, typename _Item>
    71   struct DefaultMapSelector<_Graph, _Item, unsigned int> {
    72     typedef VectorMap<_Graph, _Item, unsigned int> Map;
    73   };
    74 
    75 
    76   // short
    77   template <typename _Graph, typename _Item>
    78   struct DefaultMapSelector<_Graph, _Item, signed short> {
    79     typedef VectorMap<_Graph, _Item, signed short> Map;
    80   };
    81 
    82   template <typename _Graph, typename _Item>
    83   struct DefaultMapSelector<_Graph, _Item, unsigned short> {
    84     typedef VectorMap<_Graph, _Item, unsigned short> Map;
    85   };
    86 
    87 
    88   // long
    89   template <typename _Graph, typename _Item>
    90   struct DefaultMapSelector<_Graph, _Item, signed long> {
    91     typedef VectorMap<_Graph, _Item, signed long> Map;
    92   };
    93 
    94   template <typename _Graph, typename _Item>
    95   struct DefaultMapSelector<_Graph, _Item, unsigned long> {
    96     typedef VectorMap<_Graph, _Item, unsigned long> Map;
    97   };
    98 
    99 
   100 #if defined __GNUC__ && !defined __STRICT_ANSI__
   101 
   102   // long long
   103   template <typename _Graph, typename _Item>
   104   struct DefaultMapSelector<_Graph, _Item, signed long long> {
   105     typedef VectorMap<_Graph, _Item, signed long long> Map;
   106   };
   107 
   108   template <typename _Graph, typename _Item>
   109   struct DefaultMapSelector<_Graph, _Item, unsigned long long> {
   110     typedef VectorMap<_Graph, _Item, unsigned long long> Map;
   111   };
   112 
   113 #endif
   114 
   115 
   116   // float
   117   template <typename _Graph, typename _Item>
   118   struct DefaultMapSelector<_Graph, _Item, float> {
   119     typedef VectorMap<_Graph, _Item, float> Map;
   120   };
   121 
   122 
   123   // double
   124   template <typename _Graph, typename _Item>
   125   struct DefaultMapSelector<_Graph, _Item, double> {
   126     typedef VectorMap<_Graph, _Item,  double> Map;
   127   };
   128 
   129 
   130   // long double
   131   template <typename _Graph, typename _Item>
   132   struct DefaultMapSelector<_Graph, _Item, long double> {
   133     typedef VectorMap<_Graph, _Item, long double> Map;
   134   };
   135 
   136 
   137   // pointer
   138   template <typename _Graph, typename _Item, typename _Ptr>
   139   struct DefaultMapSelector<_Graph, _Item, _Ptr*> {
   140     typedef VectorMap<_Graph, _Item, _Ptr*> Map;
   141   };
   142 
   143 #else 
   144 
   145   template <typename _Graph, typename _Item, typename _Value>
   146   struct DefaultMapSelector {
   147     typedef DebugMap<_Graph, _Item, _Value> Map;
   148   };
   149 
   150 #endif  
   151 
   152   /// \e
   153   template <typename _Graph, typename _Item, typename _Value>
   154   class DefaultMap 
   155     : public DefaultMapSelector<_Graph, _Item, _Value>::Map {
   156   public:
   157     typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent;
   158     typedef DefaultMap<_Graph, _Item, _Value> Map;
   159     
   160     typedef typename Parent::Graph Graph;
   161     typedef typename Parent::Value Value;
   162 
   163     explicit DefaultMap(const Graph& graph) : Parent(graph) {}
   164     DefaultMap(const Graph& graph, const Value& value) 
   165       : Parent(graph, value) {}
   166 
   167     DefaultMap& operator=(const DefaultMap& cmap) {
   168       return operator=<DefaultMap>(cmap);
   169     }
   170 
   171     template <typename CMap>
   172     DefaultMap& operator=(const CMap& cmap) {
   173       Parent::operator=(cmap);
   174       return *this;
   175     }
   176 
   177   };
   178 
   179 }
   180 
   181 #endif