132 lines
3.9 KiB
C++
132 lines
3.9 KiB
C++
/*-----------------------------------------------------------------------------+
|
|
Copyright (c) 2007-2009: 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)
|
|
+-----------------------------------------------------------------------------*/
|
|
|
|
/*-----------------------------------------------------------------------------+
|
|
splititvmap_shell.cpp provides a simple test shell for splitting interval maps.
|
|
The shell also gives you a good idea how interval container are working.
|
|
+-----------------------------------------------------------------------------*/
|
|
#include <iostream>
|
|
|
|
#include <boost/icl/split_interval_set.hpp>
|
|
#include <boost/icl/split_interval_map.hpp>
|
|
#include <boost/icl/interval_map.hpp>
|
|
|
|
using namespace std;
|
|
using namespace boost;
|
|
using namespace boost::icl;
|
|
|
|
void instructions()
|
|
{
|
|
cout << "+++++ Test shell for split interval map +++++\n";
|
|
cout << "Type: q e or 0 to quit\n";
|
|
cout << "Type: + for insertions\n";
|
|
cout << "Type: - for subtraction of ([a,b],value)\n";
|
|
cout << "Type: _ for subtraction of [a,b]\n";
|
|
cout << "Type: j to join contiguous intervals\n";
|
|
cout << "Type: s to compute total size\n";
|
|
}
|
|
|
|
void wrongInput()
|
|
{
|
|
cout << "Wrong Input ------------------\n";
|
|
instructions();
|
|
}
|
|
|
|
|
|
template <class MapTV>
|
|
void mapTestShell()
|
|
{
|
|
MapTV m1;
|
|
|
|
try {
|
|
char cmd = 'b';
|
|
typename MapTV::domain_type
|
|
lwb = typename MapTV::domain_type(),
|
|
upb = typename MapTV::domain_type();
|
|
|
|
typename MapTV::codomain_type
|
|
val = typename MapTV::codomain_type();
|
|
|
|
instructions();
|
|
|
|
for(;;)
|
|
{
|
|
cout << "> ";
|
|
cin >> cmd ;
|
|
|
|
switch(cmd)
|
|
{
|
|
case 'q':
|
|
case 'e':
|
|
case '0': cout << "good bye\n"; return;
|
|
case '+':
|
|
{
|
|
cout << "input: lwb upb val >> ";
|
|
cin >> lwb >> upb >> val;
|
|
typename MapTV::interval_type
|
|
itv = typename MapTV::interval_type(lwb,upb);
|
|
m1 += make_pair(itv,val);
|
|
|
|
cout << "+" << itv << " " << val << " =" << endl;
|
|
cout << "{" << m1 << "}" << endl;
|
|
|
|
}
|
|
break;
|
|
case '-':
|
|
{
|
|
cout << "input: lwb upb val >> ";
|
|
cin >> lwb >> upb >> val;
|
|
typename MapTV::interval_type
|
|
itv = typename MapTV::interval_type(lwb,upb);
|
|
m1 -= make_pair(itv,val);
|
|
|
|
cout << "-" << itv << " " << val << " =" << endl;
|
|
cout << "{" << m1 << "}" << endl;
|
|
|
|
}
|
|
break;
|
|
case 'j':
|
|
{
|
|
icl::join(m1);
|
|
cout << "{" << m1 << "}" << endl;
|
|
}
|
|
break;
|
|
case 's':
|
|
{
|
|
cout << "size = " << m1.size() << endl;
|
|
}
|
|
break;
|
|
|
|
default: wrongInput();
|
|
}
|
|
} // end while
|
|
}
|
|
catch (exception& e)
|
|
{
|
|
cout << "splititvmap_shell: exception caught: " << endl
|
|
<< e.what() << endl;
|
|
}
|
|
catch (...)
|
|
{
|
|
cout << "splititvmap_shell: unknown exception caught" << endl;
|
|
}
|
|
}
|
|
|
|
|
|
int main()
|
|
{
|
|
cout << ">>Interval Container Library: Test splititvmap_shell.cpp <<\n";
|
|
cout << "-----------------------------------------------------------\n";
|
|
mapTestShell< interval_map<int, int> >();
|
|
|
|
return 0;
|
|
}
|
|
|