#include<iostream>#include<string>#include<math.h>#include<boost/type_traits/is_same.hpp>// We can change the library default for the interval types by defining
#defineBOOST_ICL_USE_STATIC_BOUNDED_INTERVALS// prior to other inluces from the icl.
// The interval type that is automatically used with interval
// containers then is the statically bounded right_open_interval.
#include<boost/icl/interval_set.hpp>#include<boost/icl/split_interval_set.hpp>// The statically bounded interval type 'right_open_interval'
// is indirectly included via interval containers.
#include"../toytime.hpp"#include<boost/icl/rational.hpp>usingnamespacestd;usingnamespaceboost;usingnamespaceboost::icl;intmain(){cout<<">> Interval Container Library: Sample static_interval.cpp <<\n";cout<<"------------------------------------------------------------\n";// Statically bounded intervals are the user defined library default for
// interval parameters in interval containers now.
BOOST_STATIC_ASSERT((boost::is_same<interval_set<int>::interval_type,right_open_interval<int>>::value));BOOST_STATIC_ASSERT((boost::is_same<interval_set<float>::interval_type,right_open_interval<float>>::value));// As we can see the library default both for discrete and continuous
// domain_types T is 'right_open_interval<T>'.
// The user defined library default for intervals is also available via
// the template 'interval':
BOOST_STATIC_ASSERT((boost::is_same<interval<int>::type,right_open_interval<int>>::value));// Again we are declaring and initializing the four test intervals that have been used
// in the example 'interval' and 'dynamic_interval'
interval<int>::typeint_interval=interval<int>::right_open(3,8);// shifted the upper bound
interval<double>::typesqrt_interval=interval<double>::right_open(1/sqrt(2.0),sqrt(2.0));// Interval ("Barcelona", "Boston"] can not be represented because there is no 'steppable next' on
// lower bound "Barcelona". Ok. this is a different interval:
interval<string>::typecity_interval=interval<string>::right_open("Barcelona","Boston");// Toy Time is discrete again so we can transfrom open(Time(monday,8,30), Time(monday,17,20))
// to right_open(Time(monday,8,31), Time(monday,17,20))
interval<Time>::typetime_interval=interval<Time>::right_open(Time(monday,8,31),Time(monday,17,20));cout<<"----- Statically bounded intervals ----------------------------------------\n";cout<<"right_open_interval<int> : "<<int_interval<<endl;cout<<"right_open_interval<double>: "<<sqrt_interval<<" does "<<string(contains(sqrt_interval,sqrt(2.0))?"":"NOT")<<" contain sqrt(2)"<<endl;cout<<"right_open_interval<string>: "<<city_interval<<" does "<<string(contains(city_interval,"Barcelona")?"":"NOT")<<" contain 'Barcelona'"<<endl;cout<<"right_open_interval<string>: "<<city_interval<<" does "<<string(contains(city_interval,"Boston")?"":"NOT")<<" contain 'Boston'"<<endl;cout<<"right_open_interval<Time> : "<<time_interval<<"\n\n";// Using statically bounded intervals does not allows to apply operations
// with elements on all interval containers, if their domain_type is continuous.
// The code that follows is identical to example 'dynamic_interval'. Only 'internally'
// the library default for the interval template now is 'right_open_interval'
interval<rational<int>>::typeunit_interval=interval<rational<int>>::right_open(rational<int>(0),rational<int>(1));interval_set<rational<int>>unit_set(unit_interval);interval_set<rational<int>>ratio_set(unit_set);// ratio_set -= rational<int>(1,3); // This line will not compile, because we can not
// represent a singleton interval as right_open_interval.
return0;}// Program output:
//>> Interval Container Library: Sample static_interval.cpp <<
//------------------------------------------------------------
//----- Statically bounded intervals ----------------------------------------
//right_open_interval<int> : [3,8)
//right_open_interval<double>: [0.707107,1.41421) does NOT contain sqrt(2)
//right_open_interval<string>: [Barcelona,Boston) does contain 'Barcelona'
//right_open_interval<string>: [Barcelona,Boston) does NOT contain 'Boston'
//right_open_interval<Time> : [mon:08:31,mon:17:20)