diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2024-02-04 14:44:17 +0100 |
---|---|---|
committer | Fernando Sahmkow <fsahmkow27@gmail.com> | 2024-02-04 20:01:50 +0100 |
commit | 01ba6cf610641f1937092b469843b14ebc2a5962 (patch) | |
tree | c7efb1bc196a7b8e8da9eb0924977e9176e8174b /src/common/range_sets.h | |
parent | 4841dc0b745389fb03edbf900f25511bee4b3d88 (diff) |
Common: Introduce Range Sets
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..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 <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 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 <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 SplitRangeSetImpl; + std::unique_ptr<SplitRangeSetImpl> m_impl; +}; + +} // namespace Common
\ No newline at end of file |