Boost logo

Boost :

Subject: Re: [boost] [contract] diff n1962
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2010-04-30 13:53:29

On Thu, Apr 15, 2010 at 7:02 PM, Alexander Nasonov <alnsn_at_[hidden]> wrote:
> vicente.botet wrote:
>> VBE> Boost.ScopeExit showed a technique that can be used to
>> emulate local functions. Alexander proposed long time ago to provide
>> it independently from ScopeExit but to my knowledge this has not
>> been done.
> Sorry for the late reply, I'm not following every boost thread, I got
> this message via google alerts.

No problem: There is no rush and thanks a lot for your reply.

> Yes, this has not been done. Local function can borrow argument
> binding syntax from ScopeExit but there are other things I need to think
> of. For instance, in
>    (BOOST_LOCAL_FUNCTION_BIND( (a)(&b) ), int c)) {
>    // ...
> syntax, is there any way to shorten BOOST_LOCAL_FUNCTION_BIND to "bind"?

For using this in Boost.Contract I see the following issues:
1) The CONTRACT_BLOCK_INVARIANT() macro will have to take as
parameters also `a`, `&b`, `int`, `c`, etc. This is as complex as
requesting the user to program a separate (private) member const
function with these const parameters and then call that function to
check the block invariant condition in a constant-correct context:

   struct x {
       void f(int a) {
           int b = a;
           // CONTRACT_BLOCK_INVARIANT(a == b); // Don't use this
because it is not const-correct.
           CONTRACT_BLOCK_INVARIANT(equal(a, b)); // Const-correct.
        bool equal(const int& a, cont int& b) const { return a == b; }
// Const-correct for a, b, and object this.

2) How do I make the object (this) available within the local
function? I could pass it as a 'self' parameter but then the assertion
code will have to say, for example, `self.size()` instead of just
`size()` and that is less readable...

> The syntax doesn't have to be exactly as above. If someone could
> take a lead on this it would be great. I don't have time for this,
> I'm afraid.

I will experiment with this a bit more. If I can use
issues 1) and 2) above) then I am happy to take the lead in separating
this functionality from Boost.ScopeExit as part of Boost.Contract


Boost list run by bdawes at, gregod at, cpdaniel at, john at