From 01ba6cf610641f1937092b469843b14ebc2a5962 Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Sun, 4 Feb 2024 14:44:17 +0100 Subject: Common: Introduce Range Sets --- src/common/range_sets.h | 73 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/common/range_sets.h (limited to 'src/common/range_sets.h') diff --git a/src/common/range_sets.h b/src/common/range_sets.h new file mode 100644 index 000000000..f4ee00fec --- /dev/null +++ b/src/common/range_sets.h @@ -0,0 +1,73 @@ +// 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 \ No newline at end of file -- cgit v1.2.3 From fa47ac1c9f8b117d556c7c18ac9dcb062af5cefc Mon Sep 17 00:00:00 2001 From: Fernando Sahmkow Date: Mon, 5 Feb 2024 12:46:49 +0100 Subject: Common: Rename SplitRangeSet to OverlapRangeSet --- src/common/range_sets.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/common/range_sets.h') diff --git a/src/common/range_sets.h b/src/common/range_sets.h index f4ee00fec..f8fcee483 100644 --- a/src/common/range_sets.h +++ b/src/common/range_sets.h @@ -38,16 +38,16 @@ private: }; template -class SplitRangeSet { +class OverlapRangeSet { public: - SplitRangeSet(); - ~SplitRangeSet(); + OverlapRangeSet(); + ~OverlapRangeSet(); - SplitRangeSet(SplitRangeSet const&) = delete; - SplitRangeSet& operator=(SplitRangeSet const&) = delete; + OverlapRangeSet(OverlapRangeSet const&) = delete; + OverlapRangeSet& operator=(OverlapRangeSet const&) = delete; - SplitRangeSet(SplitRangeSet&& other); - SplitRangeSet& operator=(SplitRangeSet&& other); + OverlapRangeSet(OverlapRangeSet&& other); + OverlapRangeSet& operator=(OverlapRangeSet&& other); void Add(AddressType base_address, size_t size); void Subtract(AddressType base_address, size_t size); @@ -66,8 +66,8 @@ public: void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const; private: - struct SplitRangeSetImpl; - std::unique_ptr m_impl; + struct OverlapRangeSetImpl; + std::unique_ptr m_impl; }; -} // namespace Common \ No newline at end of file +} // namespace Common -- cgit v1.2.3