


Chapter 1. The Variadic Macro Data Library 1.9

Edward Diener

Table of Contents

Naming conventions
Why and how to use
Using variadic macros
Visual C++ define
Functional groups
Data types
Specific macros for working with data types
Macro constraints
VMD and Boost PP data types
Identifying data types
Generic macros for working with data types
Parsing sequences
Converting sequences
Accessing a sequence element
Getting the type of data
Testing for equality and inequality
Macros with modifiers
Return type modifiers
Filtering modifiers
Identifier modifiers
Splitting modifiers
Index modifiers
Modifiers and the single-element sequence
Identifier subtypes
Useful variadic macros not in Boost PP
Asserting and data types
Generating emptiness and identity
Functionality for "empty" seqs and tuples
Controlling internal usage
Boost PP re-entrant versions
Input as dynamic types
Visual C++ gotchas in VMD
Version 1.7 to 1.8 conversion
Examples using VMD functionality
Variadic Macro Data Reference
Header <boost/vmd/array/to_seq.hpp>
Header <boost/vmd/list/to_seq.hpp>
Header <boost/vmd/to_seq.hpp>
Header <boost/vmd/tuple/to_seq.hpp>
Header <boost/vmd/array/to_tuple.hpp>
Header <boost/vmd/list/to_tuple.hpp>
Header <boost/vmd/seq/to_tuple.hpp>
Header <boost/vmd/to_tuple.hpp>
Header <boost/vmd/assert.hpp>
Header <boost/vmd/assert_is_array.hpp>
Header <boost/vmd/assert_is_empty.hpp>
Header <boost/vmd/assert_is_identifier.hpp>
Header <boost/vmd/assert_is_list.hpp>
Header <boost/vmd/assert_is_number.hpp>
Header <boost/vmd/assert_is_seq.hpp>
Header <boost/vmd/assert_is_tuple.hpp>
Header <boost/vmd/assert_is_type.hpp>
Header <boost/vmd/elem.hpp>
Header <boost/vmd/empty.hpp>
Header <boost/vmd/enum.hpp>
Header <boost/vmd/equal.hpp>
Header <boost/vmd/get_type.hpp>
Header <boost/vmd/identity.hpp>
Header <boost/vmd/is_array.hpp>
Header <boost/vmd/is_empty.hpp>
Header <boost/vmd/is_empty_array.hpp>
Header <boost/vmd/is_empty_list.hpp>
Header <boost/vmd/is_identifier.hpp>
Header <boost/vmd/is_list.hpp>
Header <boost/vmd/is_multi.hpp>
Header <boost/vmd/is_number.hpp>
Header <boost/vmd/is_parens_empty.hpp>
Header <boost/vmd/is_seq.hpp>
Header <boost/vmd/is_tuple.hpp>
Header <boost/vmd/is_type.hpp>
Header <boost/vmd/is_unary.hpp>
Header <boost/vmd/not_equal.hpp>
Header <boost/vmd/seq/is_vmd_seq.hpp>
Header <boost/vmd/seq/pop_back.hpp>
Header <boost/vmd/tuple/pop_back.hpp>
Header <boost/vmd/seq/pop_front.hpp>
Header <boost/vmd/tuple/pop_front.hpp>
Header <boost/vmd/seq/push_back.hpp>
Header <boost/vmd/tuple/push_back.hpp>
Header <boost/vmd/seq/push_front.hpp>
Header <boost/vmd/tuple/push_front.hpp>
Header <boost/vmd/seq/remove.hpp>
Header <boost/vmd/tuple/remove.hpp>
Header <boost/vmd/seq/size.hpp>
Header <boost/vmd/size.hpp>
Header <boost/vmd/tuple/size.hpp>
Header <boost/vmd/seq/to_array.hpp>
Header <boost/vmd/to_array.hpp>
Header <boost/vmd/tuple/to_array.hpp>
Header <boost/vmd/seq/to_list.hpp>
Header <boost/vmd/to_list.hpp>
Header <boost/vmd/tuple/to_list.hpp>
Header <boost/vmd/tuple/is_vmd_tuple.hpp>

Welcome to the Variadic Macro Data library.

The Variadic Macro Data library, referred to hereafter as VMD for short, is a library of variadic macros which provide enhancements to the functionality in the Boost preprocessor library ( Boost PP ), especially as it relates to preprocessor data types.

The preprocessor data types with which VMD has specific functionality are emptiness, identifiers, numbers ( a subset of identifiers ), types ( a subset of identifiers ), Boost PP arrays, Boost PP lists, Boost PP seqs, Boost PP tuples, and sequences. The first four are basic preprocessor data types while the latter five are composite preprocessor data types. A sequence is zero or more of the other preprocessor data types following each other.

Data type examples

Table 1.1. Data types with examples


















tree 59 (56,BOOST_VMD_TYPE_SEQ) (128)(fire)(clown) (47,(BOOST_VMD_TYPE_TUPLE,BOOST_PP_NIL))

Emptiness is the lack of any preprocessing tokens. A macro which expands to nothing, as in:


is said to return emptiness. Conversely a macro could accept nothing when invoked, such as in:


Finally emptiness can be part of any composite data type as in:


where the second tuple element is empty.

What is the advantage ?

VMD can identify any of the preprocessor data types previously mentioned, and can parse sequences into their individual preprocessor data types. You may well ask why that is important.

In Boost PP macro programming a great deal of the control logic of designing a macro is based on the support Boost PP has for numbers and testing for the value of a number, in particular 0 and 1 to represent boolean choices. Essentially Boost PP often uses the value of a number to control the logic in a macro's design.

VMD does not attempt, in any way, to duplicate Boost PP's support for testing the value of numbers or of the boolean 0 or 1 values, but just reuses that functionality. What VMD offers, which goes beyond Boost PP, is a system for deciphering the preprocessor data types, as well as comparing any of the preprocessor data types for equality to any given value. This allows macro logic to be designed in a more flexible way, relying on the type of data and/or the value of the data. If this intrigues you, continue reading to understand how you can use VMD to do macro programming.

Functionality areas

The functionality of the library may be summed up as:

  1. Provide a better way of testing for and using empty parameters and empty preprocessor data.
  2. Provide ways for testing/parsing for identifiers, numbers, types, tuples, arrays, lists, and seqs.
  3. Provide ways for testing/parsing sequences of identifiers, numbers, types, tuples, arrays, lists. and seqs.
  4. Provide some useful variadic macros not in Boost PP.

The library is a header only library and all macros in the library are included by a single header, whose name is 'vmd.hpp'. Individual headers may be used for different functionality in the library and will be denoted when that functionality is explained.

All the macros in the library begin with the sequence 'BOOST_VMD_' to distinguish them from other macros the end-user might use. Therefore the end-user should not use any C++ identifiers, whether in macros or otherwise, which being with the sequence 'BOOST_VMD_'.

Use of the library is only dependent on Boost PP. The library also uses Boost detail lightweight_test.hpp for its own tests.

Last revised: August 19, 2017 at 17:03:01 GMT