Coverage Report

Created: 2018-11-16 02:38

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/Support/LineIterator.h
Line
Count
Source
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
644
  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
459k
  bool is_at_eof() const { return !Buffer; }
51
52
  /// Return true if we're an "end" iterator or have reached EOF.
53
110k
  bool is_at_end() const { return is_at_eof(); }
54
55
  /// Return the current line number. May return any number at EOF.
56
354k
  int64_t line_number() const { return LineNumber; }
57
58
  /// Advance to the next (non-empty, non-comment) line.
59
452k
  line_iterator &operator++() {
60
452k
    advance();
61
452k
    return *this;
62
452k
  }
63
1.88k
  line_iterator operator++(int) {
64
1.88k
    line_iterator tmp(*this);
65
1.88k
    advance();
66
1.88k
    return tmp;
67
1.88k
  }
68
69
  /// Get the current line as a \c StringRef.
70
109k
  StringRef operator*() const { return CurrentLine; }
71
2.46k
  const StringRef *operator->() const { return &CurrentLine; }
72
73
2.76k
  friend bool operator==(const line_iterator &LHS, const line_iterator &RHS) {
74
2.76k
    return LHS.Buffer == RHS.Buffer &&
75
2.76k
           
LHS.CurrentLine.begin() == RHS.CurrentLine.begin()50
;
76
2.76k
  }
77
78
2.75k
  friend bool operator!=(const line_iterator &LHS, const line_iterator &RHS) {
79
2.75k
    return !(LHS == RHS);
80
2.75k
  }
81
82
private:
83
  /// Advance the iterator to the next line.
84
  void advance();
85
};
86
}
87
88
#endif