// 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 SplitRangeSet { public: SplitRangeSet(); ~SplitRangeSet(); SplitRangeSet(SplitRangeSet const&) = delete; SplitRangeSet& operator=(SplitRangeSet const&) = delete; SplitRangeSet(SplitRangeSet&& other); SplitRangeSet& operator=(SplitRangeSet&& 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 SplitRangeSetImpl; std::unique_ptr m_impl; }; } // namespace Common