Boost logo

Boost :

Subject: Re: [boost] Assign V2 - first impression
From: er (er.ci.2020_at_[hidden])
Date: 2011-06-23 18:41:15


>>
>> Let's assume I get paid for writing a TPS report, every day, involving 100
>> unit-tests such as the one below.
>
> array<int, 4> log_constants = {1, 10, 100, 1000};
> vector<int> cont;
> int n = 2;
> foreach(i, log_constants)
> int x = log10(i);
> for(int j = 0; j< n;++j)
> {
> cont.push_back(x);
> }
>
> I doesn't matter, really, how the values are arranged or what kind of boss
> you have. I don't know if I got the above code correctly, but it doesn't
> matter. The point is that it's readable.

Indeed, it's readable. But I talked about 100 unit tests that vary a
bit. Let's settle for 5. The STL way:

array<int, 1> log_constants = { a1 };
vector<int> cont;
int n = n1;
foreach(i, log_constants)
   int x = f1(i);
   for(int j = 0; j < n;++j)
   {
     cont.push_front(x);
   }
}
array<int, 2> log_constants = { a2, b2 };
vector<int> cont;
int n = n2;
foreach(i, log_constants)
   int x = f2(i);
   for(int j = 0; j < n;++j)
   {
     cont.push_front(x);
   }
}
array<int, 3> log_constants = { a3, b3, c3 };
vector<int> cont;
int n = n3;
foreach(i, log_constants)
   int x = f3(i);
   for(int j = 0; j < n;++j)
   {
     cont.push_front(x);
   }
}
array<int, 4> log_constants = { a4, b4, c4, d4 };
vector<int> cont;
int n = n4;
foreach(i, log_constants)
   int x = f4(i);
   for(int j = 0; j < n;++j)
   {
     cont.push_front(x);
   }
}
array<int, 5> log_constants = { a5, b5, c5, d5, e5 };
vector<int> cont;
int n = n5;
foreach(i, log_constants)
   int x = f5(i);
   for(int j = 0; j < n;++j)
   {
     cont.push_front(x);
   }
}

Assign v2 way:

csv( // 1
     deque<int, push_front_>( _nil ) % ( _data = f1 ) % ( _repeat = n1 ),
     a1
);
csv( // 2
     deque<int, push_front_>( _nil ) % ( _data = f2 ) % ( _repeat = n2 ),
     a2, b2
);
csv( // 3
     deque<int, push_front_>( _nil ) % ( _data = f3 ) % ( _repeat = n3 ),
     a3, b3, c3
);
csv( // 4
     deque<int, push_front_>( _nil ) % ( _data = f4 ) % ( _repeat = n4 ),
     a4, b4, c4, d4
);
csv( // 5
     deque<int, push_front_>( _nil ) % ( _data = f5 ) % ( _repeat = n5 ),
     a5, b5, c5, d5, e5
);

Isn't this more clear, and less error prone? It is not that much, and
not "crucial", but the claim of the library is just as modest:

"Its core utility is a compact interface for executing the repetitive
tasks of assigning or inserting elements in a container".

As for v1 vs v2, I have already stated 3 improvements that you have not
refuted. What's left to prove, in your eyes, is that the changes
benefits the user. For instance, with list_of, you have to contend with
push_back, if I recall correctly. Second, you can invoke fun() in place of

% ( _data = f )

repeat() in place of

and repeat() in place of

% ( _repeat = n )

and fun_repeat() in place of

% ( _data = f ) % ( _repeat = n );

That's about it, whereas you are not limited in the number of options in
v2. See here, however:
https://svn.boost.org/svn/boost/sandbox/assign_v2/libs/assign/v2/doc/html/boost_assign_v2/reference/option.html

Furthermore, it's open for extension i.e. you can write your own
_option, should the available options be insufficient to meet your needs.

> could compact that myself quite a bit
> with some useful snippets if my daily work involved this kind of code
> repeatedly.

Not with STL, if the structure of your program changes often : you would
have to rewrite a new snippet often as well.

> I would still like to a see a clear, concise and easy to read example that
> shows:
> * The example can't be expressed neatly with V1.

I think I answered that.

> * The example can't be expressed neatly with standard tools, such as
> Boost.Range + Boost.Lamba/Phoenix,
>

Why don't you show me how to do it with Range + Lambda, and if necessary
I'll move to more complicated examples?


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk