mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
ae65e281f3
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
88 lines
2.6 KiB
C++
88 lines
2.6 KiB
C++
//===- LineIterator.h - Iterator to read a text buffer's lines --*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_LINEITERATOR_H
|
|
#define LLVM_SUPPORT_LINEITERATOR_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/DataTypes.h"
|
|
#include <iterator>
|
|
|
|
namespace llvm {
|
|
|
|
class MemoryBuffer;
|
|
|
|
/// A forward iterator which reads text lines from a buffer.
|
|
///
|
|
/// This class provides a forward iterator interface for reading one line at
|
|
/// a time from a buffer. When default constructed the iterator will be the
|
|
/// "end" iterator.
|
|
///
|
|
/// The iterator is aware of what line number it is currently processing. It
|
|
/// strips blank lines by default, and comment lines given a comment-starting
|
|
/// character.
|
|
///
|
|
/// Note that this iterator requires the buffer to be nul terminated.
|
|
class line_iterator
|
|
: public std::iterator<std::forward_iterator_tag, StringRef> {
|
|
const MemoryBuffer *Buffer;
|
|
char CommentMarker;
|
|
bool SkipBlanks;
|
|
|
|
unsigned LineNumber;
|
|
StringRef CurrentLine;
|
|
|
|
public:
|
|
/// Default construct an "end" iterator.
|
|
line_iterator() : Buffer(nullptr) {}
|
|
|
|
/// Construct a new iterator around some memory buffer.
|
|
explicit line_iterator(const MemoryBuffer &Buffer, bool SkipBlanks = true,
|
|
char CommentMarker = '\0');
|
|
|
|
/// Return true if we've reached EOF or are an "end" iterator.
|
|
bool is_at_eof() const { return !Buffer; }
|
|
|
|
/// Return true if we're an "end" iterator or have reached EOF.
|
|
bool is_at_end() const { return is_at_eof(); }
|
|
|
|
/// Return the current line number. May return any number at EOF.
|
|
int64_t line_number() const { return LineNumber; }
|
|
|
|
/// Advance to the next (non-empty, non-comment) line.
|
|
line_iterator &operator++() {
|
|
advance();
|
|
return *this;
|
|
}
|
|
line_iterator operator++(int) {
|
|
line_iterator tmp(*this);
|
|
advance();
|
|
return tmp;
|
|
}
|
|
|
|
/// Get the current line as a \c StringRef.
|
|
StringRef operator*() const { return CurrentLine; }
|
|
const StringRef *operator->() const { return &CurrentLine; }
|
|
|
|
friend bool operator==(const line_iterator &LHS, const line_iterator &RHS) {
|
|
return LHS.Buffer == RHS.Buffer &&
|
|
LHS.CurrentLine.begin() == RHS.CurrentLine.begin();
|
|
}
|
|
|
|
friend bool operator!=(const line_iterator &LHS, const line_iterator &RHS) {
|
|
return !(LHS == RHS);
|
|
}
|
|
|
|
private:
|
|
/// Advance the iterator to the next line.
|
|
void advance();
|
|
};
|
|
}
|
|
|
|
#endif
|