[/ (C) Copyright Edward Diener 2011-2017 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_intro Introduction] 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. [heading Data type examples] [table:dwe Data types with examples [[Type] [Example]] [[identifier] [anyname]] [[number] [47]] [[type] [BOOST_VMD_TYPE_NUMBER]] [[array] [(4,(an_identifier,156,BOOST_VMD_TYPE_IDENTIFIER))]] [[list] [(78,(some_identifier,(BOOST_VMD_TYPE_TYPE,BOOST_PP_NIL)))]] [[seq] [(identifier)(89)(245)]] [[tuple] [(any_id,175,BOOST_VMD_TYPE_LIST,happy,21)]] [[sequence] [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: #define RETURN_NOTHING(x) is said to return emptiness. Conversely a macro could accept nothing when invoked, such as in: RETURN_NOTHING() Finally emptiness can be part of any composite data type as in: (45,,some_name) where the second tuple element is empty. [heading 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. [heading Functionality areas] The functionality of the library may be summed up as: # Provide a better way of testing for and using empty parameters and empty preprocessor data. # Provide ways for testing/parsing for identifiers, numbers, types, tuples, arrays, lists, and seqs. # Provide ways for testing/parsing sequences of identifiers, numbers, types, tuples, arrays, lists. and seqs. # 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. [endsect]