range_sets.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-FileCopyrightText: 2024 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <memory>
  5. #include "common/common_types.h"
  6. namespace Common {
  7. template <typename AddressType>
  8. class RangeSet {
  9. public:
  10. RangeSet();
  11. ~RangeSet();
  12. RangeSet(RangeSet const&) = delete;
  13. RangeSet& operator=(RangeSet const&) = delete;
  14. RangeSet(RangeSet&& other);
  15. RangeSet& operator=(RangeSet&& other);
  16. void Add(AddressType base_address, size_t size);
  17. void Subtract(AddressType base_address, size_t size);
  18. void Clear();
  19. bool Empty() const;
  20. template <typename Func>
  21. void ForEach(Func&& func) const;
  22. template <typename Func>
  23. void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const;
  24. private:
  25. struct RangeSetImpl;
  26. std::unique_ptr<RangeSetImpl> m_impl;
  27. };
  28. template <typename AddressType>
  29. class OverlapRangeSet {
  30. public:
  31. OverlapRangeSet();
  32. ~OverlapRangeSet();
  33. OverlapRangeSet(OverlapRangeSet const&) = delete;
  34. OverlapRangeSet& operator=(OverlapRangeSet const&) = delete;
  35. OverlapRangeSet(OverlapRangeSet&& other);
  36. OverlapRangeSet& operator=(OverlapRangeSet&& other);
  37. void Add(AddressType base_address, size_t size);
  38. void Subtract(AddressType base_address, size_t size);
  39. template <typename Func>
  40. void Subtract(AddressType base_address, size_t size, Func&& on_delete);
  41. void DeleteAll(AddressType base_address, size_t size);
  42. void Clear();
  43. bool Empty() const;
  44. template <typename Func>
  45. void ForEach(Func&& func) const;
  46. template <typename Func>
  47. void ForEachInRange(AddressType device_addr, size_t size, Func&& func) const;
  48. private:
  49. struct OverlapRangeSetImpl;
  50. std::unique_ptr<OverlapRangeSetImpl> m_impl;
  51. };
  52. } // namespace Common