-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrangemap.cpp
More file actions
123 lines (98 loc) · 4.6 KB
/
Copy pathrangemap.cpp
File metadata and controls
123 lines (98 loc) · 4.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Copyright (C) 2024 Jimmy Aguilar Mena
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <argparser.hpp>
#include <iostream>
#include "rangemap.hpp"
int main()
{
rangeMap<int, int> map(0);
myassert(map.isEqual({{-2147483648,0}}));
// Insertions no overlap
// First insertion
map.setRange(0, 100, 1);
std::cout << map << std::endl;
myassert(map.isEqual({{-2147483648,0},{0,1},{100,0}}));
// Insert on the right of that one
map.setRange(100, 200, 2);
std::cout << map << std::endl;
myassert(map.isEqual( { {-2147483648,0}, {0,1}, {100,2}, {200,0} }));
// Insert on the left of everything
map.setRange(-100, 0, 3);
std::cout << map << std::endl;
myassert(map.isEqual({{-2147483648,0}, {-100,3}, {0,1}, {100,2}, {200,0}}));
// Overlap insertion
// Insert within a range
map.setRange(40, 50, 4);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,4}, {50,1}, {100,2}, {200,0} }));
// Insert within a range in start
map.setRange(50, 60, 5);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,4}, {50,5}, {60,1}, {100,2}, {200,0} }));
// Full overlap 1 range
map.setRange(40, 50, 6);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,6}, {50,5}, {60,1}, {100,2}, {200,0} }));
// Full overlap 2 ranges
map.setRange(40, 60, 7);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,7}, {60,1}, {100,2}, {200,0} }));
// Partial overlap 2 ranges
map.setRange(50, 70, 8);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,7}, {50,8}, {70,1}, {100,2}, {200,0} }));
// Partial overlap 3 ranges
map.setRange(45, 75, 9);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,7}, {45,9}, {75,1}, {100,2}, {200,0} }));
// Partial overlap 2 ranges one at the end
map.setRange(150, 250, 10);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,7}, {45,9}, {75,1}, {100,2}, {150,10}, {250,0} }));
// Insert an interval just next to other but with same value (merge left)
map.setRange(250, 300, 10);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {40,7}, {45,9}, {75,1}, {100,2}, {150,10}, {300,0} }));
// Insert an interval just before another with same value (merge right)
map.setRange(20, 40, 7);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {20,7}, {45,9}, {75,1}, {100,2}, {150,10}, {300,0} }));
// Insert an interval with same value to merge latter
map.setRange(75, 110, 10);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {20,7}, {45,9}, {75,10}, {110,2}, {150,10}, {300,0} }));
// Insert an interval with merge in both sides
map.setRange(110, 150, 10);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {20,7}, {45,9}, {75,10}, {300,0} }));
// Insert embeded interval with same value then parent
map.setRange(-75, -50, 3);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-100,3}, {0,1}, {20,7}, {45,9}, {75,10}, {300,0} }));
// Insert left interval to merge
map.setRange(-200, -150, 3);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-200,3}, {-150,0}, {-100,3}, {0,1}, {20,7}, {45,9}, {75,10}, {300,0} }));
// Insert left interval to merge
map.setRange(-300, -250, 3);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-300,3}, {-250,0}, {-200,3}, {-150,0}, {-100,3}, {0,1}, {20,7}, {45,9}, {75,10}, {300,0} }));
// Insert triple merge interval
map.setRange(-275, -50, 3);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-300,3}, {0,1}, {20,7}, {45,9}, {75,10}, {300,0} }));
// Partial overlay
map.setRange(-300, -200, 4);
std::cout << map << std::endl;
myassert(map.isEqual({ {-2147483648,0}, {-300,4}, {-200,3}, {0,1}, {20,7}, {45,9}, {75,10}, {300,0} }));
return 0;
}