diff -r 4ea2147274db -r d4acebef7276 src/lemon/bits/default_map.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lemon/bits/default_map.h Tue Apr 05 12:30:46 2005 +0000 @@ -0,0 +1,230 @@ +/* -*- C++ -*- + * src/lemon/default_map.h - Part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport + * (Egervary Combinatorial Optimization Research Group, EGRES). + * + * Permission to use, modify and distribute this software is granted + * provided that this copyright notice appears in all copies. For + * precise terms see the accompanying LICENSE file. + * + * This software is provided "AS IS" with no warranty of any kind, + * express or implied, and with no claim as to its suitability for any + * purpose. + * + */ + +#ifndef LEMON_DEFAULT_MAP_H +#define LEMON_DEFAULT_MAP_H + + +#include +#include + +///\ingroup graphmaps +///\file +///\brief Graph maps that construct and destruct +///their elements dynamically. + +namespace lemon { + +/// \addtogroup graphmaps +/// @{ + + /** The ArrayMap template class is graph map structure what + * automatically updates the map when a key is added to or erased from + * the map. This map uses the VectorMap if the Value is a primitive + * type and the ArrayMap for the other cases. + * + * The template parameter is the MapRegistry that the maps + * will belong to and the Value. + */ + + + + template + struct DefaultMapSelector { + typedef ArrayMap<_Graph, _Item, _Value> Map; + }; + + // bool + template + struct DefaultMapSelector<_Graph, _Item, bool> { + typedef VectorMap<_Graph, _Item, bool> Map; + }; + + // char + template + struct DefaultMapSelector<_Graph, _Item, char> { + typedef VectorMap<_Graph, _Item, char> Map; + }; + + template + struct DefaultMapSelector<_Graph, _Item, signed char> { + typedef VectorMap<_Graph, _Item, signed char> Map; + }; + + template + struct DefaultMapSelector<_Graph, _Item, unsigned char> { + typedef VectorMap<_Graph, _Item, unsigned char> Map; + }; + + + // int + template + struct DefaultMapSelector<_Graph, _Item, signed int> { + typedef VectorMap<_Graph, _Item, signed int> Map; + }; + + template + struct DefaultMapSelector<_Graph, _Item, unsigned int> { + typedef VectorMap<_Graph, _Item, unsigned int> Map; + }; + + + // short + template + struct DefaultMapSelector<_Graph, _Item, signed short> { + typedef VectorMap<_Graph, _Item, signed short> Map; + }; + + template + struct DefaultMapSelector<_Graph, _Item, unsigned short> { + typedef VectorMap<_Graph, _Item, unsigned short> Map; + }; + + + // long + template + struct DefaultMapSelector<_Graph, _Item, signed long> { + typedef VectorMap<_Graph, _Item, signed long> Map; + }; + + template + struct DefaultMapSelector<_Graph, _Item, unsigned long> { + typedef VectorMap<_Graph, _Item, unsigned long> Map; + }; + + // \todo handling long long type + + + // float + template + struct DefaultMapSelector<_Graph, _Item, float> { + typedef VectorMap<_Graph, _Item, float> Map; + }; + + + // double + template + struct DefaultMapSelector<_Graph, _Item, double> { + typedef VectorMap<_Graph, _Item, double> Map; + }; + + + // long double + template + struct DefaultMapSelector<_Graph, _Item, long double> { + typedef VectorMap<_Graph, _Item, long double> Map; + }; + + + // pointer + template + struct DefaultMapSelector<_Graph, _Item, _Ptr*> { + typedef VectorMap<_Graph, _Item, _Ptr*> Map; + }; + + + + template < + typename _Graph, + typename _Item, + typename _Value> + class DefaultMap + : public DefaultMapSelector<_Graph, _Item, _Value>::Map { + public: + typedef typename DefaultMapSelector<_Graph, _Item, _Value>::Map Parent; + typedef DefaultMap<_Graph, _Item, _Value> Map; + + typedef typename Parent::Graph Graph; + typedef typename Parent::Value Value; + + DefaultMap(const Graph& _g) : Parent(_g) {} + DefaultMap(const Graph& _g, const Value& _v) : Parent(_g, _v) {} + }; + + + + template + class DefaultMappableGraphExtender : public _Base { + public: + + typedef DefaultMappableGraphExtender<_Base> Graph; + typedef _Base Parent; + + typedef typename Parent::Node Node; + typedef typename Parent::NodeIt NodeIt; + + typedef typename Parent::Edge Edge; + typedef typename Parent::EdgeIt EdgeIt; + + + template + class NodeMap + : public IterableMapExtender > { + public: + typedef DefaultMappableGraphExtender Graph; + typedef IterableMapExtender > Parent; + + NodeMap(const Graph& _g) + : Parent(_g) {} + NodeMap(const Graph& _g, const _Value& _v) + : Parent(_g, _v) {} + }; + + template + class EdgeMap + : public IterableMapExtender > { + public: + typedef DefaultMappableGraphExtender Graph; + typedef IterableMapExtender > Parent; + + EdgeMap(const Graph& _g) + : Parent(_g) {} + EdgeMap(const Graph& _g, const _Value& _v) + : Parent(_g, _v) {} + }; + + }; + + template + class MappableUndirGraphExtender : + public DefaultMappableGraphExtender<_Base> { + public: + + typedef MappableUndirGraphExtender Graph; + typedef DefaultMappableGraphExtender<_Base> Parent; + + typedef typename Parent::UndirEdge UndirEdge; + + template + class UndirEdgeMap + : public IterableMapExtender > { + public: + typedef MappableUndirGraphExtender Graph; + typedef IterableMapExtender< + DefaultMap > Parent; + + UndirEdgeMap(const Graph& _g) + : Parent(_g) {} + UndirEdgeMap(const Graph& _g, const _Value& _v) + : Parent(_g, _v) {} + }; + + + }; + +} + +#endif