Skip to content

Commit 69068ae

Browse files
committed
CRTP
1 parent c653f40 commit 69068ae

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

clang/lib/Frontend/TextDiagnostic.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,40 +47,39 @@ static constexpr raw_ostream::Colors CommentColor = raw_ostream::YELLOW;
4747
static constexpr raw_ostream::Colors LiteralColor = raw_ostream::GREEN;
4848
static constexpr raw_ostream::Colors KeywordColor = raw_ostream::BLUE;
4949

50-
class ColumnsOrBytes {
50+
template <typename Sub> class ColumnsOrBytes {
5151
public:
5252
int V = 0;
5353
ColumnsOrBytes(int V) : V(V) {}
5454
bool isValid() const { return V != -1; }
55+
Sub next() const { return Sub(V + 1); }
56+
Sub prev() const { return Sub(V - 1); }
5557

56-
bool operator>(ColumnsOrBytes O) { return V > O.V; }
57-
bool operator<(ColumnsOrBytes O) { return V < O.V; }
58-
bool operator<=(ColumnsOrBytes B) { return V <= B.V; }
59-
bool operator!=(ColumnsOrBytes C) { return C.V != V; }
58+
bool operator>(ColumnsOrBytes O) const { return V > O.V; }
59+
bool operator<(ColumnsOrBytes O) const { return V < O.V; }
60+
bool operator<=(ColumnsOrBytes B) const { return V <= B.V; }
61+
bool operator!=(ColumnsOrBytes C) const { return C.V != V; }
6062

61-
ColumnsOrBytes &operator+=(ColumnsOrBytes B) {
63+
Sub operator+(Sub B) const { return Sub(V + B.V); }
64+
Sub &operator+=(Sub B) {
6265
V += B.V;
63-
return *this;
66+
return *(Sub *)this;
6467
}
65-
ColumnsOrBytes &operator-=(ColumnsOrBytes B) {
68+
Sub operator-(Sub B) const { return Sub{V - B.V}; }
69+
Sub &operator-=(Sub B) {
6670
V -= B.V;
67-
return *this;
71+
return *(Sub *)this;
6872
}
6973
};
70-
class Bytes final : public ColumnsOrBytes {
74+
75+
class Bytes final : public ColumnsOrBytes<Bytes> {
7176
public:
7277
Bytes(int V) : ColumnsOrBytes(V) {}
73-
Bytes next() const { return Bytes(V + 1); }
74-
Bytes prev() const { return Bytes(V - 1); }
75-
Bytes operator+(Bytes B) { return Bytes{V + B.V}; }
7678
};
77-
class Columns final : public ColumnsOrBytes {
79+
80+
class Columns final : public ColumnsOrBytes<Columns> {
7881
public:
7982
Columns(int V) : ColumnsOrBytes(V) {}
80-
Columns next() const { return Columns(V + 1); }
81-
Columns prev() const { return Columns(V - 1); }
82-
Columns operator-(Columns B) { return Columns{V - B.V}; }
83-
Columns operator+(Columns B) { return Columns{V + B.V}; }
8483
};
8584

8685
/// Add highlights to differences in template strings.

0 commit comments

Comments
 (0)