本文整理汇总了C++中MutableArrayRef::back方法的典型用法代码示例。如果您正苦于以下问题:C++ MutableArrayRef::back方法的具体用法?C++ MutableArrayRef::back怎么用?C++ MutableArrayRef::back使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MutableArrayRef
的用法示例。
在下文中一共展示了MutableArrayRef::back方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
void
DependencyGraphImpl::markTransitive(SmallVectorImpl<const void *> &visited,
const void *node, MarkTracerImpl *tracer) {
assert(Provides.count(node) && "node is not in the graph");
llvm::SpecificBumpPtrAllocator<MarkTracerImpl::Entry> scratchAlloc;
struct WorklistEntry {
ArrayRef<MarkTracerImpl::Entry> Reason;
const void *Node;
bool IsCascading;
};
SmallVector<WorklistEntry, 16> worklist;
SmallPtrSet<const void *, 16> visitedSet;
auto addDependentsToWorklist = [&](const void *next,
ArrayRef<MarkTracerImpl::Entry> reason) {
auto allProvided = Provides.find(next);
if (allProvided == Provides.end())
return;
for (const auto &provided : allProvided->second) {
auto allDependents = Dependencies.find(provided.name);
if (allDependents == Dependencies.end())
continue;
if (allDependents->second.second.contains(provided.kindMask))
continue;
// Record that we've traversed this dependency.
allDependents->second.second |= provided.kindMask;
for (const auto &dependent : allDependents->second.first) {
if (dependent.node == next)
continue;
auto intersectingKinds = provided.kindMask & dependent.kindMask;
if (!intersectingKinds)
continue;
if (isMarked(dependent.node))
continue;
bool isCascading{dependent.flags & DependencyFlags::IsCascading};
MutableArrayRef<MarkTracerImpl::Entry> newReason;
if (tracer) {
tracer->countStatsForNodeMarking(intersectingKinds, isCascading);
newReason = {scratchAlloc.Allocate(reason.size()+1), reason.size()+1};
std::uninitialized_copy(reason.begin(), reason.end(),
newReason.begin());
new (&newReason.back()) MarkTracerImpl::Entry({next, provided.name,
intersectingKinds});
}
worklist.push_back({ newReason, dependent.node, isCascading });
}
}
};
auto record = [&](WorklistEntry next) {
if (!visitedSet.insert(next.Node).second)
return;
visited.push_back(next.Node);
if (tracer) {
auto &savedReason = tracer->Table[next.Node];
savedReason.clear();
savedReason.append(next.Reason.begin(), next.Reason.end());
}
};
// Always mark through the starting node, even if it's already marked.
markIntransitive(node);
addDependentsToWorklist(node, {});
while (!worklist.empty()) {
auto next = worklist.pop_back_val();
// Is this a non-cascading dependency?
if (!next.IsCascading) {
if (!isMarked(next.Node))
record(next);
continue;
}
addDependentsToWorklist(next.Node, next.Reason);
if (!markIntransitive(next.Node))
continue;
record(next);
}
}