From: Thomas Jarosch Date: Sun, 5 Sep 2004 16:58:01 +0000 (+0000) Subject: libi2ncommon: (tomj) new IP_RANGE::substract function + unit test X-Git-Tag: v2.6~233 X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=63f9b74577c51c2656fc20835bfd8d2f75d30a70;p=libi2ncommon libi2ncommon: (tomj) new IP_RANGE::substract function + unit test --- diff --git a/src/ipfunc.cpp b/src/ipfunc.cpp index 626f9e7..2d02e7d 100644 --- a/src/ipfunc.cpp +++ b/src/ipfunc.cpp @@ -277,6 +277,40 @@ vector IP_RANGE::to_cidr(void) const return cidrs; } +#include + +vector IP_RANGE::substract(const std::set &to_substract) const +{ + vector rtn; + + unsigned int ip_pos = turn_ip(ip), ip_end = turn_ip(end); + + set::const_iterator sub = to_substract.begin(), to_substract_end = to_substract.end(); + for (sub = to_substract.begin(); sub != to_substract_end; sub++) { + if (!sub->is_within(*this)) + throw runtime_error("IP_RANGE::substract error: "+ sub->to_string() + " is not within " + to_string()); + + // Get beginn of network/range/IP + unsigned int sub_begin = turn_ip(sub->get_base()); + + // Got a fragment? + if (ip_pos < sub_begin) + rtn.push_back(IP_RANGE(ip_type::RANGE, turn_ip(ip_pos), turn_ip(sub_begin-1))); + + // Set position to end if end is higher than current position + if (ip_pos < turn_ip(sub->get_broadcast())+1) + ip_pos = turn_ip(sub->get_broadcast())+1; + } + + // Last fragment + if (ip_pos == ip_end) + rtn.push_back(IP_RANGE(ip_type::IP, turn_ip(ip_pos))); + else if (ip_pos < ip_end) + rtn.push_back(IP_RANGE(ip_type::RANGE, turn_ip(ip_pos), turn_ip(ip_end))); + + return rtn; +} + unsigned int IP_RANGE::turn_ip(unsigned int src) { int dst; diff --git a/src/ipfunc.hxx b/src/ipfunc.hxx index 6f238aa..6e11b71 100644 --- a/src/ipfunc.hxx +++ b/src/ipfunc.hxx @@ -59,6 +59,9 @@ class IP_RANGE // returns the complete range in cidr blocks std::vector to_cidr(void) const; + // network<->IP subtraction + std::vector substract(const std::set &to_substract) const; + unsigned int get_mask_bits() const { return calc_netmask_bits(mask); } unsigned int get_broadcast() const diff --git a/test/ip_range.cpp b/test/ip_range.cpp index b018d72..cedd20b 100644 --- a/test/ip_range.cpp +++ b/test/ip_range.cpp @@ -101,7 +101,21 @@ class ip_range : public TestFixture CPPUNIT_TEST(Range2Cidr5); CPPUNIT_TEST(Range2Cidr6); CPPUNIT_TEST(Range2Cidr7); - + CPPUNIT_TEST(Substract1); + CPPUNIT_TEST(Substract2); + CPPUNIT_TEST(Substract3); + CPPUNIT_TEST(Substract4); + CPPUNIT_TEST(Substract5); + CPPUNIT_TEST(Substract6); + CPPUNIT_TEST(Substract7); + CPPUNIT_TEST(Substract8); + CPPUNIT_TEST(Substract9); + CPPUNIT_TEST(Substract10); + CPPUNIT_TEST(Substract11); + CPPUNIT_TEST(Substract12); + CPPUNIT_TEST(Substract13); + CPPUNIT_TEST(Substract14); + CPPUNIT_TEST_SUITE_END(); @@ -596,6 +610,214 @@ class ip_range : public TestFixture CPPUNIT_ASSERT_EQUAL(check_cidrs,cidrs); } + + void Substract1() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.3")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1-192.168.1.2"); + check_range.push_back("192.168.1.4-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract2() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.1")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.2-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract3() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.1")); + to_sub.insert(IP_RANGE("192.168.1.61")); + to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.60")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.2-192.168.1.49"); + check_range.push_back("192.168.1.62-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract4() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.100")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1-192.168.1.49"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract5() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.99")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1-192.168.1.49"); + check_range.push_back("192.168.1.100-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract6() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.2-192.168.1.100")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract7() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.100")); + to_sub.insert(IP_RANGE("192.168.1.50-192.168.1.61")); + to_sub.insert(IP_RANGE("192.168.1.61")); + to_sub.insert(IP_RANGE("192.168.1.62")); + to_sub.insert(IP_RANGE("192.168.1.63")); + + vector new_range = range.substract(to_sub); + + vector check_range; + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract8() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.10-192.168.1.20")); + to_sub.insert(IP_RANGE("192.168.1.11-192.168.1.30")); + to_sub.insert(IP_RANGE("192.168.1.1-192.168.1.3")); + to_sub.insert(IP_RANGE("192.168.1.8")); + to_sub.insert(IP_RANGE("192.168.1.9")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.4-192.168.1.7"); + check_range.push_back("192.168.1.31-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract9() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.9-192.168.1.15")); + to_sub.insert(IP_RANGE("192.168.1.10-192.168.1.20")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1-192.168.1.8"); + check_range.push_back("192.168.1.21-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract10() + { + IP_RANGE range("192.168.1.1-192.168.1.2"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.1")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.2"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract11() + { + IP_RANGE range("192.168.1.1-192.168.1.2"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.2")); + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract12() + { + IP_RANGE range("192.168.1.1"); + set to_sub; + to_sub.insert(IP_RANGE("192.168.1.1")); + + vector new_range = range.substract(to_sub); + + vector check_range; + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract13() + { + IP_RANGE range("192.168.1.1"); + + set to_sub; + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } + + void Substract14() + { + IP_RANGE range("192.168.1.1-192.168.1.100"); + set to_sub; + + vector new_range = range.substract(to_sub); + + vector check_range; + check_range.push_back("192.168.1.1-192.168.1.100"); + + CPPUNIT_ASSERT_EQUAL(check_range,new_range); + } }; CPPUNIT_TEST_SUITE_REGISTRATION(ip_range);