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
|
//overload for list nodes
template<class SyntaxNodeT>
SyntaxNodeT
convert_node
(
const tree_node_t& node,
typename boost::enable_if<syntax_nodes::utility::is_list_node>::type* = 0
)
{
return convert_list_node(node);
}
//overload for optional nodes
template<class SyntaxNodeT>
SyntaxNodeT
convert_node
(
const tree_node_t& node,
typename boost::enable_if<syntax_nodes::utility::is_optional_node>::type* = 0
)
{
return convert_optional_node(node);
}
/*
* Utility types
*/
typedef char yes_type;
struct no_type
{
char padding[8];
};
/*
* list_node type trait
*/
namespace list_node_check
{
template<class T>
static
yes_type
check_sig(typename T::item*);
template<class T>
static
no_type
check_sig(...);
}
template<class T>
struct is_list_node
{
static const bool value = sizeof(list_node_check::check_sig(0)) == sizeof(yes_type);
};
/*
* optional_node type trait
*/
template<class T>
struct is_optional_node
{
static const bool value = false;
};
template<class T>
struct is_optional_node<syntax_nodes::optional_node>
{
static const bool value = true;
}; |