123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /*-----------------------------------------------------------------------------+
- 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
- -----------------------------------------------------------------------------*/
- //]
|