31 using T_prop = shambase::VectorProperties<T>;
36 inline CoordRange() =
default;
38 inline CoordRange(T lower, T upper) : lower(lower), upper(upper) {};
40 inline CoordRange(std::tuple<T, T> range)
41 : lower(std::get<0>(range)), upper(std::get<1>(range)) {}
43 inline CoordRange(std::pair<T, T> range)
44 : lower(std::get<0>(range)), upper(std::get<1>(range)) {}
46 inline T delt()
const {
return upper - lower; }
48 inline CoordRange expand_all(
typename T_prop::component_type value) {
49 return CoordRange{lower - value, upper + value};
52 inline void expand_center(T tol) {
53 T center = (lower + upper) / 2;
54 T cur_delt = upper - lower;
57 lower = center - cur_delt;
58 upper = center + cur_delt;
61 inline typename T_prop::component_type get_volume() {
62 return sham::product_accumulate(upper - lower);
65 static CoordRange max_range();
69 inline CoordRange get_intersect(CoordRange other)
const {
70 return {sham::max(lower, other.lower), sham::min(upper, other.upper)};
73 inline CoordRange get_union(CoordRange other)
const {
74 return {sham::min(lower, other.lower), sham::max(upper, other.upper)};
77 inline bool contain_pos(T pos) {
return is_in_half_open(pos, lower, upper); }
79 inline bool is_not_empty() {
return sham::vec_compare_geq(upper, lower); }
81 inline CoordRange add_offset(T off) {
return CoordRange{lower + off, upper + off}; }
83 inline bool is_err_mode() {
85 auto tmp = max_range();
87 return sham::equals(tmp.lower, lower) && sham::equals(tmp.upper, upper);