[/ 
  (C) Copyright Edward Diener 2011-2015
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

[section:vmd_convert_sequence Getting the type of data]

VMD has the ability to retrieve the type of any data which it can
parse, which means any VMD sequence. The generic macro to do this is called
BOOST_VMD_GET_TYPE and it takes a single required variadic parameter,
which is a VMD sequence. Since a VMD sequence is any data which VMD
can parse the BOOST_VMD_GET_TYPE macro works with any VMD data.

It returns one of the types previously discussed when introducing
v-types as an identifier subset. As explained previously in that
topic a v-type is fully recognized by VMD macros and can be part
of a sequence and passed as VMD data just like all the other data types 
VMD recognizes.

When BOOST_VMD_GET_TYPE returns the type of data it returns by default 
the most specific type that the data can be. This means that non-empty
lists and arrays are returned as such, not as tuples, and numbers 
and types and empty lists are returned as such, not as identifiers.

 #include <boost/vmd/get_type.hpp>
 
 #define BOOST_VMD_REGISTER_ANID (ANID)
 #define SEQUENCE_EMPTY
 #define SEQUENCE_MULTI (1,2,3) 88
 #define SEQUENCE1 (3,(1,2,3))
 #define SEQUENCE2 ANID
 #define SEQUENCE3 (1,(2,(3,BOOST_PP_NIL)))
 #define SEQUENCE4 1
 #define SEQUENCE5 (1)(2)(3)
 #define SEQUENCE6 (1,2,3)
 #define SEQUENCE7 BOOST_VMD_TYPE_NUMBER
 
 BOOST_VMD_GET_TYPE(SEQUENCE_EMPTY) will return BOOST_VMD_TYPE_EMPTY
 BOOST_VMD_GET_TYPE(SEQUENCE_MULTI) will return BOOST_VMD_TYPE_SEQUENCE
 BOOST_VMD_GET_TYPE(SEQUENCE1) will return BOOST_VMD_TYPE_ARRAY
 BOOST_VMD_GET_TYPE(SEQUENCE2) will return BOOST_VMD_TYPE_IDENTIFIER
 BOOST_VMD_GET_TYPE(SEQUENCE3) will return BOOST_VMD_TYPE_LIST
 BOOST_VMD_GET_TYPE(SEQUENCE4) will return BOOST_VMD_TYPE_NUMBER
 BOOST_VMD_GET_TYPE(SEQUENCE5) will return BOOST_VMD_TYPE_SEQ
 BOOST_VMD_GET_TYPE(SEQUENCE6) will return BOOST_VMD_TYPE_TUPLE
 BOOST_VMD_GET_TYPE(SEQUENCE7) will return BOOST_VMD_TYPE_TYPE

[heading Usage]

You can use the general header file:

 #include <boost/vmd/vmd.hpp>
 
or you can use the individual header file:

 #include <boost/vmd/get_type.hpp>
 
for the BOOST_VMD_GET_TYPE macro.

[endsect]
