Fixing tests, roughing in iterator
This commit is contained in:
@@ -1,9 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <deque>
|
#include <deque>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
namespace daggy {
|
namespace daggy {
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -20,6 +22,15 @@ namespace daggy {
|
|||||||
// Returns the path from {from} to {to}
|
// Returns the path from {from} to {to}
|
||||||
std::deque<T> shortest_path(const T & from, const T & to);
|
std::deque<T> shortest_path(const T & from, const T & to);
|
||||||
|
|
||||||
|
// Breadth First Iterator
|
||||||
|
struct Iterator {
|
||||||
|
using iterator_category = std::random_access_iterator_tag;
|
||||||
|
using difference_type = int;
|
||||||
|
using value_type = T;
|
||||||
|
using point = T*;
|
||||||
|
using reference = T&;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct Vertex {
|
struct Vertex {
|
||||||
// It's a bit redundant to preserve both, but
|
// It's a bit redundant to preserve both, but
|
||||||
@@ -34,5 +45,4 @@ namespace daggy {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#include "DAG.impl"
|
#include "DAG.impl"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,10 @@ void DAG<T>::addEdge(const T & from, const T & to) {
|
|||||||
auto & src = vertices.at(from);
|
auto & src = vertices.at(from);
|
||||||
auto & dst = vertices.at(to);
|
auto & dst = vertices.at(to);
|
||||||
|
|
||||||
|
if (shortest_path(to, from).size() > 1) {
|
||||||
|
throw std::runtime_error("Unable to add edge that would result in a cycle");
|
||||||
|
}
|
||||||
|
|
||||||
// Add the edge
|
// Add the edge
|
||||||
src.children.insert(to);
|
src.children.insert(to);
|
||||||
dst.parents.insert(from);
|
dst.parents.insert(from);
|
||||||
|
|||||||
@@ -13,12 +13,10 @@ TEST_CASE("DAG Basic Tests", "[dag]") {
|
|||||||
dag.addEdge(i-1, i);
|
dag.addEdge(i-1, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
dag.addEdge(5, 9);
|
REQUIRE(dag.shortest_path(0,9).size() == 10);
|
||||||
|
|
||||||
auto sp = dag.shortest_path(1,9);
|
dag.addEdge(5, 9);
|
||||||
std::cout << "Shortest path from 1 to 10: (";
|
REQUIRE(dag.shortest_path(0,9).size() == 7);
|
||||||
for (auto k : sp) {
|
|
||||||
std::cout << k << " -> ";
|
REQUIRE_THROWS(dag.addEdge(9, 5));
|
||||||
}
|
|
||||||
std::cout << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user