104 lines
4.3 KiB
C++
104 lines
4.3 KiB
C++
/*-----------------------------------------------------------------------------+
|
|
Interval Container Library
|
|
Author: Joachim Faulhaber
|
|
Copyright (c) 2007-2010: 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 custom_interval.cpp \file custom_interval.cpp
|
|
\brief Shows how to use interval containers with own interval classes.
|
|
|
|
There may be instances, where we want to use interval container with our
|
|
own user defined interval classes. Boost interval containers can be adapted
|
|
to your interval class by partial template specialisation. Only a few lines
|
|
of code are needed to achieve this.
|
|
|
|
\include custom_interval_/custom_interval.cpp
|
|
*/
|
|
//[example_custom_interval
|
|
#include <iostream>
|
|
#include <boost/icl/interval_set.hpp>
|
|
|
|
using namespace std;
|
|
using namespace boost::icl;
|
|
|
|
// Here is a typical class that may model intervals in your application.
|
|
class MyInterval
|
|
{
|
|
public:
|
|
MyInterval(): _first(), _past(){}
|
|
MyInterval(int lo, int up): _first(lo), _past(up){}
|
|
int first()const{ return _first; }
|
|
int past ()const{ return _past; }
|
|
private:
|
|
int _first, _past;
|
|
};
|
|
|
|
namespace boost{ namespace icl
|
|
{
|
|
// Class template interval_traits serves as adapter to register and customize your interval class
|
|
template<>
|
|
struct interval_traits< MyInterval > //1. Partially specialize interval_traits for
|
|
{ // your class MyInterval
|
|
//2. Define associated types
|
|
typedef MyInterval interval_type; //2.1 MyInterval will be the interval_type
|
|
typedef int domain_type; //2.2 The elements of the domain are ints
|
|
typedef std::less<int> domain_compare; //2.3 This is the way our element shall be ordered.
|
|
//3. Next we define the essential functions
|
|
// of the specialisation
|
|
//3.1 Construction of intervals
|
|
static interval_type construct(const domain_type& lo, const domain_type& up)
|
|
{ return interval_type(lo, up); }
|
|
//3.2 Selection of values
|
|
static domain_type lower(const interval_type& inter_val){ return inter_val.first(); };
|
|
static domain_type upper(const interval_type& inter_val){ return inter_val.past(); };
|
|
};
|
|
|
|
template<>
|
|
struct interval_bound_type<MyInterval> //4. Finally we define the interval borders.
|
|
{ // Choose between static_open (lo..up)
|
|
typedef interval_bound_type type; // static_left_open (lo..up]
|
|
BOOST_STATIC_CONSTANT(bound_type, value = interval_bounds::static_right_open);//[lo..up)
|
|
}; // and static_closed [lo..up]
|
|
|
|
}} // namespace boost icl
|
|
|
|
void custom_interval()
|
|
{
|
|
// Now we can use class MyInterval with interval containers:
|
|
typedef interval_set<int, std::less, MyInterval> MyIntervalSet;
|
|
MyIntervalSet mySet;
|
|
mySet += MyInterval(1,9);
|
|
cout << mySet << endl;
|
|
mySet.subtract(3) -= 6;
|
|
cout << mySet << " subtracted 3 and 6\n";
|
|
mySet ^= MyInterval(2,8);
|
|
cout << mySet << " flipped between 2 and 7\n";
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
cout << ">>Interval Container Library: Sample custom_interval.cpp <<\n";
|
|
cout << "-----------------------------------------------------------\n";
|
|
cout << "This program uses a user defined interval class:\n";
|
|
custom_interval();
|
|
return 0;
|
|
}
|
|
|
|
// Program output:
|
|
/*-----------------------------------------------------------------------------
|
|
>>Interval Container Library: Sample custom_interval.cpp <<
|
|
-----------------------------------------------------------
|
|
This program uses a user defined interval class:
|
|
{[1, 9)}
|
|
{[1, 3) [4, 6) [7, 9)} subtracted 3 and 6
|
|
{[1,2) [3,4) [6,7) [8,9)} flipped between 2 and 7
|
|
-----------------------------------------------------------------------------*/
|
|
//]
|
|
|