Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
AdjacencyMap.hpp
Go to the documentation of this file.
1#pragma once
2#include <ranges>
3#include <vector>
4#include <unordered_map>
6#include <algorithm>
7
8namespace fishnet::graph{
17template<typename N, util::HashFunction<N> Hash=std::hash<N>, util::BiPredicate<N> Equal=std::equal_to<N>,typename NodeRange = std::vector<N>>
19private:
20 using Map = std::unordered_map<N, NodeRange,Hash,Equal>;
21 Map map= Map();
22 const static inline Equal eq=Equal();
23 const static inline Hash hash = Hash();
24 const static inline NodeRange EMPTY = NodeRange(); // returning views::empty<N> would not compile with gcc 11.3 -> return view on empty node range
25public:
26 using node_type = N;
27 using equality_predicate = Equal;
28 using hash_function = Hash;
29
30 void addAdjacency(N from, N to) {
31 map.try_emplace(from,NodeRange());
32 map.try_emplace(to,NodeRange());
33 map[from].push_back(std::move(to));
34 }
35
36 void addAdjacencies(util::forward_range_of<std::pair<N,N>> auto && pairs){
37 std::ranges::for_each(pairs,[this](auto & pair){addAdjacency(pair.first,pair.second);});
38 }
39
40 bool inline addNode(const N & node){
41 return map.try_emplace(node,NodeRange()).second;
42 }
43
44 bool inline addNode(N && node){
45 return map.try_emplace(std::move(node),NodeRange()).second;
46 }
47
49 return std::ranges::fold_left(nodes,false,[this](bool prev, auto n){return addNode(n) & prev;});
50 }
51
52 void inline removeNode(const N& node){
53 if(contains(node)){
54 for(auto const& neighbour : adjacency(node)){
55 removeAdjacency(neighbour,node);
56 }
57 map.erase(node);
58 }
59 }
60
62 std::ranges::for_each(nodes,[this](auto && n){removeNode(n);});
63 }
64
65 void removeAdjacency(const N & from, const N & to){
66 if(map.contains(from)) {
67 auto [begin,end] = std::ranges::remove_if(map.at(from),[this,&to](N & element ){return eq(element,to);});
68 map.at(from).erase(begin,end);
69 }
70 }
71
72 void removeAdjacencies(util::forward_range_of<std::pair<N,N>> auto && adjacencies) {
73 std::ranges::for_each(adjacencies,[this](auto && pair){removeAdjacency(pair.first,pair.second);});
74 }
75
76 bool inline contains(const N & node) const noexcept{
77 return map.contains(node);
78 }
79
80 bool hasAdjacency(const N & from, const N & to) const noexcept{
81 return contains(from) && std::ranges::any_of(map.at(from),[this,&to](const N & element ){return eq(to,element); });
82 }
83
84 auto adjacency(const N & node) const noexcept{
85 if(contains(node)) {
86 return std::views::all(map.at(node));
87 }
88 return std::views::all(EMPTY);
89 }
90
91 auto nodes() const noexcept {
92 return std::views::keys(map);
93 }
94
95 auto getAdjacencyPairs() const noexcept {
96 return std::views::all(map)
97 | std::views::transform([](const auto & pair){
98 const auto & [from,neighbours] = pair;
99 return std::views::transform(neighbours,[from](const auto & to){return std::make_pair(from,to);});})
100 | std::views::join;
101 }
102
103 void clear() noexcept {
104 map.clear();
105 }
106};
107
108}
Implementation of an Adjacency Map. Implements AdjacencyContainer.
Definition AdjacencyMap.hpp:18
Hash hash_function
Definition AdjacencyMap.hpp:28
void addAdjacency(N from, N to)
Definition AdjacencyMap.hpp:30
Equal equality_predicate
Definition AdjacencyMap.hpp:27
void removeAdjacencies(util::forward_range_of< std::pair< N, N > > auto &&adjacencies)
Definition AdjacencyMap.hpp:72
auto adjacency(const N &node) const noexcept
Definition AdjacencyMap.hpp:84
bool addNodes(util::forward_range_of< N > auto &&nodes)
Definition AdjacencyMap.hpp:48
auto getAdjacencyPairs() const noexcept
Definition AdjacencyMap.hpp:95
bool addNode(const N &node)
Definition AdjacencyMap.hpp:40
void clear() noexcept
Definition AdjacencyMap.hpp:103
void removeNodes(util::forward_range_of< N > auto &&nodes)
Definition AdjacencyMap.hpp:61
bool addNode(N &&node)
Definition AdjacencyMap.hpp:44
auto nodes() const noexcept
Definition AdjacencyMap.hpp:91
bool hasAdjacency(const N &from, const N &to) const noexcept
Definition AdjacencyMap.hpp:80
void removeAdjacency(const N &from, const N &to)
Definition AdjacencyMap.hpp:65
void addAdjacencies(util::forward_range_of< std::pair< N, N > > auto &&pairs)
Definition AdjacencyMap.hpp:36
N node_type
Definition AdjacencyMap.hpp:26
void removeNode(const N &node)
Definition AdjacencyMap.hpp:52
bool contains(const N &node) const noexcept
Definition AdjacencyMap.hpp:76
Definition CollectionConcepts.hpp:27
Definition AdjacencyContainer.hpp:4