alpar@1978: /* -*- C++ -*- alpar@1978: * alpar@1978: * This file is a part of LEMON, a generic C++ optimization library alpar@1978: * alpar@2553: * Copyright (C) 2003-2008 alpar@1978: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport alpar@1978: * (Egervary Research Group on Combinatorial Optimization, EGRES). alpar@1978: * alpar@1978: * Permission to use, modify and distribute this software is granted alpar@1978: * provided that this copyright notice appears in all copies. For alpar@1978: * precise terms see the accompanying LICENSE file. alpar@1978: * alpar@1978: * This software is provided "AS IS" with no warranty of any kind, alpar@1978: * express or implied, and with no claim as to its suitability for any alpar@1978: * purpose. alpar@1978: * alpar@1978: */ alpar@1978: alpar@1978: #ifndef LEMON_LIST_GRAPH_H alpar@1978: #define LEMON_LIST_GRAPH_H alpar@1978: alpar@1978: ///\ingroup graphs alpar@1978: ///\file alpar@1978: ///\brief Virtual map support. alpar@1978: alpar@1978: namespace lemon { alpar@1978: alpar@1978: ///Base class of the virtual maps. alpar@1978: template alpar@1978: class VMapBase alpar@1978: { alpar@1978: public: alpar@1978: ///\e alpar@1978: typedef K Key; alpar@1978: ///\e alpar@1978: typedef V Value; alpar@1978: alpar@1978: ///\e alpar@1978: virtual Value operator[](const Key &) const { return Value();} alpar@1978: ///\e alpar@1978: virtual void set(const Key &,const Value &) {} alpar@1978: }; alpar@1978: alpar@1978: ///Base class of the virtual reference maps. alpar@1978: template alpar@1978: class VRefMapBase alpar@1978: { alpar@1978: public: alpar@1978: ///\e alpar@1978: typedef K Key; alpar@1978: ///\e alpar@1978: typedef V Value; alpar@1978: alpar@1978: ///\e alpar@1978: virtual Value& operator[](Key &) = 0; alpar@1978: ///\e alpar@1978: virtual Value& operator[](const Key &) const = 0; alpar@1978: ///\e alpar@1978: virtual void set(const Key &,const Value &) = 0; alpar@1978: }; alpar@1978: alpar@2260: ///Makes a virtual map from a \ref concepts::ReadMap "ReadMap" alpar@1978: template alpar@1978: class VReadMap : public VMapBase alpar@1978: { alpar@1978: const M ↦ alpar@1978: public: alpar@1978: ///\e alpar@1978: VReadMap(const M &m) : map(m) {} alpar@1978: virtual Value operator[](const Key &k) const { return map[k];} alpar@1978: }; alpar@1978: alpar@1978: ///Function interface for \ref VReadMap. alpar@1978: template alpar@1978: vReadMap(const M& m) {return VReadMap(m);} alpar@1978: alpar@2260: ///Makes a virtual map from a \ref concepts::WriteMap "WriteMap" alpar@1978: template alpar@1978: class VWriteMap :public VMapBase alpar@1978: { alpar@1978: M ↦ alpar@1978: public: alpar@1978: ///\e alpar@1978: VWriteMap(M &m) : map(m) {} alpar@1978: virtual void set(const Key &k,const Value &v) { map.set(k,v);} alpar@1978: }; alpar@1978: alpar@1978: ///Function interface for \ref VWriteMap. alpar@1978: template alpar@1978: vWriteMap(const M& m) {return VReadMap(m);} alpar@1978: alpar@2260: ///Makes a virtual map from a \ref concepts::ReadWriteMap "ReadWriteMap" alpar@1978: template alpar@1978: class VReadWriteMap :public VMapBase alpar@1978: { alpar@1978: M ↦ alpar@1978: public: alpar@1978: ///\e alpar@1978: VReadWriteMap(M &m) : map(m) {} alpar@1978: virtual Value operator[](const Key &k) const { return map[k];} alpar@1978: virtual void set(const Key &k,const Value &v) { map.set(k,v);} alpar@1978: }; alpar@1978: alpar@1978: ///Function interface for \ref VReadWriteMap. alpar@1978: template alpar@1978: vReadWriteMap(const M& m) {return VReadMap(m);} alpar@1978: alpar@1978: /// @} alpar@1978: } //namespace lemon alpar@1978: alpar@1978: alpar@1978: #endif