//===--------- interval_set.h - A sorted interval set -----------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Implements a coalescing interval set. // //===----------------------------------------------------------------------===// #ifndef ORC_RT_INTERVAL_SET_H #define ORC_RT_INTERVAL_SET_H #include "interval_map.h" namespace __orc_rt { /// Implements a coalescing interval set. /// /// Adjacent intervals are coalesced. /// /// NOTE: The interface is kept mostly compatible with LLVM's IntervalMap /// collection to make it easy to swap over in the future if we choose /// to. template class IntervalSet { private: using ImplMap = IntervalMap; public: using value_type = std::pair; class const_iterator { friend class IntervalSet; public: using difference_type = typename ImplMap::iterator::difference_type; using value_type = IntervalSet::value_type; using pointer = const value_type *; using reference = const value_type &; using iterator_category = std::input_iterator_tag; const_iterator() = default; const value_type &operator*() const { return I->first; } const value_type *operator->() const { return &I->first; } const_iterator &operator++() { ++I; return *this; } const_iterator operator++(int) { auto Tmp = I; ++I; return Tmp; } friend bool operator==(const const_iterator &LHS, const const_iterator &RHS) { return LHS.I == RHS.I; } friend bool operator!=(const const_iterator &LHS, const const_iterator &RHS) { return LHS.I != RHS.I; } private: const_iterator(typename ImplMap::const_iterator I) : I(std::move(I)) {} typename ImplMap::const_iterator I; }; bool empty() const { return Map.empty(); } void clear() { Map.clear(); } const_iterator begin() const { return const_iterator(Map.begin()); } const_iterator end() const { return const_iterator(Map.end()); } const_iterator find(KeyT K) const { return const_iterator(Map.find(K)); } void insert(KeyT KS, KeyT KE) { Map.insert(std::move(KS), std::move(KE), std::monostate()); } void erase(KeyT KS, KeyT KE) { Map.erase(KS, KE); } private: ImplMap Map; }; } // End namespace __orc_rt #endif // ORC_RT_INTERVAL_SET_H