109 lines
4.3 KiB
C++
109 lines
4.3 KiB
C++
/*-----------------------------------------------------------------------------+
|
|
Interval Container Library
|
|
Author: Joachim Faulhaber
|
|
Copyright (c) 2007-2009: Joachim Faulhaber
|
|
Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
|
|
+------------------------------------------------------------------------------+
|
|
Distributed under the Boost Software License, Version 1.0.
|
|
(See accompanying file LICENCE.txt or copy at
|
|
http://www.boost.org/LICENSE_1_0.txt)
|
|
+-----------------------------------------------------------------------------*/
|
|
/** Example overlap_counter.cpp \file overlap_counter.cpp
|
|
|
|
\brief The most simple application of an interval map:
|
|
Counting the overlaps of added intervals.
|
|
|
|
The most basic application of an interval_map is a counter counting
|
|
the number of overlaps of intervals inserted into it.
|
|
|
|
On could call an interval_map an aggregate on overlap machine. A very basic
|
|
aggregation is summation of an integer. A interval_map<int,int> maps
|
|
intervals of int to ints.
|
|
|
|
If we insert a value pair (discrete_interval<int>(2,6), 1) into the interval_map, it
|
|
increases the content of all value pairs in the map by 1, if their interval
|
|
part overlaps with discrete_interval<int>(2,6).
|
|
|
|
\include overlap_counter_/overlap_counter.cpp
|
|
*/
|
|
//[example_overlap_counter
|
|
#include <iostream>
|
|
#include <boost/icl/split_interval_map.hpp>
|
|
|
|
using namespace std;
|
|
using namespace boost::icl;
|
|
|
|
|
|
/* The most simple example of an interval_map is an overlap counter.
|
|
If intervals are added that are associated with the value 1,
|
|
all overlaps of added intervals are counted as a result in the
|
|
associated values.
|
|
*/
|
|
typedef interval_map<int, int> OverlapCounterT;
|
|
|
|
void print_overlaps(const OverlapCounterT& counter)
|
|
{
|
|
for(OverlapCounterT::const_iterator it = counter.begin(); it != counter.end(); it++)
|
|
{
|
|
discrete_interval<int> itv = (*it).first;
|
|
int overlaps_count = (*it).second;
|
|
if(overlaps_count == 1)
|
|
cout << "in interval " << itv << " intervals do not overlap" << endl;
|
|
else
|
|
cout << "in interval " << itv << ": "<< overlaps_count << " intervals overlap" << endl;
|
|
}
|
|
}
|
|
|
|
void overlap_counter()
|
|
{
|
|
OverlapCounterT overlap_counter;
|
|
discrete_interval<int> inter_val;
|
|
|
|
inter_val = discrete_interval<int>::right_open(4,8);
|
|
cout << "-- adding " << inter_val << " -----------------------------------------" << endl;
|
|
overlap_counter += make_pair(inter_val, 1);
|
|
print_overlaps(overlap_counter);
|
|
cout << "-----------------------------------------------------------" << endl;
|
|
|
|
inter_val = discrete_interval<int>::right_open(6,9);
|
|
cout << "-- adding " << inter_val << " -----------------------------------------" << endl;
|
|
overlap_counter += make_pair(inter_val, 1);
|
|
print_overlaps(overlap_counter);
|
|
cout << "-----------------------------------------------------------" << endl;
|
|
|
|
inter_val = discrete_interval<int>::right_open(1,9);
|
|
cout << "-- adding " << inter_val << " -----------------------------------------" << endl;
|
|
overlap_counter += make_pair(inter_val, 1);
|
|
print_overlaps(overlap_counter);
|
|
cout << "-----------------------------------------------------------" << endl;
|
|
|
|
}
|
|
|
|
int main()
|
|
{
|
|
cout << ">>Interval Container Library: Sample overlap_counter.cpp <<\n";
|
|
cout << "-----------------------------------------------------------\n";
|
|
overlap_counter();
|
|
return 0;
|
|
}
|
|
|
|
// Program output:
|
|
|
|
// >>Interval Container Library: Sample overlap_counter.cpp <<
|
|
// -----------------------------------------------------------
|
|
// -- adding [4,8) -----------------------------------------
|
|
// in interval [4,8) intervals do not overlap
|
|
// -----------------------------------------------------------
|
|
// -- adding [6,9) -----------------------------------------
|
|
// in interval [4,6) intervals do not overlap
|
|
// in interval [6,8): 2 intervals overlap
|
|
// in interval [8,9) intervals do not overlap
|
|
// -----------------------------------------------------------
|
|
// -- adding [1,9) -----------------------------------------
|
|
// in interval [1,4) intervals do not overlap
|
|
// in interval [4,6): 2 intervals overlap
|
|
// in interval [6,8): 3 intervals overlap
|
|
// in interval [8,9): 2 intervals overlap
|
|
// -----------------------------------------------------------
|
|
//]
|