stdex
Additional custom or not Standard C++ covered algorithms
Loading...
Searching...
No Matches
interval.hpp
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 2023 Amebis
4*/
5
6#pragma once
7
8#include "compat.hpp"
9#include <vector>
10
11namespace stdex
12{
16 template <class T>
17 struct interval
18 {
20 T end;
21
25 inline interval() noexcept : start(1), end(0) {}
26
32 inline interval(_In_ T x) noexcept : start(x), end(x) {}
33
40 inline interval(_In_ T _start, _In_ T _end) noexcept : start(_start), end(_end) {}
41
47 inline T size() const { return start <= end ? end - start : 0; }
48
54 inline bool empty() const { return start >= end; }
55
61 inline operator bool() const { return start <= end; }
62
70 inline bool contains(_In_ T x) const { return start <= x && x < end; }
71 };
72
73 template <class T, class _Alloc = std::allocator<interval<T>>>
74 using interval_vector = std::vector<interval<T>, _Alloc>;
75}
76
85template <class T>
86inline stdex::interval<T> operator+(_In_ const stdex::interval<T>& a, _In_ const stdex::interval<T>& b)
87{
88 return stdex::interval<T>(a.start + b.start, a.end + b.end);
89}
90
99template <class T>
100inline stdex::interval<T> operator+(_In_ const stdex::interval<T>& i, _In_ const T x)
101{
102 return stdex::interval<T>(i.start + x, i.end + x);
103}
104
112template <class T>
113inline stdex::interval<T> operator++(_Inout_ stdex::interval<T>& i)
114{
115 ++i.start;
116 ++i.end;
117 return i;
118}
119
127template <class T>
128inline stdex::interval<T> operator++(_Inout_ stdex::interval<T>& i, int) // Postfix increment operator.
129{
130 stdex::interval<T> r = i;
131 ++i.start;
132 ++i.end;
133 return r;
134}
135
144template <class T>
145inline stdex::interval<T> operator-(_In_ const stdex::interval<T>& a, _In_ const stdex::interval<T>& b)
146{
147 return stdex::interval<T>(a.start - b.start, a.end - b.end);
148}
149
158template <class T>
159inline stdex::interval<T> operator-(_In_ const stdex::interval<T>& i, _In_ const T x)
160{
161 return stdex::interval<T>(i.start - x, i.end - x);
162}
163
171template <class T>
172inline stdex::interval<T> operator--(_Inout_ stdex::interval<T>& i)
173{
174 --i.start;
175 --i.end;
176 return i;
177}
178
186template <class T>
187inline stdex::interval<T> operator--(_Inout_ stdex::interval<T>& i, int)
188{
189 stdex::interval<T> r = i;
190 --i.start;
191 --i.end;
192 return r;
193}
194
203template <class T>
204inline bool operator==(_In_ const stdex::interval<T>& a, _In_ const stdex::interval<T>& b)
205{
206 return a.start == b.start && a.end == b.end;
207}
208
217template <class T>
218inline bool operator!=(_In_ const stdex::interval<T>& a, _In_ const stdex::interval<T>& b)
219{
220 return a.start != b.start || a.end != b.end;
221}
Numerical interval.
Definition interval.hpp:18
interval(T x) noexcept
Constructs a zero-size interval.
Definition interval.hpp:32
bool contains(T x) const
Is value in interval?
Definition interval.hpp:70
bool empty() const
Is interval empty?
Definition interval.hpp:54
interval(T _start, T _end) noexcept
Constructs an interval.
Definition interval.hpp:40
T size() const
Returns interval size.
Definition interval.hpp:47
T end
interval end
Definition interval.hpp:20
interval() noexcept
Constructs an invalid interval.
Definition interval.hpp:25
T start
interval start
Definition interval.hpp:19