| //===- AddressRanges.cpp ----------------------------------------*- 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 | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/ADT/AddressRanges.h" | |
| #include "llvm/ADT/STLExtras.h" | |
| #include <inttypes.h> | |
| using namespace llvm; | |
| AddressRanges::Collection::const_iterator | |
| AddressRanges::insert(AddressRange Range) { | |
| if (Range.size() == 0) | |
| return Ranges.end(); | |
| auto It = llvm::upper_bound(Ranges, Range); | |
| auto It2 = It; | |
| while (It2 != Ranges.end() && It2->start() <= Range.end()) | |
| ++It2; | |
| if (It != It2) { | |
| Range = {Range.start(), std::max(Range.end(), std::prev(It2)->end())}; | |
| It = Ranges.erase(It, It2); | |
| } | |
| if (It != Ranges.begin() && Range.start() <= std::prev(It)->end()) { | |
| --It; | |
| *It = {It->start(), std::max(It->end(), Range.end())}; | |
| return It; | |
| } | |
| return Ranges.insert(It, Range); | |
| } | |
| AddressRanges::Collection::const_iterator | |
| AddressRanges::find(uint64_t Addr) const { | |
| auto It = std::partition_point( | |
| Ranges.begin(), Ranges.end(), | |
| [=](const AddressRange &R) { return R.start() <= Addr; }); | |
| if (It == Ranges.begin()) | |
| return Ranges.end(); | |
| --It; | |
| if (Addr >= It->end()) | |
| return Ranges.end(); | |
| return It; | |
| } | |
| AddressRanges::Collection::const_iterator | |
| AddressRanges::find(AddressRange Range) const { | |
| if (Range.size() == 0) | |
| return Ranges.end(); | |
| auto It = std::partition_point( | |
| Ranges.begin(), Ranges.end(), | |
| [=](const AddressRange &R) { return R.start() <= Range.start(); }); | |
| if (It == Ranges.begin()) | |
| return Ranges.end(); | |
| --It; | |
| if (Range.end() > It->end()) | |
| return Ranges.end(); | |
| return It; | |
| } |