div_ceil.h 797 B

12345678910111213141516171819202122232425
  1. // SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <cstddef>
  5. #include <type_traits>
  6. namespace Common {
  7. /// Ceiled integer division.
  8. template <typename N, typename D>
  9. requires std::is_integral_v<N> && std::is_unsigned_v<D>
  10. [[nodiscard]] constexpr N DivCeil(N number, D divisor) {
  11. return static_cast<N>((static_cast<D>(number) + divisor - 1) / divisor);
  12. }
  13. /// Ceiled integer division with logarithmic divisor in base 2
  14. template <typename N, typename D>
  15. requires std::is_integral_v<N> && std::is_unsigned_v<D>
  16. [[nodiscard]] constexpr N DivCeilLog2(N value, D alignment_log2) {
  17. return static_cast<N>((static_cast<D>(value) + (D(1) << alignment_log2) - 1) >> alignment_log2);
  18. }
  19. } // namespace Common