1
#include "intervalset.h"
7
const key_t IntervalSet::npos=std::numeric_limits<key_t>::max();
9
void IntervalSet::clear() // {{{
15
void IntervalSet::add(key_t start,key_t end) // {{{
18
data.push_back(std::make_pair(start,end));
23
void IntervalSet::finish() // {{{
25
std::sort(data.begin(),data.end());
27
data_t::iterator it=data.begin(),end=data.end(),pos=it;
34
if (pos->second>=it->first) {
35
pos->second=it->second;
44
data.erase(pos,data.end());
48
bool IntervalSet::contains(key_t val) const // {{{
50
data_t::const_iterator it=std::upper_bound(data.begin(),data.end(),std::make_pair(val,npos));
51
if (it==data.begin()) {
55
return (val<it->second);
59
key_t IntervalSet::next(key_t val) const // {{{
62
data_t::const_iterator it=std::upper_bound(data.begin(),data.end(),std::make_pair(val,npos));
63
if (it==data.begin()) {
78
bool IntervalSet::intersect(const value_t &a,const value_t &b) const // {{{
80
return ( (a.first>=b.first)&&(a.first<b.second) )||
81
( (b.first>=a.first)&&(b.first<a.second) );
85
void IntervalSet::unite(value_t &aret,const value_t &b) const // {{{
87
assert(intersect(aret,b));
88
if (b.first<aret.first) {
91
if (b.second>aret.second) {
97
void IntervalSet::dump() const // {{{
101
fprintf(stderr,"(empty)\n");
105
for (int iA=0;iA<len;iA++) {
106
fprintf(stderr,"[%d,%d),",data[iA].first,data[iA].second);
108
if (data[len].second==npos) {
109
fprintf(stderr,"[%d,inf)\n",data[len].first);
111
fprintf(stderr,"[%d,%d)\n",data[len].first,data[len].second);