4#include <unordered_map>
17template<
typename N, util::HashFunction<N> Hash=std::hash<N>, util::BiPredicate<N> Equal=std::equal_to<N>,
typename NodeRange = std::vector<N>>
20 using Map = std::unordered_map<N, NodeRange,Hash,Equal>;
22 const static inline Equal eq=Equal();
23 const static inline Hash hash = Hash();
24 const static inline NodeRange EMPTY = NodeRange();
31 map.try_emplace(from,NodeRange());
32 map.try_emplace(to,NodeRange());
33 map[from].push_back(std::move(to));
37 std::ranges::for_each(pairs,[
this](
auto & pair){
addAdjacency(pair.first,pair.second);});
41 return map.try_emplace(node,NodeRange()).second;
45 return map.try_emplace(std::move(node),NodeRange()).second;
49 return std::ranges::fold_left(
nodes,
false,[
this](
bool prev,
auto n){
return addNode(n) & prev;});
54 for(
auto const& neighbour :
adjacency(node)){
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);
73 std::ranges::for_each(adjacencies,[
this](
auto && pair){
removeAdjacency(pair.first,pair.second);});
76 bool inline contains(
const N & node)
const noexcept{
77 return map.contains(node);
81 return contains(from) && std::ranges::any_of(map.at(from),[
this,&to](
const N & element ){return eq(to,element); });
86 return std::views::all(map.at(node));
88 return std::views::all(EMPTY);
92 return std::views::keys(map);
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);});})
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