|
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