AMRange - basic operation with ranges and sets of rangesUseful for example for implementing variant types. You may have union of multiple types and tag with stored type.
Usage
Range oprations
AMRange<int> r1(1,5);
AMRange<int> r2(1,5);
EXPECT_EQ(r1, r2);
r1 = r2;
EXPECT_EQ(r1, r2);
AMRange<int> ri1(1,8);
AMRange<int> ri2(5, 12);
AMRange<int> ri3 = ri1;
ri3.intersect(ri2);
EXPECT_EQ(ri3, AMRange<int>(5,8));
EXPECT_TRUE(AMRange(2,2).empty());
EXPECT_FALSE(AMRange(4,9).empty());
EXPECT_TRUE(AMRange(-9,10).
valid());
EXPECT_FALSE(AMRange(0,-1).
valid());
EXPECT_TRUE(AMRange(-5,5).in(0));
EXPECT_FALSE(AMRange(-5,5).in(-6));
EXPECT_TRUE(AMRange(-5,5) < AMRange(0,10));
EXPECT_FALSE(AMRange(-5,5) < AMRange(-10,10));
AMRange rp1(1,5);
AMRange rp2(4,10);
AMRange rp3 = rp1;
rp3 += rp2;
EXPECT_EQ(rp3,AMRange(1,10));
AMRange rm1(1,5);
AMRange rm2(4,10);
AMRange rm3 = rp1;
rp3 -= rp2;
EXPECT_EQ(rp3,AMRange(1,4));
Set of ranges
std::set<AMRange<int> > s01;
std::set<AMRange<int> > s05 = {AMRange(1,5), AMRange(3, 9)};
std::set<AMRange<int> > s07 = {AMRange(1,5), AMRange(7, 9), AMRange(7, 12), AMRange(12, 15), AMRange(17, 19)};
std::set<AMRange<int> > s11 = {AMRange(1, 15), AMRange(17, 19)};
std::set<AMRange<int> > s13 = {AMRange(9, 15), AMRange(17, 19)};
EXPECT_EQ(
pack(s01), s01);
EXPECT_EQ(
pack(s05), std::set<AMRange<int> >{AMRange(1, 9)});
EXPECT_EQ(s07 + s05, s11);
EXPECT_EQ(s07 - s05, s13);;
For more, see AMRange.h
Sources
Download at GitHUB
Building AMRange
Getting sources
Compiling
mkdir cmake-build-debug
cd cmake-build-debug
cmake ..
make
Output Library
Single test (not necessary)
License
This library is under GNU GPL v3 license. If you need business license, don't hesitate to contact me.
Contribute
Please contact me.
Dependencies