mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[STLExtras] Add size() for ranges, and remove distance()
r332057 introduced distance() for ranges. Based on post-commit feedback, this renames distance() to size(). The new size() is also only enabled when the operation is O(1). Differential Revision: https://reviews.llvm.org/D46976 llvm-svn: 332551
This commit is contained in:
parent
f61cc3256e
commit
d0e6c4ab8b
@ -1026,9 +1026,14 @@ void erase_if(Container &C, UnaryPredicate P) {
|
||||
C.erase(remove_if(C, P), C.end());
|
||||
}
|
||||
|
||||
/// Wrapper function around std::distance which works with ranges.
|
||||
/// Get the size of a range. This is a wrapper function around std::distance
|
||||
/// which is only enabled when the operation is O(1).
|
||||
template <typename R>
|
||||
auto distance(R &&Range)
|
||||
auto size(R &&Range, typename std::enable_if<
|
||||
std::is_same<typename std::iterator_traits<decltype(
|
||||
Range.begin())>::iterator_category,
|
||||
std::random_access_iterator_tag>::value,
|
||||
void>::type * = nullptr)
|
||||
-> decltype(std::distance(Range.begin(), Range.end())) {
|
||||
return std::distance(Range.begin(), Range.end());
|
||||
}
|
||||
|
@ -1273,7 +1273,7 @@ LazyCallGraph::RefSCC::removeInternalRefEdge(Node &SourceN,
|
||||
// the removal hasn't changed the structure at all. This is an important
|
||||
// special case and we can directly exit the entire routine more
|
||||
// efficiently as soon as we discover it.
|
||||
if (distance(RefSCCNodes) == NumRefSCCNodes) {
|
||||
if (llvm::size(RefSCCNodes) == NumRefSCCNodes) {
|
||||
// Clear out the low link field as we won't need it.
|
||||
for (Node *N : RefSCCNodes)
|
||||
N->LowLink = -1;
|
||||
@ -1739,7 +1739,7 @@ static void printNode(raw_ostream &OS, LazyCallGraph::Node &N) {
|
||||
}
|
||||
|
||||
static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &C) {
|
||||
ptrdiff_t Size = distance(C);
|
||||
ptrdiff_t Size = size(C);
|
||||
OS << " SCC with " << Size << " functions:\n";
|
||||
|
||||
for (LazyCallGraph::Node &N : C)
|
||||
@ -1747,7 +1747,7 @@ static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &C) {
|
||||
}
|
||||
|
||||
static void printRefSCC(raw_ostream &OS, LazyCallGraph::RefSCC &C) {
|
||||
ptrdiff_t Size = distance(C);
|
||||
ptrdiff_t Size = size(C);
|
||||
OS << " RefSCC with " << Size << " call SCCs:\n";
|
||||
|
||||
for (LazyCallGraph::SCC &InnerC : C)
|
||||
|
@ -597,7 +597,7 @@ MachineInstr *ImplicitNullChecks::insertFaultingInstr(
|
||||
unsigned DefReg = NoRegister;
|
||||
if (NumDefs != 0) {
|
||||
DefReg = MI->defs().begin()->getReg();
|
||||
assert(distance(MI->defs()) == 1 && "expected exactly one def!");
|
||||
assert(NumDefs == 1 && "expected exactly one def!");
|
||||
}
|
||||
|
||||
FaultMaps::FaultKind FK;
|
||||
|
@ -167,7 +167,9 @@ bool Value::isUsedInBasicBlock(const BasicBlock *BB) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned Value::getNumUses() const { return (unsigned)distance(uses()); }
|
||||
unsigned Value::getNumUses() const {
|
||||
return (unsigned)std::distance(use_begin(), use_end());
|
||||
}
|
||||
|
||||
static bool getSymTab(Value *V, ValueSymbolTable *&ST) {
|
||||
ST = nullptr;
|
||||
|
@ -578,7 +578,7 @@ private:
|
||||
|
||||
// Returns true when the values are flowing out to each edge.
|
||||
bool valueAnticipable(CHIArgs C, TerminatorInst *TI) const {
|
||||
if (TI->getNumSuccessors() > (unsigned)distance(C))
|
||||
if (TI->getNumSuccessors() > (unsigned)size(C))
|
||||
return false; // Not enough args in this CHI.
|
||||
|
||||
for (auto CHI : C) {
|
||||
|
@ -285,7 +285,8 @@ bool MergedLoadStoreMotion::mergeStores(BasicBlock *T) {
|
||||
return false; // No. More than 2 predecessors.
|
||||
|
||||
// #Instructions in Succ1 for Compile Time Control
|
||||
int Size1 = distance(Pred1->instructionsWithoutDebug());
|
||||
auto InstsNoDbg = Pred1->instructionsWithoutDebug();
|
||||
int Size1 = std::distance(InstsNoDbg.begin(), InstsNoDbg.end());
|
||||
int NStores = 0;
|
||||
|
||||
for (BasicBlock::reverse_iterator RBI = Pred0->rbegin(), RBE = Pred0->rend();
|
||||
|
@ -369,8 +369,8 @@ TEST(RangeTest, Distance) {
|
||||
std::vector<int> v1;
|
||||
std::vector<int> v2{1, 2, 3};
|
||||
|
||||
EXPECT_EQ(std::distance(v1.begin(), v1.end()), distance(v1));
|
||||
EXPECT_EQ(std::distance(v2.begin(), v2.end()), distance(v2));
|
||||
EXPECT_EQ(std::distance(v1.begin(), v1.end()), size(v1));
|
||||
EXPECT_EQ(std::distance(v2.begin(), v2.end()), size(v2));
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
@ -73,9 +73,9 @@ TEST(BasicBlockTest, PhiRange) {
|
||||
auto isPhi = [](Instruction &I) { return isa<PHINode>(&I); };
|
||||
auto Phis = make_filter_range(*BB, isPhi);
|
||||
auto ReversedPhis = reverse(make_filter_range(*BB, isPhi));
|
||||
EXPECT_EQ(distance(Phis), 3);
|
||||
EXPECT_EQ(std::distance(Phis.begin(), Phis.end()), 3);
|
||||
EXPECT_EQ(&*Phis.begin(), P1);
|
||||
EXPECT_EQ(distance(ReversedPhis), 3);
|
||||
EXPECT_EQ(std::distance(ReversedPhis.begin(), ReversedPhis.end()), 3);
|
||||
EXPECT_EQ(&*ReversedPhis.begin(), P3);
|
||||
|
||||
// And iterate a const range.
|
||||
@ -87,7 +87,8 @@ TEST(BasicBlockTest, PhiRange) {
|
||||
}
|
||||
|
||||
#define CHECK_ITERATORS(Range1, Range2) \
|
||||
EXPECT_EQ(distance(Range1), distance(Range2)); \
|
||||
EXPECT_EQ(std::distance(Range1.begin(), Range1.end()), \
|
||||
std::distance(Range2.begin(), Range2.end())); \
|
||||
for (auto Pair : zip(Range1, Range2)) \
|
||||
EXPECT_EQ(&std::get<0>(Pair), std::get<1>(Pair));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user