ROSE 0.11.145.147
GraphIteratorBiMap.h
1// WARNING: Changes to this file must be contributed back to Sawyer or else they will
2// be clobbered by the next update from Sawyer. The Sawyer repository is at
3// https://gitlab.com/charger7534/sawyer.git.
4
5
6
7
8#ifndef Sawyer_GraphIteratorBiMap_H
9#define Sawyer_GraphIteratorBiMap_H
10
11#include <Sawyer/GraphIteratorMap.h>
12
13namespace Sawyer {
14namespace Container {
15
22template<class LhsIterator, class RhsIterator>
24public:
27
28private:
29 ForwardMap forward_;
30 ReverseMap reverse_;
31
32public:
35
41 template<class U>
43 BOOST_FOREACH (const typename ForwardMap::Node &anode, a.forward_.nodes()) {
44 if (b.forward_.exists(anode.value())) {
45 const RhsIterator &target = b.forward_[anode.value()];
46 insert(anode.key(), target);
47 }
48 }
49 }
50
60 forward_.updateIdNumbers();
61 reverse_.updateIdNumbers();
62 }
63
65 void insert(const LhsIterator &a, const RhsIterator &b) {
66 if (Sawyer::Optional<RhsIterator> found = forward_.find(a)) {
67 if (*found == b)
68 return;
69 reverse_.erase(b);
70 }
71 forward_.insert(a, b);
72 reverse_.insert(b, a);
73 }
74
76 void eraseSource(const LhsIterator &a) {
77 if (Sawyer::Optional<RhsIterator> found = forward_.find(a)) {
78 reverse_.erase(*found);
79 forward_.erase(a);
80 }
81 }
82
84 void eraseTarget(const RhsIterator &b) {
85 if (Sawyer::Optional<LhsIterator> found = reverse_.find(b)) {
86 forward_.erase(*found);
87 reverse_.erase(b);
88 }
89 }
90
92 const ForwardMap& forward() const {
93 return forward_;
94 }
95
97 const ReverseMap& reverse() const {
98 return reverse_;
99 }
100
102 void clear() {
103 forward_.clear();
104 reverse_.clear();
105 }
106};
107
108} // namespace
109} // namespace
110
111#endif
Bidirectional map of graph edge or vertex pointers.
void clear()
Remove all entries from this container.
void eraseTarget(const RhsIterator &b)
Erase a pair based on the right hand side.
GraphIteratorBiMap(const GraphIteratorBiMap< LhsIterator, U > &a, const GraphIteratorBiMap< U, RhsIterator > &b)
Construct a new map by composition of two maps.
void insert(const LhsIterator &a, const RhsIterator &b)
Insert a mapping from edge or vertex a to edge or vertex b.
void updateIdNumbers()
Indicate that an update is necessary due to erasures.
const ForwardMap & forward() const
Return the forward mapping.
void eraseSource(const LhsIterator &a)
Erase a pair based on the left hand side.
const ReverseMap & reverse() const
Return the reverse mapping.
Map of graph edge or vertex pointers to some other value.
void erase(const Key &item)
Erase the specified key if it exists.
void updateIdNumbers()
Indicate that an update is necessary due to erasures.
bool exists(const Key &item) const
Does the key exist in the map?
boost::iterator_range< NodeIterator > nodes()
Iterators for container nodes.
void insert(const Key &item, const Value &value)
Insert the specified edge or vertex associated with a value.
Sawyer::Optional< Value > find(const Key &item) const
Find the value associated with a particular key.
void clear()
Remove all entries from this container.
Holds a value or nothing.
Definition Optional.h:56
Sawyer support library.