1 /*-----------------------------------------------------------------------------+
2 Copyright (c) 2007-2009: Joachim Faulhaber
3 +------------------------------------------------------------------------------+
4 Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
5 +------------------------------------------------------------------------------+
6 Distributed under the Boost Software License, Version 1.0.
7 (See accompanying file LICENCE.txt or copy at
8 http://www.boost.org/LICENSE_1_0.txt)
9 +-----------------------------------------------------------------------------*/
10
11 /*-----------------------------------------------------------------------------+
12 splititvmap_shell.cpp provides a simple test shell for splitting interval maps.
13 The shell also gives you a good idea how interval container are working.
14 +-----------------------------------------------------------------------------*/
15 #include <iostream>
16
17 #include <boost/icl/split_interval_set.hpp>
18 #include <boost/icl/split_interval_map.hpp>
19 #include <boost/icl/interval_map.hpp>
20
21 using namespace std;
22 using namespace boost;
23 using namespace boost::icl;
24
instructions()25 void instructions()
26 {
27 cout << "+++++ Test shell for split interval map +++++\n";
28 cout << "Type: q e or 0 to quit\n";
29 cout << "Type: + for insertions\n";
30 cout << "Type: - for subtraction of ([a,b],value)\n";
31 cout << "Type: _ for subtraction of [a,b]\n";
32 cout << "Type: j to join contiguous intervals\n";
33 cout << "Type: s to compute total size\n";
34 }
35
wrongInput()36 void wrongInput()
37 {
38 cout << "Wrong Input ------------------\n";
39 instructions();
40 }
41
42
43 template <class MapTV>
mapTestShell()44 void mapTestShell()
45 {
46 MapTV m1;
47
48 try {
49 char cmd = 'b';
50 typename MapTV::domain_type
51 lwb = typename MapTV::domain_type(),
52 upb = typename MapTV::domain_type();
53
54 typename MapTV::codomain_type
55 val = typename MapTV::codomain_type();
56
57 instructions();
58
59 for(;;)
60 {
61 cout << "> ";
62 cin >> cmd ;
63
64 switch(cmd)
65 {
66 case 'q':
67 case 'e':
68 case '0': cout << "good bye\n"; return;
69 case '+':
70 {
71 cout << "input: lwb upb val >> ";
72 cin >> lwb >> upb >> val;
73 typename MapTV::interval_type
74 itv = typename MapTV::interval_type(lwb,upb);
75 m1 += make_pair(itv,val);
76
77 cout << "+" << itv << " " << val << " =" << endl;
78 cout << "{" << m1 << "}" << endl;
79
80 }
81 break;
82 case '-':
83 {
84 cout << "input: lwb upb val >> ";
85 cin >> lwb >> upb >> val;
86 typename MapTV::interval_type
87 itv = typename MapTV::interval_type(lwb,upb);
88 m1 -= make_pair(itv,val);
89
90 cout << "-" << itv << " " << val << " =" << endl;
91 cout << "{" << m1 << "}" << endl;
92
93 }
94 break;
95 case 'j':
96 {
97 icl::join(m1);
98 cout << "{" << m1 << "}" << endl;
99 }
100 break;
101 case 's':
102 {
103 cout << "size = " << m1.size() << endl;
104 }
105 break;
106
107 default: wrongInput();
108 }
109 } // end while
110 }
111 catch (exception& e)
112 {
113 cout << "splititvmap_shell: exception caught: " << endl
114 << e.what() << endl;
115 }
116 catch (...)
117 {
118 cout << "splititvmap_shell: unknown exception caught" << endl;
119 }
120 }
121
122
main()123 int main()
124 {
125 cout << ">>Interval Container Library: Test splititvmap_shell.cpp <<\n";
126 cout << "-----------------------------------------------------------\n";
127 mapTestShell< interval_map<int, int> >();
128
129 return 0;
130 }
131
132