deba@1993: /* -*- C++ -*-
deba@1993:  *
deba@1993:  * This file is a part of LEMON, a generic C++ optimization library
deba@1993:  *
deba@1993:  * Copyright (C) 2003-2006
deba@1993:  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
deba@1993:  * (Egervary Research Group on Combinatorial Optimization, EGRES).
deba@1993:  *
deba@1993:  * Permission to use, modify and distribute this software is granted
deba@1993:  * provided that this copyright notice appears in all copies. For
deba@1993:  * precise terms see the accompanying LICENSE file.
deba@1993:  *
deba@1993:  * This software is provided "AS IS" with no warranty of any kind,
deba@1993:  * express or implied, and with no claim as to its suitability for any
deba@1993:  * purpose.
deba@1993:  *
deba@1993:  */
deba@1993: 
deba@1993: #ifndef LEMON_BITS_TRAITS_H
deba@1993: #define LEMON_BITS_TRAITS_H
deba@1993: 
deba@1993: #include <lemon/bits/utility.h>
deba@1993: 
deba@1993: ///\file
deba@1993: ///\brief Traits for graphs and maps
deba@1993: ///
deba@1993: 
deba@1993: namespace lemon {
deba@1993:   template <typename _Graph, typename _Item>
deba@1993:   class ItemSetTraits {};
deba@1993:   
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct NodeNotifierIndicator {
deba@1993:     typedef InvalidType Type;
deba@1993:   };
deba@1993:   template <typename Graph>
deba@1993:   struct NodeNotifierIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::NodeNotifier::Notifier, void>::type
deba@1993:   > { 
deba@1993:     typedef typename Graph::NodeNotifier Type;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename _Graph>
deba@1993:   class ItemSetTraits<_Graph, typename _Graph::Node> {
deba@1993:   public:
deba@1993:     
deba@1993:     typedef _Graph Graph;
deba@1993: 
deba@1993:     typedef typename Graph::Node Item;
deba@1993:     typedef typename Graph::NodeIt ItemIt;
deba@1993: 
deba@1993:     typedef typename NodeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1993: 
deba@1993:     template <typename _Value>
deba@1993:     class Map : public Graph::template NodeMap<_Value> {
deba@1993:     public:
deba@1993:       typedef typename Graph::template NodeMap<_Value> Parent; 
deba@1993:       typedef typename Parent::Value Value;
deba@1993: 
deba@1993:       Map(const Graph& _graph) : Parent(_graph) {}
deba@1993:       Map(const Graph& _graph, const Value& _value) 
deba@1993: 	: Parent(_graph, _value) {}
deba@1993: 
deba@1993:      };
deba@1993: 
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct EdgeNotifierIndicator {
deba@1993:     typedef InvalidType Type;
deba@1993:   };
deba@1993:   template <typename Graph>
deba@1993:   struct EdgeNotifierIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::EdgeNotifier::Notifier, void>::type
deba@1993:   > { 
deba@1993:     typedef typename Graph::EdgeNotifier Type;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename _Graph>
deba@1993:   class ItemSetTraits<_Graph, typename _Graph::Edge> {
deba@1993:   public:
deba@1993:     
deba@1993:     typedef _Graph Graph;
deba@1993: 
deba@1993:     typedef typename Graph::Edge Item;
deba@1993:     typedef typename Graph::EdgeIt ItemIt;
deba@1993: 
deba@1993:     typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1993: 
deba@1993:     template <typename _Value>
deba@1993:     class Map : public Graph::template EdgeMap<_Value> {
deba@1993:     public:
deba@1993:       typedef typename Graph::template EdgeMap<_Value> Parent; 
deba@1993:       typedef typename Parent::Value Value;
deba@1993: 
deba@1993:       Map(const Graph& _graph) : Parent(_graph) {}
deba@1993:       Map(const Graph& _graph, const Value& _value) 
deba@1993: 	: Parent(_graph, _value) {}
deba@1993:     };
deba@1993: 
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct UEdgeNotifierIndicator {
deba@1993:     typedef InvalidType Type;
deba@1993:   };
deba@1993:   template <typename Graph>
deba@1993:   struct UEdgeNotifierIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::UEdgeNotifier::Notifier, void>::type
deba@1993:   > { 
deba@1993:     typedef typename Graph::UEdgeNotifier Type;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename _Graph>
deba@1993:   class ItemSetTraits<_Graph, typename _Graph::UEdge> {
deba@1993:   public:
deba@1993:     
deba@1993:     typedef _Graph Graph;
deba@1993: 
deba@1993:     typedef typename Graph::UEdge Item;
deba@1993:     typedef typename Graph::UEdgeIt ItemIt;
deba@1993: 
deba@1993:     typedef typename UEdgeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1993: 
deba@1993:     template <typename _Value>
deba@1993:     class Map : public Graph::template UEdgeMap<_Value> {
deba@1993:     public:
deba@1993:       typedef typename Graph::template UEdgeMap<_Value> Parent; 
deba@1993:       typedef typename Parent::Value Value;
deba@1993: 
deba@1993:       Map(const Graph& _graph) : Parent(_graph) {}
deba@1993:       Map(const Graph& _graph, const Value& _value) 
deba@1993: 	: Parent(_graph, _value) {}
deba@1993:     };
deba@1993: 
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct ANodeNotifierIndicator {
deba@1993:     typedef InvalidType Type;
deba@1993:   };
deba@1993:   template <typename Graph>
deba@1993:   struct ANodeNotifierIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::ANodeNotifier::Notifier, void>::type
deba@1993:   > { 
deba@1993:     typedef typename Graph::ANodeNotifier Type;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename _Graph>
deba@1993:   class ItemSetTraits<_Graph, typename _Graph::ANode> {
deba@1993:   public:
deba@1993:     
deba@1993:     typedef _Graph Graph;
deba@1993: 
deba@1993:     typedef typename Graph::ANode Item;
deba@1993:     typedef typename Graph::ANodeIt ItemIt;
deba@1993: 
deba@1993:     typedef typename ANodeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1993: 
deba@1993:     template <typename _Value>
deba@1993:     class Map : public Graph::template ANodeMap<_Value> {
deba@1993:     public:
deba@1993:       typedef typename Graph::template ANodeMap<_Value> Parent; 
deba@1993:       typedef typename Parent::Value Value;
deba@1993: 
deba@1993:       Map(const Graph& _graph) : Parent(_graph) {}
deba@1993:       Map(const Graph& _graph, const Value& _value) 
deba@1993: 	: Parent(_graph, _value) {}
deba@1993:     };
deba@1993: 
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct BNodeNotifierIndicator {
deba@1993:     typedef InvalidType Type;
deba@1993:   };
deba@1993:   template <typename Graph>
deba@1993:   struct BNodeNotifierIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::BNodeNotifier::Notifier, void>::type
deba@1993:   > { 
deba@1993:     typedef typename Graph::BNodeNotifier Type;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename _Graph>
deba@1993:   class ItemSetTraits<_Graph, typename _Graph::BNode> {
deba@1993:   public:
deba@1993:     
deba@1993:     typedef _Graph Graph;
deba@1993: 
deba@1993:     typedef typename Graph::BNode Item;
deba@1993:     typedef typename Graph::BNodeIt ItemIt;
deba@1993: 
deba@1993:     typedef typename BNodeNotifierIndicator<Graph>::Type ItemNotifier;
deba@1993: 
deba@1993:     template <typename _Value>
deba@1993:     class Map : public Graph::template BNodeMap<_Value> {
deba@1993:     public:
deba@1993:       typedef typename Graph::template BNodeMap<_Value> Parent; 
deba@1993:       typedef typename Parent::Value Value;
deba@1993: 
deba@1993:       Map(const Graph& _graph) : Parent(_graph) {}
deba@1993:       Map(const Graph& _graph, const Value& _value) 
deba@1993: 	: Parent(_graph, _value) {}
deba@1993:     };
deba@1993: 
deba@1993:   };
deba@1993: 
deba@1993: 
deba@1993:   template <typename Map, typename Enable = void>
deba@1993:   struct MapTraits {
deba@1993:     typedef False ReferenceMapTag;
deba@1993: 
deba@1993:     typedef typename Map::Key Key;
deba@1993:     typedef typename Map::Value Value;
deba@1993: 
deba@1993:     typedef const Value ConstReturnValue;
deba@1993:     typedef const Value ReturnValue;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Map>
deba@1993:   struct MapTraits<
deba@1993:     Map, typename enable_if<typename Map::ReferenceMapTag, void>::type > 
deba@1993:   {
deba@1993:     typedef True ReferenceMapTag;
deba@1993:     
deba@1993:     typedef typename Map::Key Key;
deba@1993:     typedef typename Map::Value Value;
deba@1993: 
deba@1993:     typedef typename Map::ConstReference ConstReturnValue;
deba@1993:     typedef typename Map::Reference ReturnValue;
deba@1993: 
deba@1993:     typedef typename Map::ConstReference ConstReference; 
deba@1993:     typedef typename Map::Reference Reference;
deba@1993:  };
deba@1993: 
deba@2039:   template <typename MatrixMap, typename Enable = void>
deba@2039:   struct MatrixMapTraits {
deba@2039:     typedef False ReferenceMapTag;
deba@2039: 
deba@2039:     typedef typename MatrixMap::FirstKey FirstKey;
deba@2039:     typedef typename MatrixMap::SecondKey SecondKey;
deba@2039:     typedef typename MatrixMap::Value Value;
deba@2039: 
deba@2039:     typedef const Value ConstReturnValue;
deba@2039:     typedef const Value ReturnValue;
deba@2039:   };
deba@2039: 
deba@2039:   template <typename MatrixMap>
deba@2039:   struct MatrixMapTraits<
deba@2039:     MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag, 
deba@2039:                                   void>::type > 
deba@2039:   {
deba@2039:     typedef True ReferenceMapTag;
deba@2039:     
deba@2039:     typedef typename MatrixMap::FirstKey FirstKey;
deba@2039:     typedef typename MatrixMap::SecondKey SecondKey;
deba@2039:     typedef typename MatrixMap::Value Value;
deba@2039: 
deba@2039:     typedef typename MatrixMap::ConstReference ConstReturnValue;
deba@2039:     typedef typename MatrixMap::Reference ReturnValue;
deba@2039: 
deba@2039:     typedef typename MatrixMap::ConstReference ConstReference; 
deba@2039:     typedef typename MatrixMap::Reference Reference;
deba@2039:  };
deba@2039: 
deba@1993:   // Indicators for the tags
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct NodeNumTagIndicator {
deba@1993:     static const bool value = false;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph>
deba@1993:   struct NodeNumTagIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::NodeNumTag, void>::type
deba@1993:   > {
deba@1993:     static const bool value = true;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct EdgeNumTagIndicator {
deba@1993:     static const bool value = false;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph>
deba@1993:   struct EdgeNumTagIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::EdgeNumTag, void>::type
deba@1993:   > {
deba@1993:     static const bool value = true;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct FindEdgeTagIndicator {
deba@1993:     static const bool value = false;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph>
deba@1993:   struct FindEdgeTagIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::FindEdgeTag, void>::type
deba@1993:   > {
deba@1993:     static const bool value = true;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph, typename Enable = void>
deba@1993:   struct UndirectedTagIndicator {
deba@1993:     static const bool value = false;
deba@1993:   };
deba@1993: 
deba@1993:   template <typename Graph>
deba@1993:   struct UndirectedTagIndicator<
deba@1993:     Graph, 
deba@1993:     typename enable_if<typename Graph::UndirectedTag, void>::type
deba@1993:   > {
deba@1993:     static const bool value = true;
deba@1993:   };
deba@1993: 
deba@1993: 
deba@1993: 
deba@1993: }
deba@1993: 
deba@1996: #endif