@@ -47,6 +47,19 @@ void AccessMap::Erase(iterator first, iterator last) {
4747 }
4848}
4949
50+ AccessMap::iterator AccessMap::Merge (iterator first, iterator last) {
51+ assert (first != last);
52+ auto merge_last = last;
53+ --merge_last;
54+ assert (first != merge_last);
55+
56+ const AccessRange merged_range (first->first .begin , merge_last->first .end );
57+ auto node = impl_map_.extract (merge_last);
58+ Erase (first, last);
59+ node.key () = merged_range;
60+ return impl_map_.insert (last, std::move (node));
61+ }
62+
5063AccessMap::iterator AccessMap::Insert (const_iterator hint, const AccessRange& range, const AccessState& access_state) {
5164 assert (range.non_empty ());
5265 bool hint_open;
@@ -193,16 +206,7 @@ void Consolidate(AccessMap& map) {
193206
194207 // Current isn't in the active merge range. If there is a non-trivial merge range, we resolve it here.
195208 if (merge_first != merge_last) {
196- // IFF there is more than one range in (merge_first, merge_last) <- again noting the *inclusive* last
197- // Create a new Val spanning (first, last), substitute it for the multiple entries.
198-
199- const AccessRange merged_range (merge_first->first .begin , merge_last->first .end );
200- AccessState access = merge_last->second ;
201-
202- // Note that current points to merge_last + 1, and is valid even if at map_end for these operations
203- map.Erase (merge_first, current);
204-
205- map.Insert (current, merged_range, std::move (access));
209+ map.Merge (merge_first, current);
206210 }
207211 }
208212}
0 commit comments