diff -r 467d7927a901 -r 3f63d9db307b lemon/lemon_reader.h --- a/lemon/lemon_reader.h Wed Oct 05 13:17:42 2005 +0000 +++ b/lemon/lemon_reader.h Wed Oct 05 13:18:51 2005 +0000 @@ -36,6 +36,8 @@ #include #include +#include + #include #include @@ -94,38 +96,108 @@ } }; - template - class WriteComposeMap { + template + struct Ref { typedef Map& Type; }; + template + struct Arg { typedef Map& Type; }; + + template + class ForwardComposeMap { public: - typedef True NeedCopy; + typedef typename Graph::UndirEdge Key; + typedef typename Map::Value Value; + + ForwardComposeMap(const Graph& _graph, typename Arg::Type _map) + : graph(_graph), map(_map) {} - typedef typename M2::Key Key; - typedef typename M1::Value Value; - - WriteComposeMap(typename SmartParameter::Type _m1, const M2& _m2) - : m1(_m1), m2(_m2) {} - - void set(const Key& key, const Value& value) { - m1.set(m2[key], value); + void set(const Key& key, const Value& val) { + map.set(graph.direct(key, true), val); } private: - - typename SmartReference::Type m1; - typename SmartConstReference::Type m2; - + typename Ref::Type map; + const Graph& graph; }; - template - WriteComposeMap writeComposeMap(M1& m1, const M2& m2) { - return WriteComposeMap(m1, m2); + template + ForwardComposeMap + forwardComposeMap(const Graph& graph, const Map& map) { + return ForwardComposeMap(graph, map); } - template - WriteComposeMap writeComposeMap(const M1& m1, const M2& m2) { - return WriteComposeMap(m1, m2); + template + ForwardComposeMap + forwardComposeMap(const Graph& graph, Map& map) { + return ForwardComposeMap(graph, map); } - + + template + class BackwardComposeMap { + public: + typedef typename Graph::UndirEdge Key; + typedef typename Map::Value Value; + + BackwardComposeMap(const Graph& _graph, typename Arg::Type _map) + : graph(_graph), map(_map) {} + + void set(const Key& key, const Value& val) { + map.set(graph.direct(key, false), val); + } + + private: + typename Ref::Type map; + const Graph& graph; + }; + + + template + BackwardComposeMap + backwardComposeMap(const Graph& graph, const Map& map) { + return BackwardComposeMap(graph, map); + } + + template + BackwardComposeMap + backwardComposeMap(const Graph& graph, Map& map) { + return BackwardComposeMap(graph, map); + } + + template + struct Ref > { + typedef ForwardComposeMap Type; + }; + template + struct Arg > { + typedef const ForwardComposeMap& Type; + }; + + template + struct Ref > { + typedef BackwardComposeMap Type; + }; + template + struct Arg > { + typedef const BackwardComposeMap& Type; + }; + + template + struct Ref > { + typedef XMap Type; + }; + template + struct Arg > { + typedef const XMap& Type; + }; + + template + struct Ref > { + typedef YMap Type; + }; + template + struct Arg > { + typedef const YMap& Type; + }; + } /// \ingroup io_group @@ -432,11 +504,11 @@ typedef _Map Map; typedef std::map > Inverse; - typename SmartReference::Type map; + typename _reader_bits::Ref::Type map; Reader reader; Inverse inverse; - MapReaderInverter(typename SmartParameter::Type _map, + MapReaderInverter(typename _reader_bits::Arg::Type _map, const Reader& _reader) : map(_map), reader(_reader) {} @@ -526,10 +598,10 @@ typedef typename Reader::Value Value; typedef _Item Item; - typename SmartReference::Type map; + typename _reader_bits::Ref::Type map; Reader reader; - MapReader(typename SmartParameter::Type _map, + MapReader(typename _reader_bits::Arg::Type _map, const Reader& _reader) : map(_map), reader(_reader) {} @@ -659,7 +731,7 @@ /// add the readed nodes to the given Graph. The reader will read /// the section when the \c section_id and the \c _id are the same. NodeSetReader(LemonReader& _reader, - typename SmartParameter::Type _graph, + Graph& _graph, const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {} @@ -688,14 +760,14 @@ NodeSetReader& readNodeMap(std::string name, Map& map) { return _readMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } template NodeSetReader& readNodeMap(std::string name, const Map& map) { return _readMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } /// \brief Add a new node map reader command for the reader. @@ -704,14 +776,14 @@ template NodeSetReader& readNodeMap(std::string name, Map& map, const Reader& reader = Reader()) { - return _readMap::Type> + return _readMap::Type> (name, map, reader); } template NodeSetReader& readNodeMap(std::string name, const Map& map, const Reader& reader = Reader()) { - return _readMap::Type> + return _readMap::Type> (name, map, reader); } @@ -817,7 +889,7 @@ typedef std::map*> MapReaders; MapReaders readers; - typename SmartReference::Type graph; + Graph& graph; std::string id; SkipReader skipper; @@ -867,7 +939,7 @@ /// \c edgset_id are the same. template EdgeSetReader(LemonReader& _reader, - typename SmartParameter::Type _graph, + Graph& _graph, const NodeIdReader& _nodeIdReader, const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) @@ -898,14 +970,14 @@ EdgeSetReader& readEdgeMap(std::string name, Map& map) { return _readMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } template EdgeSetReader& readEdgeMap(std::string name, const Map& map) { return _readMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } /// \brief Add a new edge map reader command for the reader. @@ -915,14 +987,14 @@ EdgeSetReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) { return _readMap::Type>(name, map, reader); + typename _reader_bits::Arg::Type>(name, map, reader); } template EdgeSetReader& readEdgeMap(std::string name, const Map& map, const Reader& reader = Reader()) { return _readMap::Type>(name, map, reader); + typename _reader_bits::Arg::Type>(name, map, reader); } private: @@ -1032,7 +1104,7 @@ typedef std::map*> MapReaders; MapReaders readers; - typename SmartReference::Type graph; + Graph& graph; std::string id; SkipReader skipper; @@ -1089,7 +1161,7 @@ /// \c _id and the \c undiredgset_id are the same. template UndirEdgeSetReader(LemonReader& _reader, - typename SmartParameter::Type _graph, + Graph& _graph, const NodeIdReader& _nodeIdReader, const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) @@ -1120,14 +1192,14 @@ UndirEdgeSetReader& readUndirEdgeMap(std::string name, Map& map) { return _readMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } template UndirEdgeSetReader& readUndirEdgeMap(std::string name, const Map& map) { return _readMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } /// \brief Add a new undirected edge map reader command for the reader. @@ -1136,14 +1208,14 @@ template UndirEdgeSetReader& readUndirEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) { - return _readMap::Type> + return _readMap::Type> (name, map, reader); } template UndirEdgeSetReader& readUndirEdgeMap(std::string name, const Map& map, const Reader& reader = Reader()) { - return _readMap::Type > + return _readMap::Type > (name, map, reader); } @@ -1189,14 +1261,14 @@ UndirEdgeSetReader& readEdgeMap(std::string name, Map& map) { return _readDirMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } template UndirEdgeSetReader& readEdgeMap(std::string name, const Map& map) { return _readDirMap< typename Traits::template Reader, Map, - typename SmartParameter::Type>(name, map); + typename _reader_bits::Arg::Type>(name, map); } /// \brief Add a new directed edge map reader command for the reader. @@ -1205,14 +1277,14 @@ template UndirEdgeSetReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) { - return _readDirMap::Type> + return _readDirMap::Type> (name, map, reader); } template UndirEdgeSetReader& readEdgeMap(std::string name, const Map& map, const Reader& reader = Reader()) { - return _readDirMap::Type> + return _readDirMap::Type> (name, map, reader); } @@ -1224,9 +1296,9 @@ checkConcept<_reader_bits::ItemReader, Reader>(); checkConcept, Map>(); readMap("+" + name, - _reader_bits::writeComposeMap(map, forwardMap(graph)), reader); + _reader_bits::forwardComposeMap(graph, map), reader); readMap("-" + name, - _reader_bits::writeComposeMap(map, backwardMap(graph)), reader); + _reader_bits::backwardComposeMap(graph, map), reader); return *this; } @@ -1336,7 +1408,7 @@ typedef std::map*> MapReaders; MapReaders readers; - typename SmartReference::Type graph; + Graph& graph; std::string id; SkipReader skipper;