2018-01-30 20:54:19 +01:00
|
|
|
#ifndef FORTRAN_POSITION_H_
|
|
|
|
#define FORTRAN_POSITION_H_
|
|
|
|
|
|
|
|
// Represents a position in a source file.
|
|
|
|
// TODO: Support multiple source files for inclusion and support contextual
|
|
|
|
// positions for macro expansions.
|
|
|
|
|
|
|
|
#include <ostream>
|
|
|
|
|
|
|
|
namespace Fortran {
|
|
|
|
|
|
|
|
class Position {
|
2018-02-05 21:54:36 +01:00
|
|
|
public:
|
2018-02-01 21:08:02 +01:00
|
|
|
constexpr Position() {}
|
|
|
|
constexpr Position(const Position &) = default;
|
|
|
|
constexpr Position(Position &&) = default;
|
|
|
|
constexpr Position(int ln, int col) : lineNumber_{ln}, column_{col} {}
|
|
|
|
constexpr Position &operator=(const Position &) = default;
|
|
|
|
constexpr Position &operator=(Position &&) = default;
|
2018-01-30 20:54:19 +01:00
|
|
|
|
|
|
|
constexpr int lineNumber() const { return lineNumber_; }
|
|
|
|
constexpr int column() const { return column_; }
|
2018-02-05 23:29:26 +01:00
|
|
|
Position &set_lineNumber(int line) {
|
|
|
|
lineNumber_ = line;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
Position &set_column(int column) {
|
|
|
|
column_ = column;
|
|
|
|
return *this;
|
|
|
|
}
|
2018-01-30 20:54:19 +01:00
|
|
|
|
|
|
|
constexpr bool operator<(const Position &that) const {
|
|
|
|
return lineNumber_ < that.lineNumber_ ||
|
2018-02-05 23:29:26 +01:00
|
|
|
(lineNumber_ == that.lineNumber_ && column_ < that.column_);
|
2018-01-30 20:54:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
constexpr bool operator<=(const Position &that) const {
|
|
|
|
return lineNumber_ < that.lineNumber_ ||
|
2018-02-05 23:29:26 +01:00
|
|
|
(lineNumber_ == that.lineNumber_ && column_ <= that.column_);
|
2018-01-30 20:54:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
constexpr bool operator==(const Position &that) const {
|
2018-02-05 23:29:26 +01:00
|
|
|
return lineNumber_ == that.lineNumber_ && column_ == that.column_;
|
2018-01-30 20:54:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
constexpr bool operator!=(const Position &that) const {
|
|
|
|
return !operator==(that);
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr bool operator>(const Position &that) const {
|
|
|
|
return !operator<=(that);
|
|
|
|
}
|
|
|
|
|
|
|
|
constexpr bool operator>=(const Position &that) const {
|
|
|
|
return !operator<(that);
|
|
|
|
}
|
|
|
|
|
2018-02-05 23:29:26 +01:00
|
|
|
void AdvanceColumn() { ++column_; }
|
2018-01-30 20:54:19 +01:00
|
|
|
|
2018-02-05 23:29:26 +01:00
|
|
|
void TabAdvanceColumn() { column_ = ((column_ + 7) & -8) + 1; }
|
2018-01-30 20:54:19 +01:00
|
|
|
|
|
|
|
void AdvanceLine() {
|
|
|
|
++lineNumber_;
|
|
|
|
column_ = 1;
|
|
|
|
}
|
|
|
|
|
2018-02-05 21:54:36 +01:00
|
|
|
private:
|
2018-01-30 20:54:19 +01:00
|
|
|
int lineNumber_{1};
|
|
|
|
int column_{1};
|
|
|
|
};
|
|
|
|
|
|
|
|
std::ostream &operator<<(std::ostream &, const Position &);
|
|
|
|
} // namespace Fortran
|
|
|
|
#endif // FORTRAN_POSITION_H_
|