utils.hpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #ifndef UTILS_HPP
  2. #define UTILS_HPP
  3. #include <utility>
  4. #include <array>
  5. #include <chrono>
  6. #include "simple/support/range.hpp"
  7. #include "simple/geom/vector.hpp"
  8. using simple::support::range;
  9. using bool2 = simple::geom::vector<bool,2>;
  10. using int2 = simple::geom::vector<int,2>;
  11. class frametime_logger
  12. {
  13. using clock = std::chrono::steady_clock;
  14. clock::duration accum;
  15. size_t count;
  16. size_t limit;
  17. public:
  18. frametime_logger(size_t limit = 60);
  19. void log(clock::duration);
  20. };
  21. template <typename M, typename T, size_t N = 2>
  22. // mask is a boolean, T is integral, both can be vectors
  23. std::array<range<T>,N> split(const range<T> whole, M mask)
  24. {
  25. std::array<range<T>, N> pieces{};
  26. T size = whole.upper() - whole.lower();
  27. auto piece_size = T{size / N};
  28. auto remainder = T{size % N};
  29. auto lower = whole.lower();
  30. for(size_t i = 0; i < N; ++i)
  31. {
  32. auto& piece = pieces[i];
  33. piece = range<T>{lower, lower + piece_size + (remainder --> T{})};
  34. lower = piece.upper();
  35. // apply mask
  36. for(size_t j = 0; j < piece.bounds.size(); ++j)
  37. {
  38. piece.bounds[j] *= mask;
  39. piece.bounds[j] += whole.bounds[j] * ~mask;
  40. }
  41. }
  42. return pieces;
  43. }
  44. template <size_t... Sizes>
  45. constexpr auto prepare_splits(std::integer_sequence<size_t,Sizes...>)
  46. {
  47. return std::make_tuple(&split<bool2,int2,Sizes>...);
  48. }
  49. template <typename V, typename T, T... Is>
  50. constexpr auto upper_bound(std::integer_sequence<T,Is...>, const V& value)
  51. {
  52. struct
  53. {
  54. T value;
  55. size_t index;
  56. } ret{};
  57. T arr[] = {Is...};
  58. auto lower = std::upper_bound(std::begin(arr), std::end(arr), value);
  59. lower = lower == std::begin(arr) ? lower : lower-1;
  60. ret.index = lower - std::begin(arr);
  61. ret.value = *lower;
  62. return ret;
  63. }
  64. #endif /* end of include guard */