|
Boost : |
From: Matthias Troyer (troyer_at_[hidden])
Date: 2005-10-10 07:31:52
On Oct 10, 2005, at 2:09 PM, Martin Slater wrote:
>>
>> then I see several major disadvantages of this approach:
>>
>> 1.) it fixes the value types for which fast array serialization can
>> be done
>>
>
> I worked around this by introducing an intermediary type
> ArchiveByteArray as follows
> ...
> struct BinaryArchiveByteArrayO
> {
> int count;
> const void *ptr;
> };
>
> template<class T>
> BinaryArchiveByteArrayO MakeArchiveOutputByteArray(int count,
> const
> T *t)
> {
> BinaryArchiveByteArrayO res;
>
> res.count = count * sizeof(T);
> res.ptr = t;
>
> return res;
> }
There is a problem here: the type information gets lost once you
create an BinaryArchiveByteArrayO, but the implementation of save
(BinaryArchiveByteArrayO const&) will require that information in the
case of XDR, MPI and other archives.
> ...
>
> template<class U, class Allocator>
> inline void save(
> BinaryOutputArchive& ar,
> const std::vector<U, Allocator> &t,
> const unsigned int /* file_version */
> ){
> boost::mpl::if_<boost::is_pod<U>, Detail::VectorSavePodImp,
> Detail::VectorSaveImp>::type(ar, t);
> }
This is similar to the way I propose to implement vector
serialization. Just look at the diffs I attached to my mail. The main
difference is that instead of the mpl::if_ I use boost::enable_if.
> This could probably have a dispatch mechanism above it checking for an
> archive trait to dispatch to either the fast or default implemention.
Exactly, a trait will be more flexible here, since your dispatch
based on boost::is_pod<U> might be too narrow for some archives, and
too broad for others (some such as XML archives might never want to
support it).
Matthias
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk