Boost logo

Boost :

From: Larry Evans (cppljevans_at_[hidden])
Date: 2007-05-14 15:32:40


Query:

   The code here:

 
http://boost-consulting.com/vault/index.php?&directory=variadic_templates

   in:

    aligned_types.2.zip(tr1/aligned_types.hpp)

   would seem to fit best in boost's type_traits, in particular, with
   those templates described here:

 
http://www.boost.org/doc/html/boost_typetraits/category.html#boost_typetraits.alignment

   Is there any interest in adding the aligned_types code there?

Brief Description:

   The aligned_types template declaration is:

     template<class Tag, typename... Types> struct aligned_types;

   where:

     Tag is the "layout tag". Currently the only such tags are:

       variant
       tuple
       packed

     Types is a sequence of types (much like the current variant and boost
       sequences)

   and where the resulting nested type:

     aligned_types<Tag,Types...>::type

   is simply an instance of aligned_storage with sufficient memory to
   accommodate Types... in a layout specificed by Tag. For example,
   with Tag==variant, the aligned_storage is the same as that for
   the aligned_union<0,Types...> of:

   http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2006/n2140.pdf

   The other tags are for regular structs(tag=tuple) and packed
   structs(tag=packed).

   WARNING-Needs Variadic Template Compiler:

     The code uses Gregor's variadic template compiler:

       http://www.osl.iu.edu/~dgregor/cpp/variadic-templates.html

     hence, it can't be used with any other compiler. However, I'd
     think it could be converted to use the preprocessor methods used
     by much of boost::mpl and boost::fusion to approximate Gregor's
     variadic templates.

Applications:

   Reuse in boost::variant:

     Around line 215 of:

http://boost.cvs.sourceforge.net/boost/boost/boost/variant/variant.hpp?revision=1.97&view=markup

     there's make_storage whose nested type, is, AFAICT, the same as
     aligned_types<variant,Types...>::type. The one difference is that
     make_storage (from looking just at lines 233-235) calculates the
     alignment of the variant and the max of the individual
     alignements. However, as explained in:

       aligned_types.2.zip(libs/tr1/doc/aligned_struct_offsets.txt)

     least-common-multiple instead of max is needed to handle extended
     alignments.

     Thus, aligned_types<variant,Types...> could be used in place of
     the current variant's make_storage.

   Space efficient tuple without preprocessor:

     By using aligned_types<tuple,Types...>::type as a storage buffer
     for a tuple, and using the mpl::at_c specializations in
     aligned_types.2.zip(tr1/aligned_types.hpp) to access the subparts
     of this storage buffer corresponding to an element in Types..., a
     tuple implementation as space efficient as fusion's could be
     achieved without use of the boost preprocessor library.


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