//===- AddressRanges.h ------------------------------------------*- 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 // //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_ADDRESSRANGES_H #define LLVM_ADT_ADDRESSRANGES_H #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include <cassert> #include <optional> #include <stdint.h> namespace llvm { /// A class that represents an address range. The range is specified using /// a start and an end address: [Start, End). class AddressRange { … }; /// The AddressRangesBase class presents the base functionality for the /// normalized address ranges collection. This class keeps a sorted vector /// of AddressRange-like objects and can perform searches efficiently. /// The address ranges are always sorted and never contain any invalid, /// empty or intersected address ranges. template <typename T> class AddressRangesBase { … }; /// The AddressRanges class helps normalize address range collections. /// This class keeps a sorted vector of AddressRange objects and can perform /// insertions and searches efficiently. Intersecting([100,200), [150,300)) /// and adjacent([100,200), [200,300)) address ranges are combined during /// insertion. class AddressRanges : public AddressRangesBase<AddressRange> { … }; class AddressRangeValuePair { … }; inline bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS) { … } /// AddressRangesMap class maps values to the address ranges. /// It keeps normalized address ranges and corresponding values. /// This class keeps a sorted vector of AddressRangeValuePair objects /// and can perform insertions and searches efficiently. /// Intersecting([100,200), [150,300)) ranges splitted into non-conflicting /// parts([100,200), [200,300)). Adjacent([100,200), [200,300)) address /// ranges are not combined during insertion. class AddressRangesMap : public AddressRangesBase<AddressRangeValuePair> { … }; } // namespace llvm #endif // LLVM_ADT_ADDRESSRANGES_H