many-to-many multi-modal routing aggregator
at main 104 lines 2.3 kB view raw
1/* Directed Graphs 2 * ---------------------------------------------------------------------------- 3 * Author: Mark Padgham 4 * Copied straight from 'dodgr' code, with these functions removed here: 5 * - edgeExists 6 * - reachable 7 * - print 8 */ 9#include "dgraph.h" 10 11#include <Rcpp.h> 12//#include <cstdio> 13 14/*--- DGraph ----------------------------------------------------------------*/ 15 16/* --- Constructor --- 17 * Creates a DGraph object containing n vertices. 18 */ 19DGraph::DGraph(size_t n) : m_vertices(n) 20{ 21 initVertices(); 22} 23 24/* --- Destructor --- 25*/ 26DGraph::~DGraph() 27{ 28 clear(); 29} 30 31// length of vertices 32size_t DGraph::nVertices() const 33{ 34 return static_cast <size_t> (m_vertices.size()); 35} 36 37const std::vector<DGraphVertex>& DGraph::vertices() const 38{ 39 return m_vertices; 40} 41 42/* --- clear() --- 43 * Clears all edges from the graph. 44 */ 45void DGraph::clear() 46{ 47 DGraphEdge *edge, *nextEdge; 48 for(size_t i = 0; i < m_vertices.size(); i++) { 49 edge = m_vertices[i].outHead; 50 51 while(edge) { 52 nextEdge = edge->nextOut; 53 delete edge; 54 edge = nextEdge; 55 } 56 } 57 initVertices(); 58} 59 60void DGraph::initVertices() 61{ 62 for(size_t i = 0; i < m_vertices.size(); i++) { 63 m_vertices[i].outHead = m_vertices[i].outTail = nullptr; 64 m_vertices[i].inHead = m_vertices[i].inTail = nullptr; 65 m_vertices[i].outSize = m_vertices[i].inSize = 0; 66 } 67} 68 69/* --- addNewEdge() --- 70 * Adds a new edge from vertex 'source' to vertex 'target' with 71 * with a corresponding distance of dist. 72 */ 73void DGraph::addNewEdge(size_t source, size_t target, 74 double dist, double wt, size_t edge_id) 75{ 76 DGraphEdge *newEdge = new DGraphEdge; 77 newEdge->source = source; 78 newEdge->target = target; 79 newEdge->edge_id = edge_id; 80 newEdge->dist = dist; 81 newEdge->wt = wt; 82 newEdge->nextOut = nullptr; 83 newEdge->nextIn = nullptr; 84 85 DGraphVertex *vertex = &m_vertices[source]; 86 if(vertex->outTail) { 87 vertex->outTail->nextOut = newEdge; 88 } 89 else { 90 vertex->outHead = newEdge; 91 } 92 vertex->outTail = newEdge; 93 vertex->outSize++; 94 95 vertex = &m_vertices[target]; 96 if(vertex->inTail) { 97 vertex->inTail->nextIn = newEdge; 98 } 99 else { 100 vertex->inHead = newEdge; 101 } 102 vertex->inTail = newEdge; 103 vertex->inSize++; 104}