On 02/09/10 16:12, Hicham Mouline wrote:
-----Original Message-----
From: boost-users-bounces@lists.boost.org [mailto:boost-users-
bounces@lists.boost.org] On Behalf Of Larry Evans
Sent: 09 February 2010 18:11
To: boost-users@lists.boost.org
Subject: Re: [Boost-users] generate structs with all combinations of
members from a given struct
[snip]
I'd be interesting in seeing this code when you're done with it.
I'd like to try using:
composite_tagged_seq
< all_of_aligned
, field_I1
, field_I2
...
, field_In
where field_I1...field_In is some subset of S::field1,...field5
and composite_tagged is from composite_tagged_seq.zip in the
boost vault:
http://www.boostpro.com/vault/index.php?&directory=Data Structures
Then compare the compile-time and run-time performance. I've no
doubt it would be slower than the PP version, but I'm just
curious about how much.
The attached shows a test driver using composite_tagged_seq.
The composite_tagged_seq used is a bit different than the one in
vault. The one used modified layout to handle the case
where the type was void. In this case, not project template
function for a void member is produced.
The fields_subsets_t time contains 32 members, 1 for each
subset of 5 fields. However, as shown in the driver,
you have to access the field with:
field_subset_struct.project<FieldNum>();
The compile time was slow (maybe 10-20 secs) on my machine,
but that sounds a lot faster than you PP method.
If you think you can use this, I'll upload the code to
the sandbox.
-regards,
Larry
BTW, the output is:
/home/evansl/prog_dev/boost-svn/ro/trunk/sandbox-local/build/gcc4_4v/sandbox/variadic_templates/libs/mpl/sandbox/composite_tagged~field_subsets~cross_product_pack.exe
absent_fields_seq=
package< absent_tag, type=1>
package< absent_tag, type=2>
package< absent_tag, type=3>
package< absent_tag, type=4>
package< absent_tag, type=5>
size::value=32
select_fields_seq=
{ absent , absent , absent , absent , absent }
{ absent , absent , absent , absent , ( type= 5) }
{ absent , absent , absent , ( type= 4) , absent }
{ absent , absent , absent , ( type= 4) , ( type= 5) }
{ absent , absent , ( type= 3) , absent , absent }
{ absent , absent , ( type= 3) , absent , ( type= 5) }
{ absent , absent , ( type= 3) , ( type= 4) , absent }
{ absent , absent , ( type= 3) , ( type= 4) , ( type= 5) }
{ absent , ( type= 2) , absent , absent , absent }
{ absent , ( type= 2) , absent , absent , ( type= 5) }
{ absent , ( type= 2) , absent , ( type= 4) , absent }
{ absent , ( type= 2) , absent , ( type= 4) , ( type= 5) }
{ absent , ( type= 2) , ( type= 3) , absent , absent }
{ absent , ( type= 2) , ( type= 3) , absent , ( type= 5) }
{ absent , ( type= 2) , ( type= 3) , ( type= 4) , absent }
{ absent , ( type= 2) , ( type= 3) , ( type= 4) , ( type= 5) }
{ ( type= 1) , absent , absent , absent , absent }
{ ( type= 1) , absent , absent , absent , ( type= 5) }
{ ( type= 1) , absent , absent , ( type= 4) , absent }
{ ( type= 1) , absent , absent , ( type= 4) , ( type= 5) }
{ ( type= 1) , absent , ( type= 3) , absent , absent }
{ ( type= 1) , absent , ( type= 3) , absent , ( type= 5) }
{ ( type= 1) , absent , ( type= 3) , ( type= 4) , absent }
{ ( type= 1) , absent , ( type= 3) , ( type= 4) , ( type= 5) }
{ ( type= 1) , ( type= 2) , absent , absent , absent }
{ ( type= 1) , ( type= 2) , absent , absent , ( type= 5) }
{ ( type= 1) , ( type= 2) , absent , ( type= 4) , absent }
{ ( type= 1) , ( type= 2) , absent , ( type= 4) , ( type= 5) }
{ ( type= 1) , ( type= 2) , ( type= 3) , absent , absent }
{ ( type= 1) , ( type= 2) , ( type= 3) , absent , ( type= 5) }
{ ( type= 1) , ( type= 2) , ( type= 3) , ( type= 4) , absent }
{ ( type= 1) , ( type= 2) , ( type= 3) , ( type= 4) , ( type= 5) }
no_f1_v.F_2=field_type=2
no_f1_v.F_3=field_type=3
Compilation finished at Sun Feb 14 13:59:27