Página principal | Lista de namespace | Jerarquía de la clase | Lista de componentes | Directories | Lista de archivos | Miembros del Namespace  | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

ADH_Graph.h

Ir a la documentación de este archivo.
00001 /* ADH_Graph.h  (C) 2007  [email protected]  */
00002 
00003 /** \file  ADH_Graph.h
00004     \brief Versión muy simplificada de un grafo implementado con \c std::map<>.
00005 
00006     \author Adolfo Di Mare <[email protected]>
00007     \date   2007
00008 */
00009 
00010 #ifndef ADH_Graph_h
00011 #define ADH_Graph_h   "Versión 1"
00012 
00013 #include <map>
00014 #include <set>
00015 #include <list>
00016 #include <string>
00017 #include <iostream>
00018 
00019 /// ADH: Adolfo Di Mare H.
00020 namespace ADH {} // Está acá para que Doxygen lo documente
00021 
00022 namespace ADH {
00023 
00024 /// Contenedor grapo dirigido en que los vértices son hileras y los valores de los arcos son enteros.
00025 /// - En el grado sólo están almacenados los vértices que participan en alguna arista.
00026 class Graph {
00027 public:
00028     typedef std::string                   key_type;     ///< Tipo de los vértices.
00029     typedef std::map<  std::string, int > mapped_type;  ///< Lista de aristas para un vértice.
00030 private:
00031     /// Abreviatura para el Rep, implementado con un diccionario.
00032     typedef std::map<  key_type, mapped_type > Rep;
00033 public:
00034     typedef Rep::value_type value_type;  ///< Nombre estándar del objeto contenido
00035     typedef value_type& reference; ///< Referencia al objeto contenido
00036     typedef const value_type& const_reference; ///< Referencia constante al objeto contenido
00037 public:
00038     /** Iteradores [CONST] simples para la clase \c "Graph".
00039         - No existen iteradores "no-const" para esta clase
00040         \dontinclude test_Graph.cpp
00041         \skipline    test::const_iterator()
00042         \until       }}
00043         \see         test_Graph::test_const_iterator()
00044     */
00045     class const_iterator {
00046         friend class Graph;
00047     public:
00048         const_iterator() : m_it() { } ///< Constructor
00049 
00050         /// Constructor de copia
00051         const_iterator( const const_iterator& o ) : m_it(o.m_it) { }  // copia el Rep directo
00052         const_iterator& operator=( const const_iterator& o ) {
00053             m_it = o.m_it; // la asignación op=() solo está definida para map<>::const_iterator
00054             return *this;
00055         } ///< Copia.
00056 
00057         friend bool operator == ( const const_iterator& p , const const_iterator& q ) {
00058             return p.m_it == q.m_it;
00059         } ///< ¿ <code>p == q</code> ?
00060         friend bool operator != ( const const_iterator& p , const const_iterator& q ) {
00061             return p.m_it != q.m_it;
00062         } ///< ¿ <code>p != q</code> ?
00063 
00064         const_iterator operator++(int)
00065             { const_iterator q = (*this); ++m_it; return q; } ///< \c it++
00066         const_iterator operator++() { ++m_it; return *this; } ///< \c ++it
00067         const_iterator operator--(int)
00068             { const_iterator q = (*this); --m_it; return q; } ///< \c it--
00069         const_iterator operator--() { --m_it; return *this; } ///< \c --it
00070 
00071         const value_type& operator*()  { return   *m_it ; } ///< \c *p
00072         const value_type* operator->() { return &(*m_it); } ///< \c p->
00073     private:
00074         Rep::const_iterator m_it; ///< Iterador [CONST] de \c "Graph"
00075     }; // Graph::const_iterator
00076 
00077     Graph() : m_DICC() { } ///< Constructor de vector
00078     Graph(const Graph& G) : m_DICC() { *this = G; } ///< Constructor de copia
00079     ~Graph() { } ///< Destructor
00080 
00081     bool empty() const { return m_DICC.empty(); } ///< Retorna \c "true" si el contenedor está vacío
00082 
00083     Graph& operator=(const Graph& G) {
00084         m_DICC = G.m_DICC; return *this; } ///< Copia <code>*this = G</code>
00085     void swap(Graph& M) { m_DICC.swap(M.m_DICC); } ///< Intercambia los valores de \c "M" <==> \c "*this"
00086 
00087     /// Denota al primer valor del contenedor
00088     const_iterator begin() const { const_iterator p; p.m_it = m_DICC.begin(); return p; }
00089     /// Denota el valor que ya está fuera del contenedor
00090     const_iterator end  () const { const_iterator p; p.m_it = m_DICC.end();   return p; }
00091 
00092     friend std::ostream& operator<< (std::ostream &COUT, const Graph& G);
00093     friend void dump( std::ostream &COUT, const Graph& G );
00094 
00095     friend bool check_ok( const Graph & DDD );
00096     friend class test_Graph; ///< Datos de prueba de la clase
00097 
00098 public:
00099     bool isVertex( const std::string & vtx ) const;
00100     bool isArc( const std::string & src , const std::string & dst , int & val ) const;
00101     void set( const std::string & vtx );
00102     void set( const std::string & src , const std::string & dst , int val );
00103     bool connected( const std::string & src , const std::string & dst , std::list< std::string > & C );
00104 private:
00105     Rep m_DICC; ///< Diccionario que contiene los valores del grafo
00106 }; // Graph
00107 
00108 } // namespace ADH
00109 
00110 #endif // ADH_Graph_h
00111 
00112 // EOF: ADH_Graph.h

Generado el Thu Nov 15 15:47:43 2007 para Clase ADH_Graph: por  doxygen 1.4.1
Hosted by www.Geocities.ws

1