@@ -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