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