|
Boost : |
Subject: Re: [boost] [gsoc][review/comments] Request community input on project interface
From: David Abrahams (dave_at_[hidden])
Date: 2010-06-21 12:50:04
At Mon, 21 Jun 2010 12:39:40 -0400,
Brian Bartman wrote:
>
> Hello,
>
> I'm currently working on my GSoC project and I wanted some feedback from the
> community about the interface of a data structure I'm working on called a
> "bitfield_tuple". The bitfield_tuple makes it easy and simple to create and
> use specific bitfields.
Cool.
> Currently, this works only over integral types,
> although there are plans to extend this in later versions of the data
> structure. bitfield_tuples correctly work with different types of
> endianness as well as provide the mechanisms to allow users to explicitly
> define the size of the structure's storage space.
I think you need to define what you consider to be âcorrectly working
with different types of endianness.â
> The bitfield_tuple is a tuple like sequence of elements but, instead of
> providing direct access to an instance of a type, a proxy to the element
> stored within the bitfield_tuple is returned. This is similar to
> std::vector<bool>'s reference type.
>
>
> Example bitfield_tuple declaration,
>
> struct red;
> struct green;
> struct blue;
>
>
> typedef bitfield_tuple<
> storage<unsigned int>,
> member<int,red,5>,
> member<int,green,6>,
> member<ing,blue,5>
> > bft_example;
>
> The internal storage type which all of the bitfields are stored in is
> specified by the storage template. The members are used to specify the
> different bitfields which are to be stored within that storage type. The
> member template is specified the exact same way a normal c++ bitfield would
> be specified inside of a struct or class.
>
> int red:5;
Not valid C++ AFAIK.
> member<int,red,5>
>
> A member template is specified in the order of: type, name, width of
> bitfield.
So these ânamesâ (struct tags) are a way of referring to different
fields? Is it possible to refer to them by index?
> The order the member templates are given in is the order in which they are
> stored within the bitfield_tuple. However, the storage template does not
> take up an index within the bitfield_tuple. So the template
> member<int,red,5> will be stored at index 0. Each member template requires a
> name be specified; this is for ease of access, later described in the get
> function. Each name must be unique within a single bitfield_tuple. The width
> of the bitfield is handled internally. The starting point for each bitfield
> is the bit after the previous bitfield, or 0 if it's the first
> bitfield.
I think you need to define âafter.â
> bitfield_tuple interface summary:
>
> Default constructor, copy constructor, and a constructor which allows for
> the construction over an initial value which is of the same as the storage
> type.
>
> bitfield_tuple();
> bitfield_tuple (bitfield_tuple const&);
> bitfield_tuple (storage_type);
That last one should be explicit because of the possibility of
narrowing.
> Assignment operators for assignment from the storage type, similar to the
> constructor above, and copy assignment.
>
> bitfield_tuple const& operator=(storage_type);
> bitfield_tuple const& operator=(bitfield_tuple const&);
>
> The get function operates similar to the boost.tuple with slight
> modification. Specifically, the get function will return a
> reference type.
?? boost.tuple's get<> doesn't return a reference? How can you
return a reference to three bits? Didn't you already tell us you were
using proxies?
> There are two ways to use the get function. The first way is by using a
> unsigned integral constant as an index:
>
> bft_example temp;
> temp.get<0>(); // returns a proxy reference to the bitfield represented by
> member<int,red,5>
>
> The second way to use it is to call get using the name provided to the
> member parameter:
>
> temp.get<red>(); // does the same thing as get<0>();
>
> I provide both const and non const versions of both functions.
>
> The bitfield_tuple is also a boost.fusion sequence. It models an associative
> array type by using the following category:
>
> struct bft_category
> : boost::fusion::random_access_
>
> traversal_tag,
> boost::fusion::associative_tag
> { };
Good!
I hope you find these comments helpful.
Regards,
-- Dave Abrahams BoostPro Computing http://www.boostpro.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk