/*-----------------------------------------------------------------------------+ 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 maps intervals of int to ints. If we insert a value pair (discrete_interval(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(2,6). \include overlap_counter_/overlap_counter.cpp */ //[example_overlap_counter #include #include 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 OverlapCounterT; void print_overlaps(const OverlapCounterT& counter) { for(OverlapCounterT::const_iterator it = counter.begin(); it != counter.end(); it++) { discrete_interval 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 inter_val; inter_val = discrete_interval::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::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::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 // ----------------------------------------------------------- //]