Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2001-12-17 09:23:19


Purpose:

* provide a common MPL/Loki subset enabling future compatible evolution of
the libraries and their eventual acceptance into Boost.

* failing that, provide a common threat for MPL and Loki authors enabling
their cooperation. ;-)

Synopsis:

namespace mpl
{

struct missing; // missing argument in a variadic function

struct nil;
template<class, class> struct pair;

struct _1; // bind/ET placeholders
struct _2;
// ...

template<class T, T v> struct ct_value
{
    static const T value = v;
};

template<class T> struct ct_type
{
    typedef T type;
};

}

Type system:

The metaprogramming library operates on types only. Compile-time values are
wrapped in ct_value<Type, Value>.

(Rationale: practice shows that attempting to cover compile-time values as
well results in excessive duplication. ct_value<> is chosen to avoid having
separate bool_t, int_t, uint_t, size_t_t and so on.)

The primary data structure is a binary tree represented by pair<Left,
Right>. The most common special case is the list, defined recursively as:

* nil is a list, called the empty list.
* pair<F, R> is a list iff R is a list.

No type defined by the library, except ct_type<T>, is guaranteed to have an
accessible constructor (or be a complete type) unless stated otherwise.
Values that correspond to a type T can be obtained using the expression
ct_type<T>().

(Rationale: it is not yet clear how should the compile-time subset of C++
interact with the traditional part of the language. On a conforming
compiler, the library can be written (and used) in such a way as to not
assume any specific properties of the types, leaving the door open for
future evolution.)

ct_type<T>, although compatible with the compile-time function identity<T>,
is a separate type with a distinct purpose.

Naming convention:

Identifiers that collide with keywords or other C++ reserved identifiers are
prefixed with ct_. Example: ct_if<class Cond, class Then, class Else>::type.

The result of a compile-time function is obtained using function<A1, ...,
An>::type.

For convenience, some compile-time functions return compile-time values, as
well, obtained via function<A1, ..., An>::value.

Compile-time functions that take a non-type argument are suffixed with 'v'.
Example: ct_ifv<bool Cond, class Then, class Else>::type.

"Quoted" compile-time functions are suffixed with 'q' and are invoked using
the function::template apply<A1, ..., An>::type syntax (on a conforming
compiler.) Example: ct_ifq.

(Rationale: not perfect, but better than no convention.)

STL iterator idiom compatibility:

A list provides forward iterators. For the list (a1 a2 ... aN), the iterator
to its k-th element is (ak ak+1 .. aN). The beyond-the-end iterator is nil.

Example: the compile-time function find<L, E>::type returns the sublist
starting with the first occurence of E in L, up to the end of L. The return
'value' can be used as an iterator, or it can be used as a condition in
ct_if (ct_if considers nil and ct_value<bool, false> to be false, everything
else to be true.)

--
Peter Dimov
Multi Media Ltd.

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk