#ifndef SIMPLESTGRAPH_H #define SIMPLESTGRAPH_H /////////////////////////////////////////////////////////// // MT3Q5.h -- from Handouts/CSE687/code/GraphHelp #include template class vertex { public: class edge { public: edge(vertex& vtx, const E& e, size_t num); E& value(); size_t id(); vertex& vert() { return *pVertex; } private: vertex* pVertex; E value_; size_t num_; }; vertex(const V& value, size_t num); void addEdge(typename const vertex::edge& ed) { edges.push_back(ed); } edge& operator[](size_t n); size_t size() { return edges.size(); } V& value(); size_t id(); private: std::vector< edge > edges; size_t num_; V value_; }; template vertex::vertex(const V &value, size_t num) : value_(value), num_(num) { } //----< return vertex value >------------------------------ template V& vertex::value() { return value_; } //----< return vertex id >---------------------------------- template size_t vertex::id() { return num_; } //----< index operator >------------------------------------- template typename vertex::edge& vertex::operator[](size_t n) { if(n<0 || edges.size()<=n) throw std::invalid_argument("index out of range"); return edges[n]; } //----< edge constructor >----------------------------------- template vertex::edge::edge(vertex& vtx, const E& value, size_t num) : pVertex(&vtx), value_(value), num_(num) { } //----< return E reference >----------------------------------- template E& vertex::edge::value() { return value_; } //----< return edge id >----------------------------------- template size_t vertex::edge::id() { return num_; } //////////////////////////////////////////////////////////////////////// // graph class template class graph { public: typedef std::vector*> PtrsToVerts; typedef S policy_type; typedef V vertex_valuetype; typedef E edge_valuetype; typedef vertex vertex_type; typedef graph graph_type; typename typedef std::vector< vertex* >::iterator iterator; graph() {} ~graph(); void addVertex(vertex& vtx); vertex& operator[](size_t n); size_t size() { return ptrsToVerts.size(); } iterator findVertexWithValue(const V& v); PtrsToVerts findVerticesWithValue(const V& v); iterator begin(); iterator end(); private: graph(const graph& g); graph& operator=(const graph& g); PtrsToVerts ptrsToVerts; }; template graph::~graph() { // define all the vertices in graph on the heap, then // uncomment these lines for(size_t i=0; i void graph::addVertex(vertex &vtx) { ptrsToVerts.push_back(&vtx); } template vertex& graph::operator[](size_t n) { if(n<0 || ptrsToVerts.size()<=n) throw std::invalid_argument("graph index out of range"); return *ptrsToVerts[n]; } template typename graph::iterator graph::begin() { return ptrsToVerts.begin(); } template typename graph::iterator graph::end() { return ptrsToVerts.end(); } template typename graph::iterator graph::findVertexWithValue(const V& v) { iterator iter; S s; // display policy for(iter=ptrsToVerts.begin(); iter!=ptrsToVerts.end(); ++iter) { s(iter); if((*iter)->value() == v) return iter; } return iter; } template typename graph::PtrsToVerts graph::findVerticesWithValue(const V& v) { PtrsToVerts collect; iterator iter; S s; // display policy for(iter=ptrsToVerts.begin(); iter!=ptrsToVerts.end(); ++iter) { s(iter); if((*iter)->value() == v) collect.push_back(*iter); } return collect; } template typename G::PtrsToVerts findVerticesWithValue(G& g, typename const G::vertex_valuetype& v) { G::PtrsToVerts collection; typename G::iterator iter; G::policy_type p; // display policy for(iter=g.begin(); iter!=g.end(); ++iter) { p(iter); if((*iter)->value() == v) collection.push_back(*iter); } return collection; } template class Verbose { public: void operator()(typename graph::iterator iter) { std::cout << "\n visited vertex with value " << (*iter)->value(); } }; template class Quiet { public: void operator()(typename graph::iterator iter) {} }; #endif