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