1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
// Copyright (c) 2020 Dr. Colin Hirsch and Daniel Frey
// Please see LICENSE for license or visit https://github.com/taocpp/PEGTL/
#ifndef TAO_JSON_PEGTL_CONTRIB_PRINT_HPP
#define TAO_JSON_PEGTL_CONTRIB_PRINT_HPP
#include <ostream>
#include "../config.hpp"
#include "../demangle.hpp"
#include "../type_list.hpp"
#include "../visit.hpp"
namespace TAO_JSON_PEGTL_NAMESPACE
{
namespace internal
{
template< typename Name >
struct print_names
{
static void visit( std::ostream& os )
{
os << demangle< Name >() << '\n';
}
};
template< typename Name >
struct print_debug
{
static void visit( std::ostream& os )
{
const auto first = demangle< Name >();
os << first << '\n';
const auto second = demangle< typename Name::rule_t >();
if( first != second ) {
os << " (aka) " << second << '\n';
}
print_subs( os, typename Name::subs_t() );
os << '\n';
}
private:
template< typename... Rules >
static void print_subs( std::ostream& os, type_list< Rules... > /*unused*/ )
{
( print_sub< Rules >( os ), ... );
}
template< typename Rule >
static void print_sub( std::ostream& os )
{
os << " (sub) " << demangle< Rule >() << '\n';
}
};
} // namespace internal
template< typename Grammar >
void print_names( std::ostream& os )
{
visit< Grammar, internal::print_names >( os );
}
template< typename Grammar >
void print_debug( std::ostream& os )
{
visit< Grammar, internal::print_debug >( os );
}
} // namespace TAO_JSON_PEGTL_NAMESPACE
#endif
|