mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Add != to YAMLParser's basic_collection_iterator.
...and mark it as merely an input_iterator rather than a forward_iterator, since it is destructive. And then rewrite == to take advantage of that. Patch by Alex Denisov! llvm-svn: 256913
This commit is contained in:
parent
6385f16575
commit
cfdd350538
@ -305,7 +305,7 @@ private:
|
|||||||
/// increment() which must set CurrentEntry to 0 to create an end iterator.
|
/// increment() which must set CurrentEntry to 0 to create an end iterator.
|
||||||
template <class BaseT, class ValueT>
|
template <class BaseT, class ValueT>
|
||||||
class basic_collection_iterator
|
class basic_collection_iterator
|
||||||
: public std::iterator<std::forward_iterator_tag, ValueT> {
|
: public std::iterator<std::input_iterator_tag, ValueT> {
|
||||||
public:
|
public:
|
||||||
basic_collection_iterator() : Base(nullptr) {}
|
basic_collection_iterator() : Base(nullptr) {}
|
||||||
basic_collection_iterator(BaseT *B) : Base(B) {}
|
basic_collection_iterator(BaseT *B) : Base(B) {}
|
||||||
@ -326,11 +326,24 @@ public:
|
|||||||
return Base->CurrentEntry;
|
return Base->CurrentEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Note on EqualityComparable:
|
||||||
|
///
|
||||||
|
/// The iterator is not re-entrant,
|
||||||
|
/// it is meant to be used for parsing YAML on-demand
|
||||||
|
/// Once iteration started - it can point only to one entry at a time
|
||||||
|
/// hence Base.CurrentEntry and Other.Base.CurrentEntry are equal
|
||||||
|
/// iff Base and Other.Base are equal.
|
||||||
|
bool operator==(const basic_collection_iterator &Other) const {
|
||||||
|
if (Base && (Base == Other.Base)) {
|
||||||
|
assert((Base->CurrentEntry == Other.Base->CurrentEntry)
|
||||||
|
&& "Equal Bases expected to point to equal Entries");
|
||||||
|
}
|
||||||
|
|
||||||
|
return Base == Other.Base;
|
||||||
|
}
|
||||||
|
|
||||||
bool operator!=(const basic_collection_iterator &Other) const {
|
bool operator!=(const basic_collection_iterator &Other) const {
|
||||||
if (Base != Other.Base)
|
return !(Base == Other.Base);
|
||||||
return true;
|
|
||||||
return (Base && Other.Base) &&
|
|
||||||
Base->CurrentEntry != Other.Base->CurrentEntry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
basic_collection_iterator &operator++() {
|
basic_collection_iterator &operator++() {
|
||||||
|
@ -260,4 +260,76 @@ TEST(YAMLParser, DiagnosticFilenameFromBufferID) {
|
|||||||
EXPECT_EQ("buffername.yaml", GeneratedDiag.getFilename());
|
EXPECT_EQ("buffername.yaml", GeneratedDiag.getFilename());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(YAMLParser, SameNodeIteratorOperatorNotEquals) {
|
||||||
|
SourceMgr SM;
|
||||||
|
yaml::Stream Stream("[\"1\", \"2\"]", SM);
|
||||||
|
|
||||||
|
yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
|
||||||
|
Stream.begin()->getRoot());
|
||||||
|
|
||||||
|
auto Begin = Node->begin();
|
||||||
|
auto End = Node->end();
|
||||||
|
|
||||||
|
EXPECT_TRUE(Begin != End);
|
||||||
|
EXPECT_FALSE(Begin != Begin);
|
||||||
|
EXPECT_FALSE(End != End);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(YAMLParser, SameNodeIteratorOperatorEquals) {
|
||||||
|
SourceMgr SM;
|
||||||
|
yaml::Stream Stream("[\"1\", \"2\"]", SM);
|
||||||
|
|
||||||
|
yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
|
||||||
|
Stream.begin()->getRoot());
|
||||||
|
|
||||||
|
auto Begin = Node->begin();
|
||||||
|
auto End = Node->end();
|
||||||
|
|
||||||
|
EXPECT_FALSE(Begin == End);
|
||||||
|
EXPECT_TRUE(Begin == Begin);
|
||||||
|
EXPECT_TRUE(End == End);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(YAMLParser, DifferentNodesIteratorOperatorNotEquals) {
|
||||||
|
SourceMgr SM;
|
||||||
|
yaml::Stream Stream("[\"1\", \"2\"]", SM);
|
||||||
|
yaml::Stream AnotherStream("[\"1\", \"2\"]", SM);
|
||||||
|
|
||||||
|
yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
|
||||||
|
Stream.begin()->getRoot());
|
||||||
|
yaml::SequenceNode *AnotherNode = dyn_cast<yaml::SequenceNode>(
|
||||||
|
AnotherStream.begin()->getRoot());
|
||||||
|
|
||||||
|
auto Begin = Node->begin();
|
||||||
|
auto End = Node->end();
|
||||||
|
|
||||||
|
auto AnotherBegin = AnotherNode->begin();
|
||||||
|
auto AnotherEnd = AnotherNode->end();
|
||||||
|
|
||||||
|
EXPECT_TRUE(Begin != AnotherBegin);
|
||||||
|
EXPECT_TRUE(Begin != AnotherEnd);
|
||||||
|
EXPECT_FALSE(End != AnotherEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(YAMLParser, DifferentNodesIteratorOperatorEquals) {
|
||||||
|
SourceMgr SM;
|
||||||
|
yaml::Stream Stream("[\"1\", \"2\"]", SM);
|
||||||
|
yaml::Stream AnotherStream("[\"1\", \"2\"]", SM);
|
||||||
|
|
||||||
|
yaml::SequenceNode *Node = dyn_cast<yaml::SequenceNode>(
|
||||||
|
Stream.begin()->getRoot());
|
||||||
|
yaml::SequenceNode *AnotherNode = dyn_cast<yaml::SequenceNode>(
|
||||||
|
AnotherStream.begin()->getRoot());
|
||||||
|
|
||||||
|
auto Begin = Node->begin();
|
||||||
|
auto End = Node->end();
|
||||||
|
|
||||||
|
auto AnotherBegin = AnotherNode->begin();
|
||||||
|
auto AnotherEnd = AnotherNode->end();
|
||||||
|
|
||||||
|
EXPECT_FALSE(Begin == AnotherBegin);
|
||||||
|
EXPECT_FALSE(Begin == AnotherEnd);
|
||||||
|
EXPECT_TRUE(End == AnotherEnd);
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace llvm
|
} // end namespace llvm
|
||||||
|
Loading…
Reference in New Issue
Block a user