blob: 3864b18118e6f66a60e49786dc165424dfda2914 [file] [log] [blame]
/*-----------------------------------------------------------------------------+
Copyright (c) 2008-2009: Joachim Faulhaber
+------------------------------------------------------------------------------+
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)
+-----------------------------------------------------------------------------*/
#ifndef LIBS_ICL_TEST_TEST_ICL_interval_map_mixed_hpp_JOFA_081005__
#define LIBS_ICL_TEST_TEST_ICL_interval_map_mixed_hpp_JOFA_081005__
//------------------------------------------------------------------------------
//- part1: Basic operations and predicates
//------------------------------------------------------------------------------
template <class T, class U>
void interval_map_mixed_ctor_4_ordered_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
T v0 = boost::icl::identity_element<T>::value();
U u1 = unit_element<U>::value();
SplitIntervalMapT split_map(mapping_pair<T,U>(v0,u1));
//JODO: clang err: ctor ambiguous. Should compile
//JODO CLANG SplitIntervalMapT split_map(make_pair(v0,u1));
IntervalMapT join_map(split_map);
BOOST_CHECK_EQUAL( hull(split_map).lower(), hull(join_map).lower() );
BOOST_CHECK_EQUAL( hull(split_map).upper(), hull(join_map).upper() );
}
template <class T, class U>
void interval_map_mixed_equal_4_ordered_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
T v0 = boost::icl::identity_element<T>::value();
U u1 = unit_element<U>::value();
SplitIntervalMapT split_empty, split_single(mapping_pair<T,U>(v0,u1));
IntervalMapT join_empty, join_single(mapping_pair<T,U>(v0,u1));
//JODO CLANG SplitIntervalMapT split_empty, split_single(make_pair(v0,u1));
//JODO CLANG IntervalMapT join_empty, join_single(make_pair(v0,u1));
// mixed ==-equality is a strange thing. Most times is does not
// make sense. It is better to allow only for same type == equality.
BOOST_CHECK_EQUAL( split_empty == split_empty, true );
BOOST_CHECK_EQUAL( join_empty == join_empty, true );
// There were Problems with operator== and emtpy sets.
BOOST_CHECK_EQUAL( split_empty == split_single, false );
BOOST_CHECK_EQUAL( join_empty == join_single, false );
BOOST_CHECK_EQUAL( split_single == split_empty, false );
BOOST_CHECK_EQUAL( join_single == join_empty, false );
BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_empty), true );
BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_empty), true );
BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_empty), true );
BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_empty), true );
//--------------------------------------------------------------------------
BOOST_CHECK_EQUAL( is_element_equal(split_empty, split_single), false );
BOOST_CHECK_EQUAL( is_element_equal(split_empty, join_single), false );
BOOST_CHECK_EQUAL( is_element_equal(join_empty, split_single), false );
BOOST_CHECK_EQUAL( is_element_equal(join_empty, join_single), false );
BOOST_CHECK_EQUAL( is_element_equal(split_single, split_empty), false );
BOOST_CHECK_EQUAL( is_element_equal(split_single, join_empty), false );
BOOST_CHECK_EQUAL( is_element_equal(join_single, split_empty), false );
BOOST_CHECK_EQUAL( is_element_equal(join_single, join_empty), false );
}
template <class T, class U>
void interval_map_mixed_assign_4_ordered_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
T v0 = boost::icl::identity_element<T>::value();
T v1 = unit_element<T>::value();
U u1 = unit_element<U>::value();
mapping_pair<T,U> v0_u1(v0,u1);
mapping_pair<T,U> v1_u1(v1,u1);
SplitIntervalMapT split_map;
IntervalMapT join_map;
split_map.add(v0_u1); //NOTE: make_pair(v0,u1); fails
join_map = split_map; //=t T& T::operator=(const P&) ...
BOOST_CHECK_EQUAL( hull(split_map).lower(), hull(join_map).lower() );
BOOST_CHECK_EQUAL( hull(split_map).upper(), hull(join_map).upper() );
SplitIntervalMapT split_self = SplitIntervalMapT().add(v0_u1);
IntervalMapT join_self = IntervalMapT().add(v1_u1);
split_self = split_self;
join_self = join_self;
BOOST_CHECK_EQUAL( split_self, split_self );
BOOST_CHECK_EQUAL( join_self, join_self );
}
template <class T, class U>
void interval_map_mixed_ctor_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I4_5D = IntervalT::right_open(v4,v5);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
SplitIntervalMapT split_map;
split_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
IntervalMapT join_map(split_map);
}
template <class T, class U>
void interval_map_mixed_assign_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I4_5D = IntervalT::right_open(v4,v5);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
SplitIntervalMapT split_map;
split_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
IntervalMapT join_map;
join_map = split_map;
BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
}
template <class T, class U>
void interval_map_mixed_equal_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I4_5D = IntervalT::right_open(v4,v5);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
IntervalMapT join_map;
join_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
IntervalMapT join_map2 = join_map;
BOOST_CHECK_EQUAL( join_map, join_map2 );
BOOST_CHECK_EQUAL( is_element_equal(join_map, join_map2), true );
SplitIntervalMapT split_map;
split_map.add(I1_3D_1).add(I2_4D_1).add(I4_5D_1);
SplitIntervalMapT split_map2 = split_map;
BOOST_CHECK_EQUAL( split_map, split_map2 );
BOOST_CHECK_EQUAL( is_element_equal(split_map2, split_map), true );
BOOST_CHECK_EQUAL( is_element_equal(split_map, join_map), true );
BOOST_CHECK_EQUAL( is_element_equal(join_map, split_map), true );
}
template <class T, class U, class Trt>
void partial_interval_map_mixed_inclusion_compare_4_bicremental_types()
{
typedef interval_map<T,U,Trt> IntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
//--------------------------------------------------------------------------
// equalities
// { 0 1 2 3 4 5 8 9 }
// {[0,2)[2,3](3,6) (7,9]}
// ->2 ->1 ->1 ->2
split_interval_map<T,U,Trt> split_map;
interval_map<T,U,Trt> join_map;
split_interval_set<T> split_set;
separate_interval_set<T> sep_set;
interval_set<T> join_set;
split_map.add(IDv(0,2,2)).add(IIv(2,3,1)).add(CDv(3,6,1)).add(CIv(7,9,2));
join_map = split_map;
icl::domain(split_set, split_map);
icl::domain(sep_set, split_map);
icl::domain(join_set, split_map);
iterative_size(split_map);
BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
BOOST_CHECK_EQUAL( iterative_size(split_set), 4 );
BOOST_CHECK_EQUAL( iterative_size(sep_set), 4 );
BOOST_CHECK_EQUAL( iterative_size(join_set), 2 );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_map), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(join_map, split_map), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_set), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, sep_set ), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_set ), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(join_map , split_set), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(join_map , sep_set ), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(join_map , join_set ), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(split_set, split_map), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(sep_set , split_map), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(join_set , split_map), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(split_set, join_map ), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(sep_set , join_map ), inclusion::equal );
BOOST_CHECK_EQUAL( inclusion_compare(join_set , join_map ), inclusion::equal );
//--------------------------------------------------------------------------
// inclusions
// { 0 1 2 3 4 5 8 9 }
// {[0, 2)[2, 3](3, 6) (7, 9]}
// ->2 ->1 ->1 ->2
// {[0, 2) [3,3](3, 6) (7, 9]}
// ->2 ->1 ->1 ->2
split_interval_map<T,U,Trt> split_sub_map1 = split_map;
split_sub_map1.erase(MK_v(2));
BOOST_CHECK_EQUAL( icl::contains(split_sub_map1, MK_v(2)), false );
interval_map<T,U,Trt> join_sub_map2;
join_sub_map2 = split_map;
join_sub_map2.erase(MK_v(1));
BOOST_CHECK_EQUAL( icl::contains(join_sub_map2, MK_v(1)), false );
split_interval_set<T> split_sub_set1;
separate_interval_set<T> sep_sub_set1;
interval_set<T> join_sub_set1;
icl::domain(split_sub_set1, split_sub_map1);
icl::domain(sep_sub_set1, split_sub_map1);
icl::domain(join_sub_set1, split_sub_map1);
BOOST_CHECK_EQUAL( inclusion_compare(split_sub_map1, split_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare( join_sub_map2, split_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare(split_sub_map1, join_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare( join_sub_map2, join_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare(split_sub_set1, split_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare( sep_sub_set1, split_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare( join_sub_set1, split_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare(split_sub_set1, join_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare( sep_sub_set1, join_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare( join_sub_set1, join_map), inclusion::subset );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_sub_map1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_sub_map2), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, split_sub_map1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, join_sub_map2), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_sub_set1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, sep_sub_set1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_sub_set1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, split_sub_set1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, sep_sub_set1), inclusion::superset );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, join_sub_set1), inclusion::superset );
split_interval_map<T,U,Trt> split_unrel_map11 = split_sub_map1;
split_unrel_map11.set(CIv(7,9,1));
BOOST_CHECK_EQUAL( split_unrel_map11(MK_v(8)), MK_u(1) );
interval_map<T,U,Trt> join_unrel_map21 = join_sub_map2;
join_unrel_map21.set(K_v(0,1));
BOOST_CHECK_EQUAL( join_unrel_map21(MK_v(0)), MK_u(1) );
BOOST_CHECK_EQUAL( inclusion_compare(split_unrel_map11, split_map), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare( join_unrel_map21, split_map), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare(split_unrel_map11, join_map), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare( join_unrel_map21, join_map), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, split_unrel_map11), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare(split_map, join_unrel_map21), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, split_unrel_map11), inclusion::unrelated );
BOOST_CHECK_EQUAL( inclusion_compare( join_map, join_unrel_map21), inclusion::unrelated );
split_interval_map<T,U,Trt> split_unrel_map1 = split_sub_map1;
split_unrel_map1.add(IDv(11,12,1));
BOOST_CHECK_EQUAL( split_unrel_map1(MK_v(11)), MK_u(1) );
interval_map<T,U,Trt> join_unrel_map2 = join_sub_map2;
join_unrel_map2.add(K_v(6,1));
BOOST_CHECK_EQUAL( join_unrel_map2(MK_v(6)), MK_u(1) );
}
template <class T, class U, class Trt>
void partial_interval_map_mixed_contains_4_bicremental_types()
{
typedef interval_map<T,U,Trt> IntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
//--------------------------------------------------------------------------
// { 0 1 2 3 4 5 8 9 }
// {[0,2)[2,3](3,6) (7,9]}
// ->2 ->1 ->1 ->2
split_interval_map<T,U,Trt> split_map;
interval_map<T,U,Trt> join_map;
split_interval_set<T> split_set;
separate_interval_set<T> sep_set;
interval_set<T> join_set;
split_map.add(IDv(0,2,2)).add(IIv(2,3,1)).add(CDv(3,6,1)).add(CIv(7,9,2));
join_map = split_map;
icl::domain(split_set, split_map);
icl::domain(sep_set, split_map);
icl::domain(join_set, split_map);
BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
BOOST_CHECK_EQUAL( iterative_size(split_set), 4 );
BOOST_CHECK_EQUAL( iterative_size(sep_set), 4 );
BOOST_CHECK_EQUAL( iterative_size(join_set), 2 );
// Key types
BOOST_CHECK_EQUAL( icl::contains(split_map, MK_v(0)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, MK_v(5)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, MK_v(9)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, I_D(2,3)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, I_D(0,6)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, I_D(0,7)), false );
BOOST_CHECK_EQUAL( icl::contains(join_map, I_D(2,3)), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, I_D(0,6)), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, I_D(0,7)), false );
// Map types
BOOST_CHECK_EQUAL( icl::contains(join_map, K_v(1,2)), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, K_v(5,1)), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, K_v(9,2)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, IDv(2,6,1)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, IDv(1,6,1)), false );
BOOST_CHECK_EQUAL( icl::contains(split_map, IIv(8,9,2)), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, IIv(8,9,3)), false );
BOOST_CHECK_EQUAL( icl::contains(join_map, IDv(2,6,1)), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, IDv(1,6,1)), false );
BOOST_CHECK_EQUAL( icl::contains(join_map, IIv(8,9,2)), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, IIv(8,9,3)), false );
BOOST_CHECK_EQUAL( icl::contains(split_map, join_map), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, split_map), true );
BOOST_CHECK_EQUAL( icl::within(split_map, join_map), true );
BOOST_CHECK_EQUAL( icl::within(join_map, split_map), true );
//--------------------------------------------------------------------------
// inclusions
// { 0 1 2 3 4 5 8 9 }
// {[0, 2)[2, 3](3, 6) (7, 9]}
// ->2 ->1 ->1 ->2
// {[0, 2) [3,3](3, 6) (7, 9]}
// ->2 ->1 ->1 ->2
split_interval_map<T,U,Trt> split_sub_map1 = split_map;
split_sub_map1.erase(MK_v(2));
BOOST_CHECK_EQUAL( icl::contains(split_sub_map1, MK_v(2)), false );
interval_map<T,U,Trt> join_sub_map2;
join_sub_map2 = split_map;
join_sub_map2.erase(MK_v(1));
BOOST_CHECK_EQUAL( icl::contains(join_sub_map2, MK_v(1)), false );
split_interval_set<T> split_sub_set1;
separate_interval_set<T> sep_sub_set1;
interval_set<T> join_sub_set1;
icl::domain(split_sub_set1, split_sub_map1);
icl::domain(sep_sub_set1, split_sub_map1);
icl::domain(join_sub_set1, split_sub_map1);
BOOST_CHECK_EQUAL( icl::within(split_sub_map1, split_map), true );
BOOST_CHECK_EQUAL( icl::within(join_sub_map2, split_map), true );
BOOST_CHECK_EQUAL( icl::within(split_sub_map1, join_map ), true );
BOOST_CHECK_EQUAL( icl::within(join_sub_map2, join_map ), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, split_sub_map1), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, join_sub_map2), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, split_sub_map1), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, join_sub_map2), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, split_sub_set1), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, sep_sub_set1), true );
BOOST_CHECK_EQUAL( icl::contains(split_map, join_sub_set1), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, split_sub_set1), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, sep_sub_set1), true );
BOOST_CHECK_EQUAL( icl::contains(join_map, join_sub_set1), true );
split_interval_map<T,U,Trt> split_unrel_map11 = split_sub_map1;
split_unrel_map11.set(CIv(7,9,1));
BOOST_CHECK_EQUAL( split_unrel_map11(MK_v(8)), MK_u(1) );
interval_map<T,U,Trt> join_unrel_map21 = join_sub_map2;
join_unrel_map21.set(K_v(0,1));
BOOST_CHECK_EQUAL( join_unrel_map21(MK_v(0)), MK_u(1) );
BOOST_CHECK_EQUAL( icl::contains(split_unrel_map11, split_map), false );
BOOST_CHECK_EQUAL( icl::contains(join_unrel_map21, split_map), false );
BOOST_CHECK_EQUAL( icl::contains(split_unrel_map11, join_map), false );
BOOST_CHECK_EQUAL( icl::contains(join_unrel_map21, join_map), false );
BOOST_CHECK_EQUAL( icl::within(split_unrel_map11, split_map), false );
BOOST_CHECK_EQUAL( icl::within(join_unrel_map21, split_map), false );
BOOST_CHECK_EQUAL( icl::within(split_unrel_map11, join_map), false );
BOOST_CHECK_EQUAL( icl::within(join_unrel_map21, join_map), false );
BOOST_CHECK_EQUAL( icl::contains(split_map, split_unrel_map11), false );
BOOST_CHECK_EQUAL( icl::contains(split_map, join_unrel_map21), false );
BOOST_CHECK_EQUAL( icl::contains(join_map, split_unrel_map11), false );
BOOST_CHECK_EQUAL( icl::contains(join_map, join_unrel_map21), false );
}
//------------------------------------------------------------------------------
//- part2: Operations
//------------------------------------------------------------------------------
template <class T, class U>
void interval_map_mixed_add_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I4_5D = IntervalT::right_open(v4,v5);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
mapping_pair<T,U> v1_1(v1, u1);
mapping_pair<T,U> v3_1(v3, u1);
mapping_pair<T,U> v5_1(v5, u1);
SplitIntervalMapT split_map;
split_map.add(I1_3D_1).add(I2_4D_1);
split_map += I4_5D_1;
BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
IntervalMapT join_map;
join_map += split_map;
BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
IntervalMapT join_map3;
join_map3.add(v1_1).add(v3_1);
join_map3 += v5_1;
BOOST_CHECK_EQUAL( iterative_size(join_map3), 3 );
SplitIntervalMapT split_map3;
split_map3 += join_map3;
BOOST_CHECK_EQUAL( iterative_size(split_map3), 3 );
}
template <class T, class U>
void interval_map_mixed_add2_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I4_5D = IntervalT::right_open(v4,v5);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I4_5D_1(I4_5D, u1);
mapping_pair<T,U> v1_1(v1, u1);
mapping_pair<T,U> v3_1(v3, u1);
mapping_pair<T,U> v5_1(v5, u1);
SplitIntervalMapT split_map;
split_map.add(I1_3D_1).add(I2_4D_1);
split_map |= I4_5D_1;
BOOST_CHECK_EQUAL( iterative_size(split_map), 4 );
IntervalMapT join_map;
join_map |= split_map;
BOOST_CHECK_EQUAL( iterative_size(join_map), 3 );
IntervalMapT join_map3;
join_map3.add(v1_1).add(v3_1);
join_map3 |= v5_1;
BOOST_CHECK_EQUAL( iterative_size(join_map3), 3 );
SplitIntervalMapT split_map3;
split_map3 |= join_map3;
BOOST_CHECK_EQUAL( iterative_size(split_map3), 3 );
}
template <class T, class U>
void interval_map_mixed_subtract_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_4D = IntervalT::right_open(v0,v4);
IntervalT I2_6D = IntervalT::right_open(v2,v6);
IntervalT I3_6D = IntervalT::right_open(v3,v6);
IntervalT I5_7D = IntervalT::right_open(v5,v7);
IntervalT I7_8D = IntervalT::right_open(v7,v8);
IntervalT I8_9D = IntervalT::right_open(v8,v9);
IntervalT I8_9I = IntervalT::closed(v8,v9);
std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
SplitIntervalMapT split_map;
split_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
BOOST_CHECK_EQUAL( iterative_size(split_map), 7 );
IntervalMapT join_map;
join_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
BOOST_CHECK_EQUAL( iterative_size(join_map), 5 );
// Make maps to be subtracted
SplitIntervalMapT split_sub;
split_sub.add(I3_6D_1).add(I8_9D_1);
IntervalMapT join_sub;
join_sub.add(I3_6D_1).add(I8_9D_1);
//--------------------------------------------------------------------------
// Test for split_interval_map
SplitIntervalMapT split_diff = split_map;
IntervalMapT join_diff = join_map;
//subtraction combinations
split_diff -= split_sub;
join_diff -= split_sub;
BOOST_CHECK_EQUAL( iterative_size(split_diff), 7 );
BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
//--------------------------------------------------------------------------
// Test for interval_map. Reinitialize
split_diff = split_map;
join_diff = join_map;
//subtraction combinations
split_diff -= join_sub;
join_diff -= join_sub;
BOOST_CHECK_EQUAL( iterative_size(split_diff), 7 );
BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
}
template <class T, class U>
void interval_map_mixed_erase_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_4D = IntervalT::right_open(v0,v4);
IntervalT I2_6D = IntervalT::right_open(v2,v6);
IntervalT I3_6D = IntervalT::right_open(v3,v6);
IntervalT I5_7D = IntervalT::right_open(v5,v7);
IntervalT I7_8D = IntervalT::right_open(v7,v8);
IntervalT I8_9D = IntervalT::right_open(v8,v9);
IntervalT I8_9I = IntervalT::closed(v8,v9);
std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
SplitIntervalMapT split_map;
split_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
BOOST_CHECK_EQUAL( iterative_size(split_map), 7 );
IntervalMapT join_map;
join_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
BOOST_CHECK_EQUAL( iterative_size(join_map), 5 );
// Make sets to be erased
SplitIntervalMapT split_sub;
split_sub.add(I3_6D_1).add(I8_9D_1);
IntervalMapT join_sub;
join_sub.add(I3_6D_1).add(I8_9D_1);
//--------------------------------------------------------------------------
// Test for split_interval_map
SplitIntervalMapT split_diff = split_map;
IntervalMapT join_diff = join_map;
//subtraction combinations
erase(split_diff, split_sub);
erase(join_diff, split_sub);
BOOST_CHECK_EQUAL( iterative_size(split_diff), 6 );
BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
//--------------------------------------------------------------------------
// Test for interval_map. Reinitialize
split_diff = split_map;
join_diff = join_map;
//subtraction combinations
erase(split_diff, join_sub);
erase(join_diff, join_sub);
BOOST_CHECK_EQUAL( iterative_size(split_diff), 6 );
BOOST_CHECK_EQUAL( iterative_size(join_diff), 5 );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
}
template <class T, class U>
void interval_map_mixed_erase2_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_4D = IntervalT::right_open(v0,v4);
IntervalT I2_6D = IntervalT::right_open(v2,v6);
IntervalT I3_6D = IntervalT::right_open(v3,v6);
IntervalT I5_7D = IntervalT::right_open(v5,v7);
IntervalT I7_8D = IntervalT::right_open(v7,v8);
IntervalT I8_9D = IntervalT::right_open(v8,v9);
IntervalT I8_9I = IntervalT::closed(v8,v9);
std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
SplitIntervalMapT split_map;
split_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
BOOST_CHECK_EQUAL( iterative_size(split_map), 7 );
IntervalMapT join_map;
join_map.add(I0_4D_1).add(I2_6D_1).add(I5_7D_1).add(I7_8D_1).add(I8_9I_1);
BOOST_CHECK_EQUAL( iterative_size(join_map), 5 );
// Make sets to be erased
SplitIntervalSetT split_sub;
split_sub.add(I3_6D).add(I8_9D);
IntervalSetT join_sub;
join_sub.add(I3_6D).add(I8_9D);
//--------------------------------------------------------------------------
// Test for split_interval_map
SplitIntervalMapT split_diff = split_map;
IntervalMapT join_diff = join_map;
SplitIntervalMapT split_diff2 = split_map;
IntervalMapT join_diff2 = join_map;
//erase combinations
erase(split_diff, split_sub);
erase(join_diff, split_sub);
BOOST_CHECK_EQUAL( iterative_size(split_diff), 5 );
BOOST_CHECK_EQUAL( iterative_size(join_diff), 4 );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, split_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
//subtraction combinations
split_diff2 -= split_sub;
join_diff2 -= split_sub;
BOOST_CHECK_EQUAL( iterative_size(split_diff2), 5 );
BOOST_CHECK_EQUAL( iterative_size(join_diff2), 4 );
BOOST_CHECK_EQUAL( is_element_equal(split_diff2, split_diff2), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff2, join_diff2), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff2, split_diff2), true );
//--------------------------------------------------------------------------
// Test for interval_map. Reinitialize
split_diff = split_map;
join_diff = join_map;
split_diff2 = split_map;
join_diff2 = join_map;
//erase combinations
erase(split_diff, join_sub);
erase(join_diff, join_sub);
BOOST_CHECK_EQUAL( iterative_size(split_diff), 5 );
BOOST_CHECK_EQUAL( iterative_size(join_diff), 4 );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, join_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff, split_diff), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff, join_diff), true );
//subtraction combinations
split_diff2 -= join_sub;
join_diff2 -= join_sub;
BOOST_CHECK_EQUAL( iterative_size(split_diff2), 5 );
BOOST_CHECK_EQUAL( iterative_size(join_diff2), 4 );
BOOST_CHECK_EQUAL( is_element_equal(join_diff2, join_diff2), true );
BOOST_CHECK_EQUAL( is_element_equal(join_diff2, split_diff2), true );
BOOST_CHECK_EQUAL( is_element_equal(split_diff2, join_diff2), true );
}
template <class T, class U>
void interval_map_mixed_insert_erase_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_4D = IntervalT::right_open(v0,v4);
IntervalT I2_6D = IntervalT::right_open(v2,v6);
IntervalT I3_6D = IntervalT::right_open(v3,v6);
IntervalT I5_7D = IntervalT::right_open(v5,v7);
IntervalT I7_8D = IntervalT::right_open(v7,v8);
IntervalT I8_9D = IntervalT::right_open(v8,v9);
IntervalT I8_9I = IntervalT::closed(v8,v9);
std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
SplitIntervalMapT split_A, split_B, split_all, split_X;
IntervalMapT join_A, join_B, join_all, join_X;
split_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
split_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
split_B.insert(I7_8D_1).insert(I8_9I_1);
join_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
join_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
join_B.insert(I7_8D_1).insert(I8_9I_1);
//-------------------------------------------------------------------------
insert(split_X, split_A);
BOOST_CHECK_EQUAL( split_X, split_A );
insert(split_X, split_B);
BOOST_CHECK_EQUAL( split_X, split_all );
erase(split_X, split_B);
BOOST_CHECK_EQUAL( split_X, split_A );
erase(split_X, split_A);
BOOST_CHECK_EQUAL( split_X, SplitIntervalMapT() );
//-------------------------------------------------------------------------
insert(join_X, join_A);
BOOST_CHECK_EQUAL( join_X, join_A );
insert(join_X, join_B);
BOOST_CHECK_EQUAL( join_X, join_all );
erase(join_X, join_B);
BOOST_CHECK_EQUAL( join_X, join_A );
erase(join_X, join_A);
BOOST_CHECK_EQUAL( join_X, IntervalMapT() );
//-------------------------------------------------------------------------
split_X.clear();
insert(split_X, join_A);
BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
insert(split_X, join_B);
BOOST_CHECK_EQUAL( is_element_equal(split_X, split_all), true );
erase(split_X, join_B);
BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
erase(split_X, join_A);
BOOST_CHECK_EQUAL( is_element_equal(split_X, SplitIntervalMapT()), true );
//-------------------------------------------------------------------------
split_X.clear();
insert(join_X, split_A);
BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
insert(join_X, split_B);
BOOST_CHECK_EQUAL( is_element_equal(join_X, join_all), true );
erase(join_X, split_B);
BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
erase(join_X, split_A);
BOOST_CHECK_EQUAL( is_element_equal(join_X, IntervalMapT()), true );
}
template <class T, class U>
void interval_map_mixed_insert_erase2_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_4D = IntervalT::right_open(v0,v4);
IntervalT I2_6D = IntervalT::right_open(v2,v6);
IntervalT I3_6D = IntervalT::right_open(v3,v6);
IntervalT I5_7D = IntervalT::right_open(v5,v7);
IntervalT I7_8D = IntervalT::right_open(v7,v8);
IntervalT I8_9D = IntervalT::right_open(v8,v9);
IntervalT I8_9I = IntervalT::closed(v8,v9);
std::pair<IntervalT,U> I0_4D_1(I0_4D, u1);
std::pair<IntervalT,U> I2_6D_1(I2_6D, u1);
std::pair<IntervalT,U> I3_6D_1(I3_6D, u1);
std::pair<IntervalT,U> I5_7D_1(I5_7D, u1);
std::pair<IntervalT,U> I7_8D_1(I7_8D, u1);
std::pair<IntervalT,U> I8_9D_1(I8_9D, u1);
std::pair<IntervalT,U> I8_9I_1(I8_9I, u1);
SplitIntervalMapT split_A, split_B, split_all, split_X;
IntervalMapT join_A, join_B, join_all, join_X;
SplitIntervalSetT split_dA, split_dB;
IntervalSetT join_dA, join_dB;
split_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
split_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
split_B.insert(I7_8D_1).insert(I8_9I_1);
join_all.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1).insert(I7_8D_1).insert(I8_9I_1);
join_A.insert(I0_4D_1).insert(I2_6D_1).insert(I5_7D_1);
join_B.insert(I7_8D_1).insert(I8_9I_1);
icl::domain(split_dA, split_A);
icl::domain(split_dB, split_B);
icl::domain(join_dA, join_A);
icl::domain(join_dB, join_B);
//-------------------------------------------------------------------------
insert(split_X, split_A);
BOOST_CHECK_EQUAL( split_X, split_A );
insert(split_X, split_B);
BOOST_CHECK_EQUAL( split_X, split_all );
erase(split_X, split_dB);
BOOST_CHECK_EQUAL( split_X, split_A );
erase(split_X, split_dA);
BOOST_CHECK_EQUAL( split_X, SplitIntervalMapT() );
//-------------------------------------------------------------------------
insert(join_X, join_A);
BOOST_CHECK_EQUAL( join_X, join_A );
insert(join_X, join_B);
BOOST_CHECK_EQUAL( join_X, join_all );
erase(join_X, join_dB);
BOOST_CHECK_EQUAL( join_X, join_A );
erase(join_X, join_dA);
BOOST_CHECK_EQUAL( join_X, IntervalMapT() );
//-------------------------------------------------------------------------
split_X.clear();
insert(split_X, join_A);
BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
insert(split_X, join_B);
BOOST_CHECK_EQUAL( is_element_equal(split_X, split_all), true );
erase(split_X, join_dB);
BOOST_CHECK_EQUAL( is_element_equal(split_X, split_A), true );
erase(split_X, join_dA);
BOOST_CHECK_EQUAL( is_element_equal(split_X, SplitIntervalMapT()), true );
//-------------------------------------------------------------------------
split_X.clear();
insert(join_X, split_A);
BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
insert(join_X, split_B);
BOOST_CHECK_EQUAL( is_element_equal(join_X, join_all), true );
erase(join_X, split_dB);
BOOST_CHECK_EQUAL( is_element_equal(join_X, split_A), true );
erase(join_X, split_dA);
BOOST_CHECK_EQUAL( is_element_equal(join_X, IntervalMapT()), true );
}
template <class T, class U>
void interval_map_mixed_basic_intersect_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
U u2 = make<U>(2);
U u3 = make<U>(3);
T v0 = make<T>(0);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_3D = IntervalT::right_open(v0,v3);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I1_8D = IntervalT::right_open(v1,v8);
IntervalT I2_7D = IntervalT::right_open(v2,v7);
IntervalT I2_3D = IntervalT::right_open(v2,v3);
IntervalT I6_7D = IntervalT::right_open(v6,v7);
IntervalT I6_8D = IntervalT::right_open(v6,v8);
IntervalT I6_9D = IntervalT::right_open(v6,v9);
std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
std::pair<IntervalT,U> I1_8D_1(I1_8D, u1);
std::pair<const IntervalT,U> I2_7D_1(I2_7D, u1);
std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
std::pair<IntervalT,U> I2_3D_3(I2_3D, u3);
std::pair<IntervalT,U> I6_7D_1(I6_7D, u1);
std::pair<IntervalT,U> I6_7D_3(I6_7D, u3);
std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
//--------------------------------------------------------------------------
// split_interval_map
//--------------------------------------------------------------------------
//split_A [0 3) [6 9)
// &= [1 8)
//split_AB -> [1 3) [6 8)
// &= [2 7)
// -> [2 3) [6 7)
SplitIntervalMapT split_A, split_B, split_AB, split_ab, split_ab2;
split_A.add(I0_3D_1).add(I6_9D_1);
split_AB = split_A;
split_AB &= I1_8D_1;
split_ab.add(I1_3D_2).add(I6_8D_2);
BOOST_CHECK_EQUAL( split_AB, split_ab );
split_AB = split_A;
(split_AB &= I1_8D_1) &= I2_7D_1;
split_ab2.add(I2_3D_3).add(I6_7D_3);
BOOST_CHECK_EQUAL( split_AB, split_ab2 );
//--------------------------------------------------------------------------
//split_A [0 3) [6 9)
// 1 1
// &= 1
// 1
//split_AB -> [1]
// 2
// += (1 7)
// 2
// -> [1](1 7)
// 2 2
split_A.clear();
split_A.add(I0_3D_1).add(I6_9D_1);
split_AB = split_A;
split_AB &= mapping_pair<T,U>(v1,u1);
split_ab.clear();
split_ab.add(mapping_pair<T,U>(v1,u2));
BOOST_CHECK_EQUAL( split_AB, split_ab );
split_AB = split_A;
split_AB &= mapping_pair<T,U>(v1,u1);
split_AB += make_pair(IntervalT::open(v1,v7), u2);
split_ab2.clear();
split_ab2 += make_pair(IntervalT::right_open(v1,v7), u2);
BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
}
template <class T, class U>
void interval_map_mixed_basic_intersect2_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
U u2 = make<U>(2);
U u3 = make<U>(3);
T v0 = make<T>(0);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v6 = make<T>(6);
T v7 = make<T>(7);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_3D = IntervalT::right_open(v0,v3);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I1_8D = IntervalT::right_open(v1,v8);
IntervalT I2_7D = IntervalT::right_open(v2,v7);
IntervalT I2_3D = IntervalT::right_open(v2,v3);
IntervalT I6_7D = IntervalT::right_open(v6,v7);
IntervalT I6_8D = IntervalT::right_open(v6,v8);
IntervalT I6_9D = IntervalT::right_open(v6,v9);
std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
std::pair<IntervalT,U> I1_8D_1(I1_8D, u1);
std::pair<IntervalT,U> I2_7D_1(I2_7D, u1);
std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
std::pair<IntervalT,U> I2_3D_3(I2_3D, u3);
std::pair<IntervalT,U> I6_7D_1(I6_7D, u1);
std::pair<IntervalT,U> I6_7D_3(I6_7D, u3);
std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
//--------------------------------------------------------------------------
// split_interval_map
//--------------------------------------------------------------------------
//split_A [0 3) [6 9)
// &= [1 8)
//split_AB -> [1 3) [6 8)
// &= [2 7)
// -> [2 3) [6 7)
SplitIntervalMapT split_A, split_B, split_AB, split_ab, split_ab2;
split_A.add(I0_3D_1).add(I6_9D_1);
split_AB = split_A;
split_AB &= I1_8D;
split_ab.add(I1_3D_1).add(I6_8D_1);
BOOST_CHECK_EQUAL( split_AB, split_ab );
split_AB = split_A;
(split_AB &= I1_8D) &= I2_7D;
split_ab2.add(I2_3D_1).add(I6_7D_1);
BOOST_CHECK_EQUAL( split_AB, split_ab2 );
//--------------------------------------------------------------------------
//split_A [0 3) [6 9)
// 1 1
// &= 1
// 1
//split_AB -> [1]
// 2
// += (1 7)
// 2
// -> [1](1 7)
// 2 2
split_A.clear();
split_A.add(I0_3D_1).add(I6_9D_1);
split_AB = split_A;
split_AB &= v1;
split_ab.clear();
split_ab.add(mapping_pair<T,U>(v1,u1));
BOOST_CHECK_EQUAL( split_AB, split_ab );
split_AB = split_A;
split_AB &= IntervalT(v1);
split_AB += make_pair(IntervalT::open(v1,v7), u1);
split_ab2.clear();
split_ab2 += make_pair(IntervalT::right_open(v1,v7), u1);
BOOST_CHECK_EQUAL( is_element_equal(split_AB, split_ab2), true );
split_interval_map<T,U> left, right;
left. add(IDv(0,2,2));
right.add(IDv(0,2,2));
BOOST_CHECK_EQUAL( is_element_equal(left, right), true );
split_interval_set<T> left2, right2;
left2. add(I_D(0,2));
right2.add(I_D(0,1));
is_element_equal(left2, right2);
BOOST_CHECK_EQUAL( is_element_equal(left2, right2), false );
}
template <class T, class U>
void interval_map_mixed_intersect_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
U u2 = make<U>(2);
T v0 = make<T>(0);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_3D = IntervalT::right_open(v0,v3);
IntervalT I1_2D = IntervalT::right_open(v1,v2);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_3D = IntervalT::right_open(v2,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I5_8D = IntervalT::right_open(v5,v8);
IntervalT I6_8D = IntervalT::right_open(v6,v8);
IntervalT I6_9D = IntervalT::right_open(v6,v9);
std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
std::pair<IntervalT,U> I1_2D_1(I1_2D, u1);
std::pair<IntervalT,U> I1_2D_2(I1_2D, u2);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
std::pair<IntervalT,U> I2_3D_2(I2_3D, u2);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I5_8D_1(I5_8D, u1);
std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
//--------------------------------------------------------------------------
// split_interval_set
//--------------------------------------------------------------------------
//split_A [0 3) [6 9)
// 1 1
//split_B &= [1 2)[2 4) [5 8)
// 1 1 1
//split_AB -> [1 2)[2 3) [6 8)
// 2 2 2
SplitIntervalMapT split_A, split_B, split_AB, split_ab, split_ab_jn;
IntervalMapT join_A, join_B, join_AB, join_ab;
split_A.add(I0_3D_1).add(I6_9D_1);
split_B.add(I1_2D_1).add(I2_4D_1).add(I5_8D_1);
split_ab.add(I1_2D_2).add(I2_3D_2).add(I6_8D_2);
split_ab_jn.add(I1_3D_2).add(I6_8D_2);
split_AB = split_A;
split_AB &= split_B;
BOOST_CHECK_EQUAL( iterative_size(split_AB), 3 );
BOOST_CHECK_EQUAL( split_AB, split_ab );
//split_A [0 3) [6 9)
// 1 1
//join_B &= [1 4) [5 8)
// 1 1
//split_AB -> [1 3) [6 8)
// 2 2
split_AB = split_A;
join_B = split_B;
split_AB &= join_B;
BOOST_CHECK_EQUAL( iterative_size(split_AB), 2 );
BOOST_CHECK_EQUAL( split_AB, split_ab_jn );
}
template <class T, class U>
void interval_map_mixed_intersect2_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
U u2 = make<U>(2);
T v0 = make<T>(0);
T v1 = make<T>(1);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v5 = make<T>(5);
T v6 = make<T>(6);
T v8 = make<T>(8);
T v9 = make<T>(9);
IntervalT I0_3D = IntervalT::right_open(v0,v3);
IntervalT I1_2D = IntervalT::right_open(v1,v2);
IntervalT I1_3D = IntervalT::right_open(v1,v3);
IntervalT I2_3D = IntervalT::right_open(v2,v3);
IntervalT I2_4D = IntervalT::right_open(v2,v4);
IntervalT I5_8D = IntervalT::right_open(v5,v8);
IntervalT I6_8D = IntervalT::right_open(v6,v8);
IntervalT I6_9D = IntervalT::right_open(v6,v9);
std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
std::pair<IntervalT,U> I1_2D_1(I1_2D, u1);
std::pair<IntervalT,U> I1_2D_2(I1_2D, u2);
std::pair<IntervalT,U> I1_3D_1(I1_3D, u1);
std::pair<IntervalT,U> I1_3D_2(I1_3D, u2);
std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
std::pair<IntervalT,U> I2_3D_2(I2_3D, u2);
std::pair<IntervalT,U> I2_4D_1(I2_4D, u1);
std::pair<IntervalT,U> I5_8D_1(I5_8D, u1);
std::pair<IntervalT,U> I6_8D_1(I6_8D, u1);
std::pair<IntervalT,U> I6_8D_2(I6_8D, u2);
std::pair<IntervalT,U> I6_9D_1(I6_9D, u1);
//--------------------------------------------------------------------------
// split_interval_set
//--------------------------------------------------------------------------
//split_A [0 3) [6 9)
// 1 1
//split_B &= [1 2)[2 4) [5 8)
//split_AB -> [1 2)[2 3) [6 8)
// 1 1 1
SplitIntervalMapT split_A, split_AB, split_ab, split_ab_jn;
SplitIntervalSetT split_B;
IntervalMapT join_A, join_AB, join_ab;
IntervalSetT join_B;
split_A.add(I0_3D_1).add(I6_9D_1);
split_B.add(I1_2D).add(I2_4D).add(I5_8D);
split_ab.add(I1_2D_1).add(I2_3D_1).add(I6_8D_1);
split_ab_jn.add(I1_3D_1).add(I6_8D_1);
split_AB = split_A;
split_AB &= split_B;
BOOST_CHECK_EQUAL( iterative_size(split_AB), 3 );
BOOST_CHECK_EQUAL( split_AB, split_ab );
//split_A [0 3) [6 9)
// 1 1
//join_B &= [1 4) [5 8)
//split_AB -> [1 3) [6 8)
// 1 1
split_AB = split_A;
join_B = split_B;
split_AB &= join_B;
BOOST_CHECK_EQUAL( iterative_size(split_AB), 2 );
BOOST_CHECK_EQUAL( split_AB, split_ab_jn );
}
template <class T, class U>
void interval_map_mixed_disjoint_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v6 = make<T>(6);
IntervalT I0_2D = IntervalT::right_open(v0,v2);
IntervalT I2_3D = IntervalT::right_open(v2,v3);
IntervalT I3_4D = IntervalT::right_open(v3,v4);
IntervalT I4_4I = IntervalT::closed(v4,v4);
IntervalT C4_6D = IntervalT::open(v4,v6);
IntervalT I6_6I = IntervalT::closed(v6,v6);
std::pair<IntervalT,U> I0_2D_1(I0_2D, u1);
std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
std::pair<IntervalT,U> I3_4D_1(I3_4D, u1);
std::pair<IntervalT,U> I4_4I_1(I4_4I, u1);
std::pair<IntervalT,U> C4_6D_1(C4_6D, u1);
std::pair<IntervalT,U> I6_6I_1(I6_6I, u1);
//--------------------------------------------------------------------------
//split_A: [0 2) [4 4] [6 6]
//split_B: [2 3)[3 4) (4 6)
SplitIntervalMapT split_A, split_B;
split_A.add(I0_2D_1).add(I4_4I_1).add(I6_6I_1);
split_B.add(I2_3D_1).add(I3_4D_1).add(C4_6D_1);
IntervalMapT join_A(split_A), join_B(split_B);
BOOST_CHECK_EQUAL( disjoint(split_A, split_B), true );
BOOST_CHECK_EQUAL( disjoint(split_A, join_B), true );
BOOST_CHECK_EQUAL( disjoint(join_A, split_B), true );
BOOST_CHECK_EQUAL( disjoint(join_A, join_B), true );
}
template<class Type>
struct size_greater_1 : public icl::property<Type>
{
bool operator()(const Type& value)const
{
return icl::size(value.first) > 1 ;
}
};
template <class T, class U>
void interval_map_mixed_erase_if_4_integral_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef split_interval_map<T,U> SplitIntervalMapT;
typedef interval_set<T> IntervalSetT;
typedef split_interval_set<T> SplitIntervalSetT;
typedef typename IntervalMapT::interval_type IntervalT;
U u1 = make<U>(1);
T v0 = make<T>(0);
T v2 = make<T>(2);
T v3 = make<T>(3);
T v4 = make<T>(4);
T v6 = make<T>(6);
IntervalT I0_3D = IntervalT::right_open(v0,v3);
IntervalT I2_3D = IntervalT::right_open(v2,v3);
IntervalT I3_4D = IntervalT::right_open(v3,v4);
IntervalT I4_4I = IntervalT::closed(v4,v4);
IntervalT C4_6D = IntervalT::open(v4,v6);
IntervalT I6_6I = IntervalT::closed(v6,v6);
std::pair<IntervalT,U> I0_3D_1(I0_3D, u1);
std::pair<IntervalT,U> I2_3D_1(I2_3D, u1);
std::pair<IntervalT,U> I3_4D_1(I3_4D, u1);
std::pair<IntervalT,U> I4_4I_1(I4_4I, u1);
std::pair<IntervalT,U> C4_6D_1(C4_6D, u1);
std::pair<IntervalT,U> I6_6I_1(I6_6I, u1);
//--------------------------------------------------------------------------
//split_A: [0 2) [4 4] [6 6]
//split_B: [2 3)[3 4) (4 6)
SplitIntervalMapT split_A, split_B;
split_A.add(I0_3D_1).add(I4_4I_1).add(I6_6I_1);
split_B.add(I4_4I_1).add(I6_6I_1);
icl::erase_if(size_greater_1<typename SplitIntervalMapT::value_type>(), split_A);
BOOST_CHECK_EQUAL( split_A, split_B );
}
//------------------------------------------------------------------------------
//- infix operators
//------------------------------------------------------------------------------
template <class T, class U>
void interval_map_mixed_infix_plus_overload_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
typedef typename IntervalMapT::interval_type IntervalT;
interval_map<T,U> join_a;
split_interval_map<T,U> split_a;
join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
BOOST_CHECK_EQUAL(split_a + join_a, join_a + split_a);
}
template <class T, class U>
void interval_map_mixed_infix_pipe_overload_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
interval_map<T,U> join_a;
split_interval_map<T,U> split_a;
join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
BOOST_CHECK_EQUAL(split_a | join_a, join_a | split_a);
}
template <class T, class U>
void interval_map_mixed_infix_minus_overload_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
interval_map<T,U> join_a, join_b;
split_interval_map<T,U> split_a, split_b;
join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
join_b .add(CDv(1,3,1)).add(IIv(6,11,3));
split_b.add(IDv(0,9,2)).add(IIv(3,6,1));
BOOST_CHECK_EQUAL(split_a - join_a, (split_b = split_a) -= join_a);
BOOST_CHECK_EQUAL(split_a - join_a, split_b);
BOOST_CHECK_EQUAL(join_a - split_a, (join_b = join_a) -= split_a);
BOOST_CHECK_EQUAL(join_a - split_a, join_b);
}
template <class T, class U>
void interval_map_mixed_infix_et_overload_4_bicremental_types()
{
typedef interval_map<T,U> IntervalMapT;
interval_map<T,U> join_a, join_b;
split_interval_map<T,U> split_a, split_b;
join_a .add(CDv(1,3,1)).add(IDv(8,9,1)).add(IIv(6,11,3));
split_a.add(IDv(0,9,2)).add(IIv(3,6,1)).add(IDv(5,7,1));
BOOST_CHECK_EQUAL(split_a & join_a, join_a & split_a);
BOOST_CHECK_EQUAL(split_a & join_a, (split_b = split_a) &= join_a);
BOOST_CHECK_EQUAL(split_a & join_a, split_b);
BOOST_CHECK_EQUAL(join_a & split_a, (split_b = split_a) &= join_a);
BOOST_CHECK_EQUAL(join_a & split_a, split_b);
}
#endif // LIBS_ICL_TEST_TEST_ICL_interval_map_mixed_hpp_JOFA_081005__