1 /*-----------------------------------------------------------------------------+
2 Copyright (c) 2008-2009: Joachim Faulhaber
3 +------------------------------------------------------------------------------+
4    Distributed under the Boost Software License, Version 1.0.
5       (See accompanying file LICENCE.txt or copy at
6            http://www.boost.org/LICENSE_1_0.txt)
7 +-----------------------------------------------------------------------------*/
8 #define BOOST_TEST_MODULE icl::test_doc_code unit test
9 #include <libs/icl/test/disable_test_warnings.hpp>
10 
11 #include <limits>
12 #include <complex>
13 
14 
15 #include <string>
16 #include <vector>
17 #include <boost/mpl/list.hpp>
18 #include "../unit_test_unwarned.hpp"
19 
20 
21 // interval instance types
22 #include "../test_type_lists.hpp"
23 #include "../test_value_maker.hpp"
24 
25 #include <boost/type_traits/is_same.hpp>
26 
27 
28 #define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
29 #define BOOST_ICL_DISCRETE_STATIC_INTERVAL_DEFAULT right_open_interval
30 #define BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS 2 //0=() 1=(] 2=[) 3=[]
31 
32 #include <boost/icl/rational.hpp>
33 
34 #include <boost/icl/detail/interval_morphism.hpp>
35 #include <boost/icl/interval_map.hpp>
36 #include "../test_laws.hpp"
37 
38 using namespace std;
39 using namespace boost;
40 using namespace unit_test;
41 using namespace boost::icl;
42 
43 
BOOST_AUTO_TEST_CASE(test_intervals_4_changed_lib_defaults)44 BOOST_AUTO_TEST_CASE(test_intervals_4_changed_lib_defaults)
45 {
46     typedef int T;
47     typedef int U;
48     typedef interval_map<T,U, total_absorber> IntervalMapT;
49     typedef interval_set<T>                   IntervalSetT;
50     typedef IntervalMapT::interval_type       IntervalT;
51 
52     typedef icl::map<int,int> MapII;
53 
54     //const bool xx = is_same< typename icl::map<int,int>::codomain_type,
55     //    typename codomain_type_of<icl::map<int,int> >::type >::value;
56 
57 
58 #if defined(BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS) && !defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_DEFAULT)
59     BOOST_CHECK( (boost::is_same<icl::interval<int   >::type, right_open_interval<int   > >::value) );
60     BOOST_CHECK( (boost::is_same<icl::interval<double>::type, right_open_interval<double> >::value) );
61 
62     BOOST_CHECK_EQUAL( icl::interval<int>::open(0,2),       icl::construct<right_open_interval<int> >(1,2) );
63     BOOST_CHECK_EQUAL( icl::interval<int>::left_open(0,1),  icl::construct<right_open_interval<int> >(1,2) );
64     BOOST_CHECK_EQUAL( icl::interval<int>::right_open(1,2), icl::construct<right_open_interval<int> >(1,2) );
65     BOOST_CHECK_EQUAL( icl::interval<int>::closed(1,1),     icl::construct<right_open_interval<int> >(1,2) );
66 
67     BOOST_CHECK_EQUAL( icl::interval<float>::right_open(1.0,2.0), icl::construct<right_open_interval<float> >(1.0,2.0) );
68     //The next yields compiletime error: STATIC_ASSERTION_FAILURE
69     //BOOST_CHECK_EQUAL( icl::interval<float>::left_open(1.0,2.0), icl::construct<right_open_interval<float> >(1.0,2.0) );
70 #endif
71 
72 #if defined(BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS) && defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_DEFAULT)
73 #   if defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS) && (BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS == 0)
74     cout << "discrete_interval == open_interval\n";
75     BOOST_CHECK( (boost::is_same<icl::interval<int>::type, open_interval<int> >::value) );
76     BOOST_CHECK_EQUAL( icl::interval<int>::open(0,2),       icl::construct<open_interval<int> >(0,2) );
77     BOOST_CHECK_EQUAL( icl::interval<int>::left_open(0,1),  icl::construct<open_interval<int> >(0,2) );
78     BOOST_CHECK_EQUAL( icl::interval<int>::right_open(1,2), icl::construct<open_interval<int> >(0,2) );
79     BOOST_CHECK_EQUAL( icl::interval<int>::closed(1,1),     icl::construct<open_interval<int> >(0,2) );
80 
81 #   elif defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS) && (BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS == 1)
82     cout << "discrete_interval == left_open_interval\n";
83     BOOST_CHECK( (boost::is_same<icl::interval<int>::type, left_open_interval<int> >::value) );
84     BOOST_CHECK_EQUAL( icl::interval<int>::open(0,2),       icl::construct<left_open_interval<int> >(0,1) );
85     BOOST_CHECK_EQUAL( icl::interval<int>::left_open(0,1),  icl::construct<left_open_interval<int> >(0,1) );
86     BOOST_CHECK_EQUAL( icl::interval<int>::right_open(1,2), icl::construct<left_open_interval<int> >(0,1) );
87     BOOST_CHECK_EQUAL( icl::interval<int>::closed(1,1),     icl::construct<left_open_interval<int> >(0,1) );
88 
89 #   elif defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS) && (BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS == 2)
90     cout << "discrete_interval == right_open_interval\n";
91     BOOST_CHECK( (boost::is_same<icl::interval<int>::type, right_open_interval<int> >::value) );
92     BOOST_CHECK_EQUAL( icl::interval<int>::open(0,2),       icl::construct<right_open_interval<int> >(1,2) );
93     BOOST_CHECK_EQUAL( icl::interval<int>::left_open(0,1),  icl::construct<right_open_interval<int> >(1,2) );
94     BOOST_CHECK_EQUAL( icl::interval<int>::right_open(1,2), icl::construct<right_open_interval<int> >(1,2) );
95     BOOST_CHECK_EQUAL( icl::interval<int>::closed(1,1),     icl::construct<right_open_interval<int> >(1,2) );
96 
97 #   elif defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS) && (BOOST_ICL_DISCRETE_STATIC_INTERVAL_BORDERS == 3)
98     cout << "discrete_interval == closed_interval\n";
99     BOOST_CHECK( (boost::is_same<icl::interval<int>::type, closed_interval<int> >::value) );
100     BOOST_CHECK_EQUAL( icl::interval<int>::open(0,2),       icl::construct<closed_interval<int> >(1,1) );
101     BOOST_CHECK_EQUAL( icl::interval<int>::left_open(0,1),  icl::construct<closed_interval<int> >(1,1) );
102     BOOST_CHECK_EQUAL( icl::interval<int>::right_open(1,2), icl::construct<closed_interval<int> >(1,1) );
103     BOOST_CHECK_EQUAL( icl::interval<int>::closed(1,1),     icl::construct<closed_interval<int> >(1,1) );
104 
105 #   else
106     cout << "#else part, INTERVAL_BORDERS not in {0,1,2,3}\n";
107 #endif //defined(BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS) && defined(BOOST_ICL_DISCRETE_STATIC_INTERVAL_DEFAULT)
108 
109 #else
110     BOOST_CHECK( (boost::is_same<icl::interval<int   >::type,   discrete_interval<int   > >::value) );
111     BOOST_CHECK( (boost::is_same<icl::interval<double>::type, continuous_interval<double> >::value) );
112 #endif
113 
114 }
115 
116