blob: edc2ec5515c004709350322e6c3d71631be221aa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#pragma once
#include "Base.h"
namespace cru {
struct Range final {
constexpr static Range FromTwoSides(Index start, Index end) {
return Range(start, end - start);
}
constexpr static Range FromTwoSides(Index start, Index end, Index offset) {
return Range(start + offset, end - start);
}
constexpr Range() = default;
constexpr Range(const Index position, const Index count = 0)
: position(position), count(count) {}
Index GetStart() const { return position; }
Index GetEnd() const { return position + count; }
void ChangeEnd(Index new_end) { count = new_end - position; }
Range Normalize() const {
auto result = *this;
if (result.count < 0) {
result.position += result.count;
result.count = -result.count;
}
return result;
}
Range CoerceInto(Index min, Index max) const {
auto coerce = [min, max](Index index) {
return index > max ? max : (index < min ? min : index);
};
return Range::FromTwoSides(coerce(GetStart()), coerce(GetEnd()));
}
Index position = 0;
Index count = 0;
};
} // namespace cru
|