HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
ranged_int.hpp
1
2
3
4#pragma once
5
6#include "int_interval.hpp"
7#include <limits>
8
9namespace hi {
10inline namspace v1 {
11namespace detail {
12
13
14}
15
16
17template<interval<long long> Range>
18struct ranged_int {
19 using interval_type = interval<long long>;
20
21 constexpr static interval_type range = Range;
22
23
24 template<interval_type RHS>
25 ranged_int(ranged_int<RHS> const &rhs)
26 noexcept(range.finite() and RHS.finite() and range.lo >= RHS.lo and RHS.hi <= range.hi) :
27 _value(static_cast<value_type>(rhs._value))
28 {
29 if constexpr (not (range.finite() and RHS.finite() and range.lo >= RHS.lo and RHS.hi <= range.hi)) {
30 if (rhs.value < range.lo or rhs.value > range.hi) {
31 throw std::range_error("ranged_int");
32 }
33 }
34 }
35
36 template<interval_type RHS>
37 [[nodiscard]] ranged_int<range + RHS> operator+(ranged_int<RHS> rhs) const noexcept(ranged_int<range + RHS>::finite())
38 {
39 using R = ranged_int<range + RHS>;
40
41 if constexpr (R::finite()) {
42 return R{_value + rhs._value, override_t{}};
43
44 } else {
45 auto lhs_ = wide_cast<long long>(_value);
46 auto rhs_ = wide_cast<long long>(rhs._value);
47 long long r = 0;
48 if (overflow_add(lhs_, rhs_, r)) {
49 throw std::overflow_error("ranged_int");
50 }
51 return R{r};
52 }
53 }
54
55 template<interval_type RHS>
56 [[nodiscard]] ranged_int<range - RHS> operator-(ranged_int<RHS> rhs) const noexcept(ranged_int<range - RHS>::finite())
57 {
58 using R = ranged_int<range - RHS>;
59
60 if constexpr (R::finite()) {
61 return R{_value - rhs._value, override_t{}};
62
63 } else {
64 auto lhs_ = wide_cast<long long>(_value);
65 auto rhs_ = wide_cast<long long>(rhs._value);
66 long long r = 0;
67 if (overflow_sub(lhs_, rhs_, r)) {
68 throw std::overflow_error("ranged_int");
69 }
70 return R{r};
71 }
72 }
73};
74
75template<fixed_string Literal>
76auto operator "" _R()
77{
78 constexpr long long value = from_string_literal(Literal);
79
80 return ranged_int<interval<value,value>>{value};
81}
82
83
84
85}}
DOXYGEN BUG.
Definition algorithm.hpp:13
geometry/margins.hpp
Definition cache.hpp:11