Skip to content

Commit 5909db5

Browse files
committed
added constness_ptr as pointer wrapper to ensure actual method constness
1 parent 3deeb91 commit 5909db5

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

simplecpp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,7 @@ void simplecpp::TokenList::clear()
537537
backToken = nullptr;
538538
while (frontToken) {
539539
Token * const next = frontToken->next;
540-
delete frontToken;
540+
delete frontToken.get();
541541
frontToken = next;
542542
}
543543
sizeOfType.clear();
@@ -2248,7 +2248,7 @@ namespace simplecpp {
22482248
const bool canBeConcatenatedStringOrChar = isStringLiteral_(A->str()) || isCharLiteral_(A->str());
22492249
const bool unexpectedA = (!A->name && !A->number && !A->str().empty() && !canBeConcatenatedWithEqual && !canBeConcatenatedStringOrChar);
22502250

2251-
Token * const B = tok->next->next;
2251+
const Token * const B = tok->next->next;
22522252
if (!B->name && !B->number && B->op && !B->isOneOf("#="))
22532253
throw invalidHashHash::unexpectedToken(tok->location, name(), B);
22542254

simplecpp.h

Lines changed: 63 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,65 @@ namespace simplecpp {
7272
class Macro;
7373
class FileDataCache;
7474

75+
// as std::optional behaves similarly we could use that instead if we ever move to C++17.
76+
// it is not a simple drop-in as our "operator bool()" indicates if the pointer is non-null
77+
// whereas std::optional indicates if a value is set.
78+
//
79+
// This is similar to std::experimental::propagate_const
80+
// see https://en.cppreference.com/w/cpp/experimental/propagate_const
81+
template<typename T>
82+
class constness_ptr
83+
{
84+
public:
85+
explicit constness_ptr(T* p)
86+
: mPtr(p)
87+
{}
88+
89+
constness_ptr<T> &operator=(T* p) {
90+
mPtr = p;
91+
return *this;
92+
}
93+
94+
T* get() noexcept {
95+
return mPtr;
96+
}
97+
98+
const T* get() const noexcept {
99+
return mPtr;
100+
}
101+
102+
operator T*() noexcept {
103+
return mPtr;
104+
}
105+
106+
operator const T*() const noexcept {
107+
return mPtr;
108+
}
109+
110+
T* operator->() noexcept {
111+
return mPtr;
112+
}
113+
114+
const T* operator->() const noexcept {
115+
return mPtr;
116+
}
117+
118+
T& operator*() noexcept {
119+
return *mPtr;
120+
}
121+
122+
const T& operator*() const noexcept {
123+
return *mPtr;
124+
}
125+
126+
explicit operator bool() const noexcept {
127+
return mPtr != nullptr;
128+
}
129+
130+
private:
131+
T* mPtr;
132+
};
133+
75134
/**
76135
* Location in source code
77136
*/
@@ -154,8 +213,8 @@ namespace simplecpp {
154213
bool number;
155214
bool whitespaceahead;
156215
Location location;
157-
Token *previous;
158-
Token *next;
216+
constness_ptr<Token> previous;
217+
constness_ptr<Token> next;
159218
mutable const Token *nextcond;
160219

161220
const Token *previousSkipComments() const {
@@ -367,8 +426,8 @@ namespace simplecpp {
367426

368427
unsigned int fileIndex(const std::string &filename);
369428

370-
Token *frontToken;
371-
Token *backToken;
429+
constness_ptr<Token> frontToken;
430+
constness_ptr<Token> backToken;
372431
std::vector<std::string> &files;
373432
};
374433

0 commit comments

Comments
 (0)