nixd
Loading...
Searching...
No Matches
Range.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef> // std::size_t
4#include <cstdint>
5
6namespace nixf {
7
8class Position {
9 int64_t Line;
10 int64_t Column;
11
12public:
13 Position() = default;
14 Position(int64_t Line, int64_t Column) : Line(Line), Column(Column) {}
15
16 [[nodiscard]] int64_t line() const { return Line; }
17 [[nodiscard]] int64_t column() const { return Column; }
18
19 friend bool operator==(const Position &LHS, const Position &RHS) {
20 return LHS.Line == RHS.Line && LHS.Column == RHS.Column;
21 }
22
23 friend bool operator<(const Position &LHS, const Position &RHS) {
24 return LHS.Line < RHS.Line ||
25 (LHS.Line == RHS.Line && LHS.Column < RHS.Column);
26 }
27
28 friend bool operator<=(const Position &LHS, const Position &RHS) {
29 return LHS < RHS || LHS == RHS;
30 }
31};
32
34 Position Begin;
35 Position End;
36
37public:
38 PositionRange() = default;
39
40 PositionRange(Position Begin, Position End) : Begin(Begin), End(End) {}
41 explicit PositionRange(Position Pos) : Begin(Pos), End(Pos) {}
42
43 [[nodiscard]] Position begin() const { return Begin; }
44 [[nodiscard]] Position end() const { return End; }
45
46 /// \brief Check if the range contains another range.
47 [[nodiscard]] bool contains(const PositionRange &Pos) const {
48 return Begin <= Pos.Begin && Pos.End <= End;
49 }
50};
51
52/// \brief A point in the source file.
53///
54/// This class is used to represent a point in the source file. And it shall be
55/// constructed by Lexer, to keep Line & Column information correct.
56/// \see Lexer::consume(std::size_t)
58 int64_t Line;
59 int64_t Column;
60 std::size_t Offset;
61 friend class Lexer;
62 LexerCursor(int64_t Line, int64_t Column, std::size_t Offset)
63 : Line(Line), Column(Column), Offset(Offset) {}
64
65public:
66 friend bool operator==(const LexerCursor &LHS, const LexerCursor &RHS) {
67 return LHS.Line == RHS.Line && LHS.Column == RHS.Column &&
68 LHS.Offset == RHS.Offset;
69 }
70 LexerCursor() = default;
71
72 /// \brief Create a cursor at the given position. (Line, Column, Offset)
73 /// \note This function does not guarantee the correctness of Line & Column.
74 [[nodiscard]] static LexerCursor unsafeCreate(int64_t Line, int64_t Column,
75 std::size_t Offset) {
76 return {Line, Column, Offset};
77 }
78
79 LexerCursor(const LexerCursor &) = default;
80 LexerCursor &operator=(const LexerCursor &) = default;
81 LexerCursor(LexerCursor &&) = default;
82
83 /// \brief Check if the point is at the given position.
84 [[nodiscard]] bool isAt(int64_t Line, int64_t Column,
85 std::size_t Offset) const {
86 return this->line() == Line && this->column() == Column &&
87 this->Offset == Offset;
88 }
89
90 /// \brief Line number, starting from 0.
91 ///
92 /// Currently we only accept LF as the line terminator.
93 [[nodiscard]] int64_t line() const { return Line; }
94
95 /// \brief Column number, starting from 0.
96 [[nodiscard]] int64_t column() const { return Column; }
97
98 /// \brief Position in the source file. (`Line` + `Column`)
99 [[nodiscard]] Position position() const { return {Line, Column}; }
100
101 /// \brief Offset in the source file, starting from 0.
102 [[nodiscard]] std::size_t offset() const { return Offset; }
103};
104
106 LexerCursor LCur;
107 LexerCursor RCur;
108
109public:
110 LexerCursorRange() = default;
111
113 : LCur(LCur), RCur(RCur) {}
114 explicit LexerCursorRange(LexerCursor Pos) : LCur(Pos), RCur(Pos) {}
115
116 [[nodiscard]] LexerCursor lCur() const { return LCur; }
117 [[nodiscard]] LexerCursor rCur() const { return RCur; }
118
119 [[nodiscard]] bool contains(const LexerCursorRange &Pos) const {
120 return range().contains(Pos.range());
121 }
122
123 [[nodiscard]] PositionRange range() const {
124 return {LCur.position(), RCur.position()};
125 }
126};
127
128} // namespace nixf
LexerCursorRange(LexerCursor Pos)
Definition Range.h:114
LexerCursorRange(LexerCursor LCur, LexerCursor RCur)
Definition Range.h:112
PositionRange range() const
Definition Range.h:123
LexerCursor lCur() const
Definition Range.h:116
LexerCursor rCur() const
Definition Range.h:117
bool contains(const LexerCursorRange &Pos) const
Definition Range.h:119
A point in the source file.
Definition Range.h:57
friend bool operator==(const LexerCursor &LHS, const LexerCursor &RHS)
Definition Range.h:66
int64_t column() const
Column number, starting from 0.
Definition Range.h:96
LexerCursor & operator=(const LexerCursor &)=default
std::size_t offset() const
Offset in the source file, starting from 0.
Definition Range.h:102
static LexerCursor unsafeCreate(int64_t Line, int64_t Column, std::size_t Offset)
Create a cursor at the given position. (Line, Column, Offset)
Definition Range.h:74
LexerCursor(LexerCursor &&)=default
bool isAt(int64_t Line, int64_t Column, std::size_t Offset) const
Check if the point is at the given position.
Definition Range.h:84
Position position() const
Position in the source file. (Line + Column)
Definition Range.h:99
int64_t line() const
Line number, starting from 0.
Definition Range.h:93
LexerCursor(const LexerCursor &)=default
LexerCursor()=default
bool contains(const PositionRange &Pos) const
Check if the range contains another range.
Definition Range.h:47
Position begin() const
Definition Range.h:43
PositionRange(Position Begin, Position End)
Definition Range.h:40
Position end() const
Definition Range.h:44
PositionRange(Position Pos)
Definition Range.h:41
PositionRange()=default
friend bool operator==(const Position &LHS, const Position &RHS)
Definition Range.h:19
int64_t column() const
Definition Range.h:17
friend bool operator<=(const Position &LHS, const Position &RHS)
Definition Range.h:28
Position()=default
int64_t line() const
Definition Range.h:16
friend bool operator<(const Position &LHS, const Position &RHS)
Definition Range.h:23
Position(int64_t Line, int64_t Column)
Definition Range.h:14