range.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright 2009-2021 Intel Corporation
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include "../sys/platform.h"
  5. #include "../math/math.h"
  6. namespace embree
  7. {
  8. template<typename Ty>
  9. struct range
  10. {
  11. __forceinline range() {}
  12. __forceinline range(const Ty& begin)
  13. : _begin(begin), _end(begin+1) {}
  14. __forceinline range(const Ty& begin, const Ty& end)
  15. : _begin(begin), _end(end) {}
  16. __forceinline range(const range& other)
  17. : _begin(other._begin), _end(other._end) {}
  18. template<typename T1>
  19. __forceinline range(const range<T1>& other)
  20. : _begin(Ty(other._begin)), _end(Ty(other._end)) {}
  21. template<typename T1>
  22. __forceinline range& operator =(const range<T1>& other) {
  23. _begin = other._begin;
  24. _end = other._end;
  25. return *this;
  26. }
  27. __forceinline Ty begin() const {
  28. return _begin;
  29. }
  30. __forceinline Ty end() const {
  31. return _end;
  32. }
  33. __forceinline range intersect(const range& r) const {
  34. return range (max(_begin,r._begin),min(_end,r._end));
  35. }
  36. __forceinline Ty size() const {
  37. return _end - _begin;
  38. }
  39. __forceinline bool empty() const {
  40. return _end <= _begin;
  41. }
  42. __forceinline Ty center() const {
  43. return (_begin + _end)/2;
  44. }
  45. __forceinline std::pair<range,range> split() const
  46. {
  47. const Ty _center = center();
  48. return std::make_pair(range(_begin,_center),range(_center,_end));
  49. }
  50. __forceinline void split(range& left_o, range& right_o) const
  51. {
  52. const Ty _center = center();
  53. left_o = range(_begin,_center);
  54. right_o = range(_center,_end);
  55. }
  56. __forceinline friend bool operator< (const range& r0, const range& r1) {
  57. return r0.size() < r1.size();
  58. }
  59. friend embree_ostream operator<<(embree_ostream cout, const range& r) {
  60. return cout << "range [" << r.begin() << ", " << r.end() << "]";
  61. }
  62. Ty _begin, _end;
  63. };
  64. template<typename Ty>
  65. range<Ty> make_range(const Ty& begin, const Ty& end) {
  66. return range<Ty>(begin,end);
  67. }
  68. template<typename Ty>
  69. struct extended_range : public range<Ty>
  70. {
  71. __forceinline extended_range () {}
  72. __forceinline extended_range (const Ty& begin)
  73. : range<Ty>(begin), _ext_end(begin+1) {}
  74. __forceinline extended_range (const Ty& begin, const Ty& end)
  75. : range<Ty>(begin,end), _ext_end(end) {}
  76. __forceinline extended_range (const Ty& begin, const Ty& end, const Ty& ext_end)
  77. : range<Ty>(begin,end), _ext_end(ext_end) {}
  78. __forceinline Ty ext_end() const {
  79. return _ext_end;
  80. }
  81. __forceinline Ty ext_size() const {
  82. return _ext_end - range<Ty>::_begin;
  83. }
  84. __forceinline Ty ext_range_size() const {
  85. return _ext_end - range<Ty>::_end;
  86. }
  87. __forceinline bool has_ext_range() const {
  88. assert(_ext_end >= range<Ty>::_end);
  89. return (_ext_end - range<Ty>::_end) > 0;
  90. }
  91. __forceinline void set_ext_range(const size_t ext_end){
  92. assert(ext_end >= range<Ty>::_end);
  93. _ext_end = ext_end;
  94. }
  95. __forceinline void move_right(const size_t plus){
  96. range<Ty>::_begin += plus;
  97. range<Ty>::_end += plus;
  98. _ext_end += plus;
  99. }
  100. friend embree_ostream operator<<(embree_ostream cout, const extended_range& r) {
  101. return cout << "extended_range [" << r.begin() << ", " << r.end() << " (" << r.ext_end() << ")]";
  102. }
  103. Ty _ext_end;
  104. };
  105. }