diff options
| author | crupest <crupest@outlook.com> | 2021-09-09 17:55:40 +0800 |
|---|---|---|
| committer | crupest <crupest@outlook.com> | 2021-09-09 17:55:40 +0800 |
| commit | 74aee8a6308445604b513ab37812ddc99365aa98 (patch) | |
| tree | 4a0886df82af6baa248e62b97fa585e09be9470d /include/cru/common/Range.hpp | |
| parent | 700751108257a00ab1a6134fe0ca570acb3269a8 (diff) | |
| download | cru-74aee8a6308445604b513ab37812ddc99365aa98.tar.gz cru-74aee8a6308445604b513ab37812ddc99365aa98.tar.bz2 cru-74aee8a6308445604b513ab37812ddc99365aa98.zip | |
...
Diffstat (limited to 'include/cru/common/Range.hpp')
| -rw-r--r-- | include/cru/common/Range.hpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/cru/common/Range.hpp b/include/cru/common/Range.hpp new file mode 100644 index 00000000..ecc61243 --- /dev/null +++ b/include/cru/common/Range.hpp @@ -0,0 +1,43 @@ +#pragma once +#include "Base.hpp" + +namespace cru { +struct Range final { + constexpr static Range FromTwoSides(gsl::index start, gsl::index end) { + return Range(start, end - start); + } + + constexpr static Range FromTwoSides(gsl::index start, gsl::index end, + gsl::index offset) { + return Range(start + offset, end - start); + } + + constexpr Range() = default; + constexpr Range(const gsl::index position, const gsl::index count = 0) + : position(position), count(count) {} + + gsl::index GetStart() const { return position; } + gsl::index GetEnd() const { return position + count; } + + void ChangeEnd(gsl::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(gsl::index min, gsl::index max) const { + auto coerce = [min, max](gsl::index index) { + return index > max ? max : (index < min ? min : index); + }; + return Range::FromTwoSides(coerce(GetStart()), coerce(GetEnd())); + } + + gsl::index position = 0; + gsl::index count = 0; +}; +} // namespace cru |
