131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy//===- llvm/unittest/Support/IntegersSubsetTest.cpp - IntegersSubset tests ===// 231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy// 331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy// The LLVM Compiler Infrastructure 431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy// 531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy// This file is distributed under the University of Illinois Open Source 631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy// License. See LICENSE.TXT for details. 731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy// 831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy//===----------------------------------------------------------------------===// 931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 1031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy#include "llvm/Support/IntegersSubset.h" 115a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/ADT/APInt.h" 1231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy#include "llvm/Support/IntegersSubsetMapping.h" 1331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy#include "gtest/gtest.h" 1431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy#include <vector> 1531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 1631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiyusing namespace llvm; 1731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 1831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiynamespace { 1931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 2031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy class Int : public APInt { 2131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy public: 22b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Int() {} 2331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Int(uint64_t V) : APInt(64, V) {} 2420cb4919cd01967b11b0b468fd43167b263ed028Stepan Dyatkovskiy Int(const APInt& Src) : APInt(Src) {} 2531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy bool operator < (const APInt& RHS) const { return ult(RHS); } 2631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy bool operator > (const APInt& RHS) const { return ugt(RHS); } 2731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy bool operator <= (const APInt& RHS) const { return ule(RHS); } 2831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy bool operator >= (const APInt& RHS) const { return uge(RHS); } 2931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy }; 3031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 3131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy typedef IntRange<Int> Range; 3231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy typedef IntegersSubsetGeneric<Int> Subset; 3331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy typedef IntegersSubsetMapping<unsigned,Subset,Int> Mapping; 3431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 3531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TEST(IntegersSubsetTest, GeneralTest) { 3631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 3731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test construction. 3831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 3931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy std::vector<Range> Ranges; 4031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.reserve(3); 4131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 4231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Initialize Subset as union of three pairs: 4331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // { {0, 8}, {10, 18}, {20, 28} } 4431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy for (unsigned i = 0; i < 3; ++i) 4531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(i*10), Int(i*10 + 8))); 4631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 4731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Subset TheSubset(Ranges); 4831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 4931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy for (unsigned i = 0; i < 3; ++i) { 5031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(TheSubset.getItem(i).getLow(), Int(i*10)); 5131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(TheSubset.getItem(i).getHigh(), Int(i*10 + 8)); 5231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy } 5331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 5431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(TheSubset.getNumItems(), 3ULL); 5531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 5631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test belonging to range. 5731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 5831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_TRUE(TheSubset.isSatisfies(Int(5))); 5931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_FALSE(TheSubset.isSatisfies(Int(9))); 6031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 6131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test when subset contains the only item. 6231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 6331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.clear(); 6431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(10), Int(10))); 6531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 6631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Subset TheSingleNumber(Ranges); 6731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 6831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_TRUE(TheSingleNumber.isSingleNumber()); 6931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 7031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(12), Int(15))); 7131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 7231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Subset NotASingleNumber(Ranges); 7331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 7431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_FALSE(NotASingleNumber.isSingleNumber()); 7531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 7631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test when subset contains items that are not a ranges but 7731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // the single numbers. 7831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 7931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.clear(); 8031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(10), Int(10))); 8131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(15), Int(19))); 8231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 8331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Subset WithSingleNumberItems(Ranges); 8431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 8531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_TRUE(WithSingleNumberItems.isSingleNumber(0)); 8631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_FALSE(WithSingleNumberItems.isSingleNumber(1)); 8731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 8831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test size of subset. Note subset itself may be not optimized (improper), 8931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // so it may contain duplicates, and the size of subset { {0, 9} {5, 9} } 9031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // will 15 instead of 10. 9131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 9231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.clear(); 9331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(0), Int(9))); 9431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(5), Int(9))); 9531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 9631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Subset NotOptimizedSubset(Ranges); 9731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 9831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(NotOptimizedSubset.getSize(), 15ULL); 9931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 10031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test access to a single value. 10131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // getSingleValue(idx) method represents subset as flat numbers collection, 10231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // so subset { {0, 3}, {8, 10} } will represented as array 10331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // { 0, 1, 2, 3, 8, 9, 10 }. 10431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 10531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.clear(); 10631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(0), Int(3))); 10731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Ranges.push_back(Range(Int(8), Int(10))); 10831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 10931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Subset OneMoreSubset(Ranges); 11031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 11131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(OneMoreSubset.getSingleValue(5), Int(9)); 11231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy } 11331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 11431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TEST(IntegersSubsetTest, MappingTest) { 11531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 11631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping::Cases TheCases; 11731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 11831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy unsigned Successors[3] = {0, 1, 2}; 11931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 12031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test construction. 12131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 12231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping TheMapping; 12331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy for (unsigned i = 0; i < 3; ++i) 12431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TheMapping.add(Int(10*i), Int(10*i + 9), Successors + i); 12531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TheMapping.add(Int(111), Int(222), Successors); 12631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TheMapping.removeItem(--TheMapping.end()); 12731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 12831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TheMapping.getCases(TheCases); 12931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 13031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(TheCases.size(), 3ULL); 13131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 13231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy for (unsigned i = 0; i < 3; ++i) { 13331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping::Cases::iterator CaseIt = TheCases.begin(); 13431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy std::advance(CaseIt, i); 13531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(CaseIt->first, Successors + i); 13631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(CaseIt->second.getNumItems(), 1ULL); 13731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(CaseIt->second.getItem(0), Range(Int(10*i), Int(10*i + 9))); 13831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy } 13931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 14031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test verification. 14131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 14231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping ImproperMapping; 14331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ImproperMapping.add(Int(10), Int(11), Successors + 0); 14431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ImproperMapping.add(Int(11), Int(12), Successors + 1); 14531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 14631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping::RangeIterator ErrItem; 14731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_FALSE(ImproperMapping.verify(ErrItem)); 14831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(ErrItem, --ImproperMapping.end()); 14931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 15031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping ProperMapping; 15131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ProperMapping.add(Int(10), Int(11), Successors + 0); 15231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ProperMapping.add(Int(12), Int(13), Successors + 1); 15331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 15431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_TRUE(ProperMapping.verify(ErrItem)); 15531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 15631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy // Test optimization. 15731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 15831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping ToBeOptimized; 15931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 16031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy for (unsigned i = 0; i < 3; ++i) { 16131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ToBeOptimized.add(Int(i * 10), Int(i * 10 + 1), Successors + i); 16231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ToBeOptimized.add(Int(i * 10 + 2), Int(i * 10 + 9), Successors + i); 16331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy } 16431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 16531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ToBeOptimized.optimize(); 16631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 16731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy TheCases.clear(); 16831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy ToBeOptimized.getCases(TheCases); 16931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 17031219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(TheCases.size(), 3ULL); 17131219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy 17231219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy for (unsigned i = 0; i < 3; ++i) { 17331219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy Mapping::Cases::iterator CaseIt = TheCases.begin(); 17431219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy std::advance(CaseIt, i); 17531219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(CaseIt->first, Successors + i); 17631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(CaseIt->second.getNumItems(), 1ULL); 17731219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy EXPECT_EQ(CaseIt->second.getItem(0), Range(Int(i * 10), Int(i * 10 + 9))); 17831219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy } 17931219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy } 180b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 181b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy typedef unsigned unsigned_pair[2]; 182b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy typedef unsigned_pair unsigned_ranges[]; 183b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 184b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy void TestDiff( 185b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy const unsigned_ranges LHS, 186b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned LSize, 187b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy const unsigned_ranges RHS, 188b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned RSize, 189b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy const unsigned_ranges ExcludeRes, 190b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned ExcludeResSize, 191b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy const unsigned_ranges IntersectRes, 192b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned IntersectResSize 193b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy ) { 194c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher 195b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Mapping::RangesCollection Ranges; 196b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 197b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Mapping LHSMapping; 198b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy for (unsigned i = 0; i < LSize; ++i) 199b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Ranges.push_back(Range(Int(LHS[i][0]), Int(LHS[i][1]))); 200c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher LHSMapping.add(Ranges); 201b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 202b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Ranges.clear(); 203b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 204b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Mapping RHSMapping; 205b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy for (unsigned i = 0; i < RSize; ++i) 206b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Ranges.push_back(Range(Int(RHS[i][0]), Int(RHS[i][1]))); 207c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher RHSMapping.add(Ranges); 208b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 209b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Mapping LExclude, Intersection; 210b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 211b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy LHSMapping.diff(&LExclude, &Intersection, 0, RHSMapping); 212b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 213b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy if (ExcludeResSize) { 214b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_EQ(LExclude.size(), ExcludeResSize); 215b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 216b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned i = 0; 217b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy for (Mapping::RangeIterator rei = LExclude.begin(), 218c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher e = LExclude.end(); rei != e; ++rei, ++i) 219b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_EQ(rei->first, Range(ExcludeRes[i][0], ExcludeRes[i][1])); 220b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } else 221b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_TRUE(LExclude.empty()); 222b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 223b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy if (IntersectResSize) { 224b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_EQ(Intersection.size(), IntersectResSize); 225b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 226b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned i = 0; 227b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy for (Mapping::RangeIterator ii = Intersection.begin(), 228c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher e = Intersection.end(); ii != e; ++ii, ++i) 229b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_EQ(ii->first, Range(IntersectRes[i][0], IntersectRes[i][1])); 230b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } else 231b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_TRUE(Intersection.empty()); 232b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 233b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy LExclude.clear(); 234b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy Intersection.clear(); 235b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy RHSMapping.diff(0, &Intersection, &LExclude, LHSMapping); 236b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 237b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy // Check LExclude again. 238b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy if (ExcludeResSize) { 239b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_EQ(LExclude.size(), ExcludeResSize); 240b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 241b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned i = 0; 242c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher for (Mapping::RangeIterator rei = LExclude.begin(), 243c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher e = LExclude.end(); rei != e; ++rei, ++i) 244c723eb1aef817d47feec620933ee1ec6005cdd14Eric Christopher EXPECT_EQ(rei->first, Range(ExcludeRes[i][0], ExcludeRes[i][1])); 245b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } else 246b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy EXPECT_TRUE(LExclude.empty()); 247b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 248b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 249b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TEST(IntegersSubsetTest, DiffTest) { 2500e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy 2510e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy static const unsigned NOT_A_NUMBER = 0xffff; 2520e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy 253b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 254b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 0, 4 }, { 7, 10 }, { 13, 17 } }; 255b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 3, 14 } }; 256b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges ExcludeRes = { { 0, 2 }, { 15, 17 } }; 257b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges IntersectRes = { { 3, 4 }, { 7, 10 }, { 13, 14 } }; 258b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 259b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 3, RHS, 1, ExcludeRes, 2, IntersectRes, 3); 260b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 261b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 262b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 263b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 0, 4 }, { 7, 10 }, { 13, 17 } }; 264b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 0, 4 }, { 13, 17 } }; 265b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges ExcludeRes = { { 7, 10 } }; 266b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges IntersectRes = { { 0, 4 }, { 13, 17 } }; 267b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 268b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 3, RHS, 2, ExcludeRes, 1, IntersectRes, 2); 269b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 270b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 271b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 272b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 0, 17 } }; 273b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 1, 5 }, { 10, 12 }, { 15, 16 } }; 274b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges ExcludeRes = 275b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { { 0, 0 }, { 6, 9 }, { 13, 14 }, { 17, 17 } }; 276b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges IntersectRes = { { 1, 5 }, { 10, 12 }, { 15, 16 } }; 277b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 278b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 1, RHS, 3, ExcludeRes, 4, IntersectRes, 3); 279b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 280b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 281b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 282b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 2, 4 } }; 283b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 0, 5 } }; 2840e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy unsigned_ranges ExcludeRes = { {NOT_A_NUMBER, NOT_A_NUMBER} }; 285b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges IntersectRes = { { 2, 4 } }; 286b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 287b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 1, RHS, 1, ExcludeRes, 0, IntersectRes, 1); 288b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 289b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 290b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 291b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 2, 4 } }; 292b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 7, 8 } }; 293b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges ExcludeRes = { { 2, 4 } }; 2940e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy unsigned_ranges IntersectRes = { {NOT_A_NUMBER, NOT_A_NUMBER} }; 295b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 296b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 1, RHS, 1, ExcludeRes, 1, IntersectRes, 0); 297b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 298b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 299b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 300b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 3, 7 } }; 301b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 1, 4 } }; 302b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges ExcludeRes = { { 5, 7 } }; 303b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges IntersectRes = { { 3, 4 } }; 304b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 305b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 1, RHS, 1, ExcludeRes, 1, IntersectRes, 1); 306b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 307b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 308b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 309b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 0, 7 } }; 310b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 0, 5 }, { 6, 9 } }; 3110e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy unsigned_ranges ExcludeRes = { {NOT_A_NUMBER, NOT_A_NUMBER} }; 312b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges IntersectRes = { { 0, 5 }, {6, 7} }; 313b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 314b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 1, RHS, 2, ExcludeRes, 0, IntersectRes, 2); 315b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 316b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 317b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy { 318b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges LHS = { { 17, 17 } }; 319b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges RHS = { { 4, 4 } }; 320b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy unsigned_ranges ExcludeRes = { {17, 17} }; 3210e20eb496ef65988023ab439259010cac82cd1caStepan Dyatkovskiy unsigned_ranges IntersectRes = { { NOT_A_NUMBER, NOT_A_NUMBER } }; 322b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy 323b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy TestDiff(LHS, 1, RHS, 1, ExcludeRes, 1, IntersectRes, 0); 324b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 325b787d41959163f6104af7b34a5ce719210dfb72fStepan Dyatkovskiy } 32631219d2cec17dca632b6d047a15e86dc92b76e18Stepan Dyatkovskiy} 327