added new helper methods/classes (e.g. for heading) new test cases optimize the dijkstra cleanups/refactoring added timed-benchmarks to the log many more...
67 lines
1.6 KiB
C++
67 lines
1.6 KiB
C++
#ifndef DIJKSTRANODE_H
|
|
#define DIJKSTRANODE_H
|
|
|
|
/**
|
|
* wrapper around a user data structure
|
|
* adds additional fields needed for dijkstra calculation
|
|
*/
|
|
template <typename T> struct DijkstraNode {
|
|
|
|
/** pos infinity */
|
|
static constexpr float INF = +99999999;
|
|
|
|
/** the user-element this node describes */
|
|
const T* element;
|
|
|
|
/** the previous dijkstra node (navigation path) */
|
|
DijkstraNode<T>* previous;
|
|
|
|
/** the weight from the start up to this element */
|
|
float cumWeight;
|
|
|
|
|
|
/** ctor */
|
|
DijkstraNode(const T* element) : element(element), previous(), cumWeight(INF) {;}
|
|
|
|
|
|
// /** equal? (bi-dir) */
|
|
// bool operator == (const DijkstraNode<T>& other) const {
|
|
// return element == other.element;
|
|
// }
|
|
|
|
};
|
|
|
|
/**
|
|
* data structure describing the connection between two nodes.
|
|
* NOTE: only used to track already processed connections!
|
|
*/
|
|
template <typename T> struct DijkstraEdge {
|
|
|
|
/** the edge's source */
|
|
const DijkstraNode<T>* src;
|
|
|
|
/** the edge's destination */
|
|
const DijkstraNode<T>* dst;
|
|
|
|
/** ctor */
|
|
DijkstraEdge(const DijkstraNode<T>* src, const DijkstraNode<T>* dst) : src(src), dst(dst) {;}
|
|
|
|
/** equal? (bi-directional! edge direction does NOT matter) */
|
|
bool operator == (const DijkstraEdge& other) const {
|
|
return ((dst == other.dst) && (src == other.src)) ||
|
|
((src == other.dst) && (dst == other.src));
|
|
}
|
|
|
|
};
|
|
|
|
/** allows adding DijkstraEdge<T> to hash-maps */
|
|
namespace std {
|
|
template <typename T> struct hash<DijkstraEdge<T>>{
|
|
size_t operator()(const DijkstraEdge<T>& e) const {
|
|
return hash<size_t>()( (size_t)e.src^(size_t)e.dst);
|
|
}
|
|
};
|
|
}
|
|
|
|
#endif // DIJKSTRANODE_H
|