void
test()
{
    int i[3] = {1, 2, 3};
    int j[3] = {4, 5, 6};
    Range2 r = std::swap_ranges(Range1(std::make_iter_range(i, i+3)), Range2(std::make_single_iter_range(j)));
    assert(base(r).base() == j+3);
    assert(i[0] == 4);
    assert(i[1] == 5);
    assert(i[2] == 6);
    assert(j[0] == 1);
    assert(j[1] == 2);
    assert(j[2] == 3);
}
void
test()
{
    int ia[] = {0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 0, 1, 2, 3, 0, 1, 2, 0, 1, 0};
    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    int b[] = {0};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(b, b+1))) == Range1(std::make_iter_range(ia+sa-1, ia+sa)));
    int c[] = {0, 1};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(c, c+2))) == Range1(std::make_iter_range(ia+18, ia+sa)));
    int d[] = {0, 1, 2};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(d, d+3))) == Range1(std::make_iter_range(ia+15, ia+sa)));
    int e[] = {0, 1, 2, 3};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(e, e+4))) == Range1(std::make_iter_range(ia+11, ia+sa)));
    int f[] = {0, 1, 2, 3, 4};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(f, f+5))) == Range1(std::make_iter_range(ia+6, ia+sa)));
    int g[] = {0, 1, 2, 3, 4, 5};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(g, g+6))) == Range1(std::make_iter_range(ia, ia+sa)));
    int h[] = {0, 1, 2, 3, 4, 5, 6};
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(h, h+7))) == Range1(std::make_iter_range(ia+sa, ia+sa)));
    assert(std::find_end(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(b, b))) == Range1(std::make_iter_range(ia+sa, ia+sa)));
    assert(std::find_end(Range1(std::make_iter_range(ia, ia)), Range2(std::make_iter_range(b, b+1))) == Range1(std::make_iter_range(ia, ia)));
}
void
test1()
{
    std::unique_ptr<int> i[3];
    for (int k = 0; k < 3; ++k)
        i[k].reset(new int(k+1));
    std::unique_ptr<int> j[3];
    for (int k = 0; k < 3; ++k)
        j[k].reset(new int(k+4));
    Range2 r = std::swap_ranges(Range1(std::make_iter_range(i, i+3)), Range2(std::make_single_iter_range(j)));
    assert(base(r).base() == j+3);
    assert(*i[0] == 4);
    assert(*i[1] == 5);
    assert(*i[2] == 6);
    assert(*j[0] == 1);
    assert(*j[1] == 2);
    assert(*j[2] == 3);
}
void
test()
{
    int ia[] = {1, 2, 3, 4};
    const unsigned sa = sizeof(ia)/sizeof(ia[0]);
    int ib[] = {1, 2, 3};
    assert(!std::lexicographical_compare(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(ib, ib+2))));
    assert(std::lexicographical_compare(Range1(std::make_iter_range(ib, ib+2)), Range2(std::make_iter_range(ia, ia+sa))));
    assert(!std::lexicographical_compare(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(ib, ib+3))));
    assert(std::lexicographical_compare(Range1(std::make_iter_range(ib, ib+3)), Range2(std::make_iter_range(ia, ia+sa))));
    assert(std::lexicographical_compare(Range1(std::make_iter_range(ia, ia+sa)), Range2(std::make_iter_range(ib+1, ib+3))));
    assert(!std::lexicographical_compare(Range1(std::make_iter_range(ib+1, ib+3)), Range2(std::make_iter_range(ia, ia+sa))));
}
static bool hasDisjointValueRange(const EnumDecl *Enum1,
                                  const EnumDecl *Enum2) {
  ValueRange Range1(Enum1), Range2(Enum2);
  return llvm::APSInt::compareValues(Range1.MaxVal, Range2.MinVal) < 0 ||
         llvm::APSInt::compareValues(Range2.MaxVal, Range1.MinVal) < 0;
}