diff -r 6e1b62d42d94 -r 2115143eceea lemon/bits/traits.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lemon/bits/traits.h Wed Mar 01 13:19:28 2006 +0000 @@ -0,0 +1,300 @@ +/* -*- C++ -*- + * + * This file is a part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2003-2006 + * 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_BITS_TRAITS_H +#define LEMON_BITS_TRAITS_H + +#include + +///\file +///\brief Traits for graphs and maps +/// + +namespace lemon { + template + class ItemSetTraits {}; + + + template + struct NodeNotifierIndicator { + typedef InvalidType Type; + }; + template + struct NodeNotifierIndicator< + Graph, + typename enable_if::type + > { + typedef typename Graph::NodeNotifier Type; + }; + + template + class ItemSetTraits<_Graph, typename _Graph::Node> { + public: + + typedef _Graph Graph; + + typedef typename Graph::Node Item; + typedef typename Graph::NodeIt ItemIt; + + typedef typename NodeNotifierIndicator::Type ItemNotifier; + + 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 + struct EdgeNotifierIndicator { + typedef InvalidType Type; + }; + template + struct EdgeNotifierIndicator< + Graph, + typename enable_if::type + > { + typedef typename Graph::EdgeNotifier Type; + }; + + template + class ItemSetTraits<_Graph, typename _Graph::Edge> { + public: + + typedef _Graph Graph; + + typedef typename Graph::Edge Item; + typedef typename Graph::EdgeIt ItemIt; + + typedef typename EdgeNotifierIndicator::Type ItemNotifier; + + 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 + struct UEdgeNotifierIndicator { + typedef InvalidType Type; + }; + template + struct UEdgeNotifierIndicator< + Graph, + typename enable_if::type + > { + typedef typename Graph::UEdgeNotifier Type; + }; + + template + class ItemSetTraits<_Graph, typename _Graph::UEdge> { + public: + + typedef _Graph Graph; + + typedef typename Graph::UEdge Item; + typedef typename Graph::UEdgeIt ItemIt; + + typedef typename UEdgeNotifierIndicator::Type ItemNotifier; + + template + class Map : public Graph::template UEdgeMap<_Value> { + public: + typedef typename Graph::template UEdgeMap<_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 ANodeNotifierIndicator { + typedef InvalidType Type; + }; + template + struct ANodeNotifierIndicator< + Graph, + typename enable_if::type + > { + typedef typename Graph::ANodeNotifier Type; + }; + + template + class ItemSetTraits<_Graph, typename _Graph::ANode> { + public: + + typedef _Graph Graph; + + typedef typename Graph::ANode Item; + typedef typename Graph::ANodeIt ItemIt; + + typedef typename ANodeNotifierIndicator::Type ItemNotifier; + + template + class Map : public Graph::template ANodeMap<_Value> { + public: + typedef typename Graph::template ANodeMap<_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 BNodeNotifierIndicator { + typedef InvalidType Type; + }; + template + struct BNodeNotifierIndicator< + Graph, + typename enable_if::type + > { + typedef typename Graph::BNodeNotifier Type; + }; + + template + class ItemSetTraits<_Graph, typename _Graph::BNode> { + public: + + typedef _Graph Graph; + + typedef typename Graph::BNode Item; + typedef typename Graph::BNodeIt ItemIt; + + typedef typename BNodeNotifierIndicator::Type ItemNotifier; + + template + class Map : public Graph::template BNodeMap<_Value> { + public: + typedef typename Graph::template BNodeMap<_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 const Value ConstReturnValue; + typedef const 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; + }; + + template + struct UndirectedTagIndicator { + static const bool value = false; + }; + + template + struct UndirectedTagIndicator< + Graph, + typename enable_if::type + > { + static const bool value = true; + }; + + + +} + +#endif // LEMON_MAPS_H