mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	This is an iterator which you can build around a MemoryBuffer. It will iterate through the non-empty, non-comment lines of the buffer as a forward iterator. It should be small and reasonably fast (although it could be made much faster if anyone cares, I don't really...). This will be used to more simply support the text-based sample profile file format, and is largely based on the original patch by Diego. I've re-worked the style of it and separated it from the work of producing a MemoryBuffer from a file which both simplifies the interface and makes it easier to test. The style of the API follows the C++ standard naming conventions to fit in better with iterators in general, much like the Path and FileSystem interfaces follow standard-based naming conventions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198068 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- LineIterator.cpp - Unit tests --------------------------------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/Support/LineIterator.h"
 | |
| #include "llvm/ADT/OwningPtr.h"
 | |
| #include "llvm/Support/MemoryBuffer.h"
 | |
| #include "gtest/gtest.h"
 | |
| 
 | |
| using namespace llvm;
 | |
| using namespace llvm::sys;
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| TEST(LineIteratorTest, Basic) {
 | |
|   OwningPtr<MemoryBuffer> Buffer(MemoryBuffer::getMemBuffer("line 1\n"
 | |
|                                                             "line 2\n"
 | |
|                                                             "line 3"));
 | |
| 
 | |
|   line_iterator I = line_iterator(*Buffer), E;
 | |
| 
 | |
|   EXPECT_FALSE(I.is_at_eof());
 | |
|   EXPECT_NE(E, I);
 | |
| 
 | |
|   EXPECT_EQ("line 1", *I);
 | |
|   EXPECT_EQ(1, I.line_number());
 | |
|   ++I;
 | |
|   EXPECT_EQ("line 2", *I);
 | |
|   EXPECT_EQ(2, I.line_number());
 | |
|   ++I;
 | |
|   EXPECT_EQ("line 3", *I);
 | |
|   EXPECT_EQ(3, I.line_number());
 | |
|   ++I;
 | |
| 
 | |
|   EXPECT_TRUE(I.is_at_eof());
 | |
|   EXPECT_EQ(E, I);
 | |
| }
 | |
| 
 | |
| TEST(LineIteratorTest, CommentSkipping) {
 | |
|   OwningPtr<MemoryBuffer> Buffer(MemoryBuffer::getMemBuffer("line 1\n"
 | |
|                                                             "line 2\n"
 | |
|                                                             "# Comment 1\n"
 | |
|                                                             "line 4\n"
 | |
|                                                             "# Comment 2"));
 | |
| 
 | |
|   line_iterator I = line_iterator(*Buffer, '#'), E;
 | |
| 
 | |
|   EXPECT_FALSE(I.is_at_eof());
 | |
|   EXPECT_NE(E, I);
 | |
| 
 | |
|   EXPECT_EQ("line 1", *I);
 | |
|   EXPECT_EQ(1, I.line_number());
 | |
|   ++I;
 | |
|   EXPECT_EQ("line 2", *I);
 | |
|   EXPECT_EQ(2, I.line_number());
 | |
|   ++I;
 | |
|   EXPECT_EQ("line 4", *I);
 | |
|   EXPECT_EQ(4, I.line_number());
 | |
|   ++I;
 | |
| 
 | |
|   EXPECT_TRUE(I.is_at_eof());
 | |
|   EXPECT_EQ(E, I);
 | |
| }
 | |
| 
 | |
| TEST(LineIteratorTest, BlankSkipping) {
 | |
|   OwningPtr<MemoryBuffer> Buffer(MemoryBuffer::getMemBuffer("\n\n\n"
 | |
|                                                             "line 1\n"
 | |
|                                                             "\n\n\n"
 | |
|                                                             "line 2\n"
 | |
|                                                             "\n\n\n"));
 | |
| 
 | |
|   line_iterator I = line_iterator(*Buffer), E;
 | |
| 
 | |
|   EXPECT_FALSE(I.is_at_eof());
 | |
|   EXPECT_NE(E, I);
 | |
| 
 | |
|   EXPECT_EQ("line 1", *I);
 | |
|   EXPECT_EQ(4, I.line_number());
 | |
|   ++I;
 | |
|   EXPECT_EQ("line 2", *I);
 | |
|   EXPECT_EQ(8, I.line_number());
 | |
|   ++I;
 | |
| 
 | |
|   EXPECT_TRUE(I.is_at_eof());
 | |
|   EXPECT_EQ(E, I);
 | |
| }
 | |
| 
 | |
| TEST(LineIteratorTest, EmptyBuffers) {
 | |
|   OwningPtr<MemoryBuffer> Buffer(MemoryBuffer::getMemBuffer(""));
 | |
|   EXPECT_TRUE(line_iterator(*Buffer).is_at_eof());
 | |
|   EXPECT_EQ(line_iterator(), line_iterator(*Buffer));
 | |
| 
 | |
|   Buffer.reset(MemoryBuffer::getMemBuffer("\n\n\n"));
 | |
|   EXPECT_TRUE(line_iterator(*Buffer).is_at_eof());
 | |
|   EXPECT_EQ(line_iterator(), line_iterator(*Buffer));
 | |
| 
 | |
|   Buffer.reset(MemoryBuffer::getMemBuffer("# foo\n"
 | |
|                                           "\n"
 | |
|                                           "# bar"));
 | |
|   EXPECT_TRUE(line_iterator(*Buffer, '#').is_at_eof());
 | |
|   EXPECT_EQ(line_iterator(), line_iterator(*Buffer, '#'));
 | |
| 
 | |
|   Buffer.reset(MemoryBuffer::getMemBuffer("\n"
 | |
|                                           "# baz\n"
 | |
|                                           "\n"));
 | |
|   EXPECT_TRUE(line_iterator(*Buffer, '#').is_at_eof());
 | |
|   EXPECT_EQ(line_iterator(), line_iterator(*Buffer, '#'));
 | |
| }
 | |
| 
 | |
| } // anonymous namespace
 |