...one of the most highly
regarded and expertly designed C++ library projects in the
world. — Herb Sutter and Andrei
The VMD library has functionality for testing and parsing preprocessor data.
The C++ preprocessor defines preprocessor data as preprocessing tokens. The types of preprocessing tokens can be seen in section 2.5 of the C++ standard document.
The VMD library works with a subset of two of these types of preprocessor tokens as "data types". These are the "identifier" and "pp-number" preprocessor tokens. The preprocessor token types which VMD cannot parse are:
Even though VMD cannot parse these preprocessor token types, it is still a very useful library since a large part of macro programming works with 'identifier' and 'pp-number' tokens.
VMD identifiers are preprocessing tokens consisting of alphanumeric characters and the underscore ( _ ) character. This is very similar to a preprocessor token "identifier" with the difference being that a VMD identifier can start with a numeric character, allowing VMD identifiers to also be positive integral literals. VMD offers functionality for parsing VMD identifiers both as a separate element or in a sequence of preprocessing tokens.
VMD numbers are Boost PP numbers, ie. preprocessing tokens of whole numbers between 0 and 256 inclusive. These are a small subset of preprocessor token "pp-number". VMD offers functionality for parsing numbers both as a separate element or in a sequence of preprocessing tokens. A VMD number is really a subset of VMD identifiers for which VMD offers specific functionality. The Boost PP library has it own extensive support for numbers, which VMD does not duplicate.
VMD v-types are, like numbers, a subset of VMD identifiers consisting of identifiers beginning with BOOST_VMD_TYPE_ followed by a data type mnemonic. Each v-type can be recognized by VMD functionality and therefore passed or returned by macros. Like any identifier a v-type can be parsed both as a separate element or in a sequence of preprocessing tokens.
VMD can also test for emptiness, or the absence of any preprocessing tokens when passed as macro input.
The Boost PP library supports four individual high-level data types. These are arrays, lists, seqs, and tuples. When using variadic macros arrays are really obsolete since tuples have all the functionality of arrays with a simpler syntax. Nonetheless arrays are fully supported by VMD. A further data type supported by Boost PP is variadic data, which is a comma separated grouping of preprocessor elements. VMD has no special support for variadic data outside of what is already in Boost PP.
VMD has functionality to work with the four Boost PP high-level data types. VMD can test the Boost PP data types and parse them in a sequence of preprocessor tokens.
VMD can also parse sequences. A sequence consists of zero or more other top-level data types already mentioned represented consecutively. As such a sequence represents any data type which VMD can parse since it can consist of emptiness, a single data type, or multiple data types represented consecutively.
Emptiness, the three identifier types, the four Boost PP composite data types, and VMD sequences are the data types which VMD understands. Other low-level preprocessor data types can of course be used in macro programming but VMD cannot parse such preprocessor data.