diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2024-02-08 16:59:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-08 16:59:59 +0100 |
commit | 263dfa95e44e674bffffa36536b945a3f0ec500b (patch) | |
tree | 8683bd0d33656d41d1c10a308f6d5664838db39e /src/common/range_sets.h | |
parent | Merge pull request #12953 from FernandoS27/zero-fps-mah-ass (diff) | |
parent | Common: Rename SplitRangeSet to OverlapRangeSet (diff) | |
download | yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.tar yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.tar.gz yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.tar.bz2 yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.tar.lz yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.tar.xz yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.tar.zst yuzu-263dfa95e44e674bffffa36536b945a3f0ec500b.zip |
Diffstat (limited to 'src/common/range_sets.h')
-rw-r--r-- | src/common/range_sets.h | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/common/range_sets.h b/src/common/range_sets.h new file mode 100644 index 000000000..f8fcee483 --- /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 <memory> + +#include "common/common_types.h" + +namespace Common { + +template <typename AddressType> +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 <typename Func> + void ForEach(Func&& func) const; + + template <typename Func> + void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const; + +private: + struct RangeSetImpl; + std::unique_ptr<RangeSetImpl> m_impl; +}; + +template <typename AddressType> +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 <typename Func> + 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 <typename Func> + void ForEach(Func&& func) const; + + template <typename Func> + void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const; + +private: + struct OverlapRangeSetImpl; + std::unique_ptr<OverlapRangeSetImpl> m_impl; +}; + +} // namespace Common |