/* -*- C++ -*- * lemon/traits.h - Part of LEMON, a generic C++ optimization library * * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport * (Egervary Research Group on Combinatorial Optimization, 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_TRAITS_H #define LEMON_TRAITS_H #include ///\file ///\brief Traits for graphs and maps /// namespace lemon { template class ItemSetTraits {}; template class ItemSetTraits<_Graph, typename _Graph::Node> { public: typedef _Graph Graph; typedef typename Graph::Node Item; typedef typename Graph::NodeIt ItemIt; template class Map : public Graph::template NodeMap<_Value> { public: typedef typename Graph::template NodeMap<_Value> Parent; typedef typename Parent::Value Value; Map(const Graph& _graph) : Parent(_graph) {} Map(const Graph& _graph, const Value& _value) : Parent(_graph, _value) {} }; }; template class ItemSetTraits<_Graph, typename _Graph::Edge> { public: typedef _Graph Graph; typedef typename Graph::Edge Item; typedef typename Graph::EdgeIt ItemIt; template class Map : public Graph::template EdgeMap<_Value> { public: typedef typename Graph::template EdgeMap<_Value> Parent; typedef typename Parent::Value Value; Map(const Graph& _graph) : Parent(_graph) {} Map(const Graph& _graph, const Value& _value) : Parent(_graph, _value) {} }; }; template class ItemSetTraits<_Graph, typename _Graph::UndirEdge> { public: typedef _Graph Graph; typedef typename Graph::UndirEdge Item; typedef typename Graph::UndirEdgeIt ItemIt; template class Map : public Graph::template UndirEdgeMap<_Value> { public: typedef typename Graph::template UndirEdgeMap<_Value> Parent; typedef typename Parent::Value Value; Map(const Graph& _graph) : Parent(_graph) {} Map(const Graph& _graph, const Value& _value) : Parent(_graph, _value) {} }; }; template struct MapTraits { typedef False ReferenceMapTag; typedef typename Map::Key Key; typedef typename Map::Value Value; typedef Value ConstReturnValue; typedef Value& ReturnValue; }; template struct MapTraits< Map, typename enable_if::type > { typedef True ReferenceMapTag; typedef typename Map::Key Key; typedef typename Map::Value Value; typedef typename Map::ConstReference ConstReturnValue; typedef typename Map::Reference ReturnValue; typedef typename Map::ConstReference ConstReference; typedef typename Map::Reference Reference; }; // Indicators for the tags template struct NodeNumTagIndicator { static const bool value = false; }; template struct NodeNumTagIndicator< Graph, typename enable_if::type > { static const bool value = true; }; template struct EdgeNumTagIndicator { static const bool value = false; }; template struct EdgeNumTagIndicator< Graph, typename enable_if::type > { static const bool value = true; }; template struct FindEdgeTagIndicator { static const bool value = false; }; template struct FindEdgeTagIndicator< Graph, typename enable_if::type > { static const bool value = true; }; } #endif // LEMON_MAPS_H