// SPDX-FileCopyrightText: 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include "common/common_types.h" namespace Common { template class RangeSet { public: RangeSet(); ~RangeSet(); RangeSet(RangeSet const&) = delete; RangeSet& operator=(RangeSet const&) = delete; RangeSet(RangeSet&& other); RangeSet& operator=(RangeSet&& other); void Add(AddressType base_address, size_t size); void Subtract(AddressType base_address, size_t size); void Clear(); bool Empty() const; template void ForEach(Func&& func) const; template void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const; private: struct RangeSetImpl; std::unique_ptr m_impl; }; template class OverlapRangeSet { public: OverlapRangeSet(); ~OverlapRangeSet(); OverlapRangeSet(OverlapRangeSet const&) = delete; OverlapRangeSet& operator=(OverlapRangeSet const&) = delete; OverlapRangeSet(OverlapRangeSet&& other); OverlapRangeSet& operator=(OverlapRangeSet&& other); void Add(AddressType base_address, size_t size); void Subtract(AddressType base_address, size_t size); template void Subtract(AddressType base_address, size_t size, Func&& on_delete); void DeleteAll(AddressType base_address, size_t size); void Clear(); bool Empty() const; template void ForEach(Func&& func) const; template void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const; private: struct OverlapRangeSetImpl; std::unique_ptr m_impl; }; } // namespace Common