@@ -63,6 +63,8 @@ namespace TAO_PEGTL_NAMESPACE::internal
6363 }
6464 };
6565
66+ #if defined( __GNUC__ ) || defined( __clang__ )
67+
6668 // For global getter functions that return a T.
6769
6870 template < bool N, typename C, typename T, T ( *P )( const C& ) noexcept ( N ) >
@@ -159,6 +161,178 @@ namespace TAO_PEGTL_NAMESPACE::internal
159161 }
160162 };
161163
164+ #else // MSVC can't deduce the N in template< bool N ..... noexcept( N ) >
165+
166+ template < typename C, typename T, T ( *P )( const C& ) noexcept ( true ) >
167+ struct peek_member_impl < T ( * )( const C& ) noexcept ( true ), P >
168+ {
169+ using data_t = T;
170+ using pair_t = data_and_size< data_t , std::uint8_t >;
171+
172+ template < typename ParseInput >
173+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( noexcept ( in.size( 1 ) ) )
174+ {
175+ if ( in.size ( offset + 1 ) >= ( offset + 1 ) ) {
176+ return pair_t ( P ( *in.current ( offset ) ), 1 );
177+ }
178+ return pair_t ();
179+ }
180+ };
181+
182+ template < typename C, typename T, T ( *P )( const C& ) noexcept ( false ) >
183+ struct peek_member_impl < T ( * )( const C& ) noexcept ( false ), P >
184+ {
185+ using data_t = T;
186+ using pair_t = data_and_size< data_t , std::uint8_t >;
187+
188+ template < typename ParseInput >
189+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( false )
190+ {
191+ if ( in.size ( offset + 1 ) >= ( offset + 1 ) ) {
192+ return pair_t ( P ( *in.current ( offset ) ), 1 );
193+ }
194+ return pair_t ();
195+ }
196+ };
197+
198+ template < typename C, typename T, const T& ( *P )( const C& ) noexcept ( true ) >
199+ struct peek_member_impl < const T& ( * )( const C& ) noexcept ( true ), P >
200+ {
201+ using data_t = T;
202+ using pair_t = data_and_size< data_t , void >;
203+
204+ template < typename ParseInput >
205+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( noexcept ( in.size( 1 ) ) )
206+ {
207+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? &P ( *in.current ( offset ) ) : nullptr );
208+ }
209+ };
210+
211+ template < typename C, typename T, const T& ( *P )( const C& ) noexcept ( false ) >
212+ struct peek_member_impl < const T& ( * )( const C& ) noexcept ( false ), P >
213+ {
214+ using data_t = T;
215+ using pair_t = data_and_size< data_t , void >;
216+
217+ template < typename ParseInput >
218+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( false )
219+ {
220+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? &P ( *in.current ( offset ) ) : nullptr );
221+ }
222+ };
223+
224+ template < typename C, typename T, const T* ( *P )( const C& ) noexcept ( true ) >
225+ struct peek_member_impl < const T* ( * )( const C& ) noexcept ( true ), P >
226+ {
227+ using data_t = T;
228+ using pair_t = data_and_size< data_t , void >;
229+
230+ template < typename ParseInput >
231+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( noexcept ( in.size( 1 ) ) )
232+ {
233+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? P ( *in.current ( offset ) ) : nullptr );
234+ }
235+ };
236+
237+ template < typename C, typename T, const T* ( *P )( const C& ) noexcept ( false ) >
238+ struct peek_member_impl < const T* ( * )( const C& ) noexcept ( false ), P >
239+ {
240+ using data_t = T;
241+ using pair_t = data_and_size< data_t , void >;
242+
243+ template < typename ParseInput >
244+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( false )
245+ {
246+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? P ( *in.current ( offset ) ) : nullptr );
247+ }
248+ };
249+
250+ template < typename C, typename T, T ( C::*P )() const noexcept ( true ) >
251+ struct peek_member_impl< T ( C::* )() const noexcept ( true ), P >
252+ {
253+ using data_t = T;
254+ using pair_t = data_and_size< data_t , std::uint8_t >;
255+
256+ template < typename ParseInput >
257+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( noexcept ( in.size ( 1 ) ) )
258+ {
259+ if ( in.size ( offset + 1 ) >= ( offset + 1 ) ) {
260+ return pair_t ( ( in.current ( offset )->*P )(), 1 );
261+ }
262+ return pair_t ();
263+ }
264+ };
265+
266+ template < typename C, typename T, T ( C::*P )() const noexcept ( false ) >
267+ struct peek_member_impl< T ( C::* )() const noexcept ( false ), P >
268+ {
269+ using data_t = T;
270+ using pair_t = data_and_size< data_t , std::uint8_t >;
271+
272+ template < typename ParseInput >
273+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( false )
274+ {
275+ if ( in.size ( offset + 1 ) >= ( offset + 1 ) ) {
276+ return pair_t ( ( in.current ( offset )->*P )(), 1 );
277+ }
278+ return pair_t ();
279+ }
280+ };
281+
282+ template < typename C, typename T, const T& ( C::*P )() const noexcept ( true ) >
283+ struct peek_member_impl< const T& ( C::* )() const noexcept ( true ), P >
284+ {
285+ using data_t = T;
286+ using pair_t = data_and_size< data_t , void >;
287+
288+ template < typename ParseInput >
289+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( noexcept ( in.size ( 1 ) ) )
290+ {
291+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? &( ( in.current ( offset )->*P )() ) : nullptr );
292+ }
293+ };
294+
295+ template < typename C, typename T, const T& ( C::*P )() const noexcept ( false ) >
296+ struct peek_member_impl< const T& ( C::* )() const noexcept ( false ), P >
297+ {
298+ using data_t = T;
299+ using pair_t = data_and_size< data_t , void >;
300+
301+ template < typename ParseInput >
302+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( false )
303+ {
304+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? &( ( in.current ( offset )->*P )() ) : nullptr );
305+ }
306+ };
307+
308+ template < typename C, typename T, const T* ( C::*P )() const noexcept ( true ) >
309+ struct peek_member_impl< const T* ( C::* )() const noexcept ( true ), P >
310+ {
311+ using data_t = T;
312+ using pair_t = data_and_size< data_t , void >;
313+
314+ template < typename ParseInput >
315+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( noexcept ( in.size ( 1 ) ) )
316+ {
317+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? ( in.current ( offset )->*P )() : nullptr );
318+ }
319+ };
320+
321+ template < typename C, typename T, const T* ( C::*P )() const noexcept ( false ) >
322+ struct peek_member_impl< const T* ( C::* )() const noexcept ( false ), P >
323+ {
324+ using data_t = T;
325+ using pair_t = data_and_size< data_t , void >;
326+
327+ template < typename ParseInput >
328+ [[nodiscard]] static pair_t peek ( ParseInput& in, const std::size_t offset = 0 ) noexcept ( false )
329+ {
330+ return data_and_size ( ( in.size ( offset + 1 ) >= ( offset + 1 ) ) ? ( in.current ( offset )->*P )() : nullptr );
331+ }
332+ };
333+
334+ #endif
335+
162336 template < auto M >
163337 struct peek_member
164338 : peek_member_impl< decltype ( M ), M >
0 commit comments