-----Original Message----- From: boost-users-bounces@lists.boost.org [mailto:boost-users- bounces@lists.boost.org] On Behalf Of Larry Evans Sent: 06 February 2010 19:26 To: boost-users@lists.boost.org Subject: Re: [Boost-users] generate structs with all combinations of members from a given struct
On 02/06/10 12:06, Hicham Mouline wrote: [snip] My *intuition* as well as posts from others (e.g. Joel Guzman and Eric Niebler) and a proto webpage:
http://www.boost.org/doc/libs/1_41_0/doc/html/proto/appendices.html#boos t_proto.appendices.rationale
suggests this PP method would be faster than the fusion-based solution.
However, I've been wondering how you would use this.
Starting from struct S { type1 field1; ... typen fieldn; /// for now n=6 but may increase later }; all types are either int, unsigned int, long, double or bool. The PP code generates all the structs like struct S_field1_field5 { type1 field1; type5 field5; }; For each of these structs, we have the related type multi_array<S_field1_field5, M> an M-dimension array the elements of which are 1 of the generated structs. M can reach the order of 10, and the number of elements of the multi array can be quite large, therefore it is important to generate a multi_array that is as accurate as possible. The user selects at runtime which fields she is interested in, this then fills in a bitset<n>. At runtime we then select the multi_array we will work with. I will find a way to adapt all of the multi_arrays to be derived from a multi_array_base via some wrapper. struct multi_array_base { virtual ~ multi_array_base(); }; I have say 5 translation units tr1,tr2,tr3,tr4 and tr5. The specific multi_array is generated in tr1. It needs to pass via tr2,tr3 and tr4 to reach tr5. tr2,3 and 4 do not need to know what exact multi_array type it is, so they just deal with multi_array_base. tr5 then dynamic casts the multi_array_base ref to the appropriate multi_array with the appropriate S. pseudo_code tr1, itself geenrate switch( bitset.toulong() ) { case 1: some_function( multi_array_adapted_to_derive_from_base<appropriate_S, appropriate_M>& ); case 2: some_function( multi_array_adapted_to_derive_from_base<appropriate_S, appropriate_M>& ); .... case 63: some_function( multi_array_adapted_to_derive_from_base<appropriate_S, appropriate_M>& ); } This is still work in progress. Regards,