Line data Source code
1 : //===- LineIterator.h - Iterator to read a text buffer's lines --*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 :
10 : #ifndef LLVM_SUPPORT_LINEITERATOR_H
11 : #define LLVM_SUPPORT_LINEITERATOR_H
12 :
13 : #include "llvm/ADT/StringRef.h"
14 : #include "llvm/Support/DataTypes.h"
15 : #include <iterator>
16 :
17 : namespace llvm {
18 :
19 : class MemoryBuffer;
20 :
21 : /// A forward iterator which reads text lines from a buffer.
22 : ///
23 : /// This class provides a forward iterator interface for reading one line at
24 : /// a time from a buffer. When default constructed the iterator will be the
25 : /// "end" iterator.
26 : ///
27 : /// The iterator is aware of what line number it is currently processing. It
28 : /// strips blank lines by default, and comment lines given a comment-starting
29 : /// character.
30 : ///
31 : /// Note that this iterator requires the buffer to be nul terminated.
32 : class line_iterator
33 : : public std::iterator<std::forward_iterator_tag, StringRef> {
34 : const MemoryBuffer *Buffer;
35 : char CommentMarker;
36 : bool SkipBlanks;
37 :
38 : unsigned LineNumber;
39 : StringRef CurrentLine;
40 :
41 : public:
42 : /// Default construct an "end" iterator.
43 14 : line_iterator() : Buffer(nullptr) {}
44 :
45 : /// Construct a new iterator around some memory buffer.
46 : explicit line_iterator(const MemoryBuffer &Buffer, bool SkipBlanks = true,
47 : char CommentMarker = '\0');
48 :
49 : /// Return true if we've reached EOF or are an "end" iterator.
50 10 : bool is_at_eof() const { return !Buffer; }
51 :
52 : /// Return true if we're an "end" iterator or have reached EOF.
53 107938 : bool is_at_end() const { return is_at_eof(); }
54 :
55 : /// Return the current line number. May return any number at EOF.
56 347261 : int64_t line_number() const { return LineNumber; }
57 :
58 : /// Advance to the next (non-empty, non-comment) line.
59 : line_iterator &operator++() {
60 449884 : advance();
61 : return *this;
62 : }
63 0 : line_iterator operator++(int) {
64 1694 : line_iterator tmp(*this);
65 1876 : advance();
66 0 : return tmp;
67 : }
68 :
69 : /// Get the current line as a \c StringRef.
70 0 : StringRef operator*() const { return CurrentLine; }
71 90 : const StringRef *operator->() const { return &CurrentLine; }
72 :
73 : friend bool operator==(const line_iterator &LHS, const line_iterator &RHS) {
74 2765 : return LHS.Buffer == RHS.Buffer &&
75 51 : LHS.CurrentLine.begin() == RHS.CurrentLine.begin();
76 : }
77 :
78 : friend bool operator!=(const line_iterator &LHS, const line_iterator &RHS) {
79 : return !(LHS == RHS);
80 : }
81 :
82 : private:
83 : /// Advance the iterator to the next line.
84 : void advance();
85 : };
86 : }
87 :
88 : #endif
|