14template <
class Scalar,
typename Value>
20 Interval(
const Scalar& s,
const Scalar& e,
const Value& v)
26template <
class Scalar,
typename Value>
31template <
class Scalar,
typename Value>
36template <
class Scalar,
typename Value>
38 out <<
"Interval(" << i.
start <<
", " << i.
stop <<
"): " << i.
value;
42template <
class Scalar,
class Value>
89 std::size_t maxbucket = 512, Scalar leftextent = 0, Scalar rightextent = 0)
96 center = (minmaxStart.first->start + minmaxStop.second->stop) / 2;
98 if (leftextent == 0 && rightextent == 0) {
104 if (depth == 0 || (ivals.size() < minbucket && ivals.size() < maxbucket)) {
113 if (leftextent || rightextent) {
115 rightp = rightextent;
117 leftp = ivals.front().start;
124 for (
typename interval_vector::const_iterator i = ivals.begin(); i != ivals.end(); ++i) {
137 if (!lefts.
empty()) {
140 if (!rights.
empty()) {
149 template <
class UnaryFunction>
150 void visit_near(
const Scalar& start,
const Scalar& stop, UnaryFunction f)
const {
157 left->visit_near(start, stop, f);
160 right->visit_near(start, stop, f);
165 template <
class UnaryFunction>
171 template <
class UnaryFunction>
183 template <
class UnaryFunction>
184 void visit_contained(
const Scalar& start,
const Scalar& stop, UnaryFunction f)
const {
222 template <
class UnaryFunction>
253 const auto minmaxStop =
255 const auto minmaxStart =
265 auto valid =
left->is_valid();
266 result.
first &= valid.first;
272 if (valid.second.second >=
center) {
273 result.
first =
false;
278 auto valid =
right->is_valid();
279 result.
first &= valid.first;
285 if (valid.second.first <=
center) {
286 result.
first =
false;
291 result.
first =
false;
std::unique_ptr< IntervalTree > left
interval_vector intervals
interval_vector find_contained(const Scalar &start, const Scalar &stop) const
void visit_near(const Scalar &start, const Scalar &stop, UnaryFunction f) const
std::unique_ptr< IntervalTree > clone() const
void visit_overlapping(const Scalar &pos, UnaryFunction f) const
std::unique_ptr< IntervalTree > right
void visit_all(UnaryFunction f) const
IntervalTree(interval_vector &&ivals, std::size_t depth=16, std::size_t minbucket=64, std::size_t maxbucket=512, Scalar leftextent=0, Scalar rightextent=0)
IntervalTree(IntervalTree &&)=default
IntervalTree(const IntervalTree &other)
std::pair< bool, std::pair< Scalar, Scalar > > is_valid() const
IntervalTree & operator=(IntervalTree &&)=default
interval_vector find_overlapping(const Scalar &start, const Scalar &stop) const
std::pair< Scalar, Scalar > extent() const
void visit_contained(const Scalar &start, const Scalar &stop, UnaryFunction f) const
IntervalTree & operator=(const IntervalTree &other)
void visit_overlapping(const Scalar &start, const Scalar &stop, UnaryFunction f) const
Interval< Scalar, Value > interval
Interval(const Scalar &s, const Scalar &e, const Value &v)
T emplace_back(T... args)
T minmax_element(T... args)
Value intervalStop(const Interval< Scalar, Value > &i)
std::ostream & operator<<(std::ostream &out, const Interval< Scalar, Value > &i)
Value intervalStart(const Interval< Scalar, Value > &i)
bool operator()(const interval &a, const interval &b)
bool operator()(const interval &a, const interval &b)