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.
|
||||
template <class BaseT, class ValueT>
|
||||
class basic_collection_iterator
|
||||
: public std::iterator<std::forward_iterator_tag, ValueT> {
|
||||
: public std::iterator<std::input_iterator_tag, ValueT> {
|
||||
public:
|
||||
basic_collection_iterator() : Base(nullptr) {}
|
||||
basic_collection_iterator(BaseT *B) : Base(B) {}
|
||||
@ -326,11 +326,24 @@ public:
|
||||
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 {
|
||||
if (Base != Other.Base)
|
||||
return true;
|
||||
return (Base && Other.Base) &&
|
||||
Base->CurrentEntry != Other.Base->CurrentEntry;
|
||||
return !(Base == Other.Base);
|
||||
}
|
||||
|
||||
basic_collection_iterator &operator++() {
|
||||
|
@ -260,4 +260,76 @@ TEST(YAMLParser, DiagnosticFilenameFromBufferID) {
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user