Thread overview
Cover handler for a statement or a block of statements.
Jun 08, 2011
vincent
Jun 08, 2011
Jonathan M Davis
Jun 08, 2011
simendsjo
June 08, 2011
Cover handler for a statement or a block of statements.

I would like to suggest a method for defining code statement
covering. Some examp1es of a cover are as follows :-
  - try ... finally - this is defined in dotnet as a using
  - try ... (catch)+
  - cursor save and display others ... restore saved cursor

a possible syntax -

  cover hourglass(Application &app)
  {
    Cursor save = app.cursor;
	app.cursor = HOURGLASS_CURSOR;
	~ code ~
	app.cursor = save;
  }

usage could be something like -

  void function(Application &app)
  {
    hourglass(app)
    {
      ... // code to be run by cover
    }
  }
June 08, 2011
On 2011-06-08 12:06, vincent wrote:
> Cover handler for a statement or a block of statements.
> 
> I would like to suggest a method for defining code statement
> covering. Some examp1es of a cover are as follows :-
> - try ... finally - this is defined in dotnet as a using
> - try ... (catch)+
> - cursor save and display others ... restore saved cursor
> 
> a possible syntax -
> 
> cover hourglass(Application &app)
> {
> Cursor save = app.cursor;
> app.cursor = HOURGLASS_CURSOR;
> ~ code ~
> app.cursor = save;
> }
> 
> usage could be something like -
> 
> void function(Application &app)
> {
> hourglass(app)
> {
> ... // code to be run by cover
> }
> }

That would typically be done with either a struct with a destructor or with a scope statement.

- Jonathan M Davis
June 08, 2011
On 08.06.2011 21:09, Jonathan M Davis wrote:
> On 2011-06-08 12:06, vincent wrote:
>> Cover handler for a statement or a block of statements.
>>
>> I would like to suggest a method for defining code statement
>> covering. Some examp1es of a cover are as follows :-
>> - try ... finally - this is defined in dotnet as a using
>> - try ... (catch)+
>> - cursor save and display others ... restore saved cursor
>>
>> a possible syntax -
>>
>> cover hourglass(Application&app)
>> {
>> Cursor save = app.cursor;
>> app.cursor = HOURGLASS_CURSOR;
>> ~ code ~
>> app.cursor = save;
>> }
>>
>> usage could be something like -
>>
>> void function(Application&app)
>> {
>> hourglass(app)
>> {
>> ... // code to be run by cover
>> }
>> }
>
> That would typically be done with either a struct with a destructor or with a
> scope statement.
>
> - Jonathan M Davis

To give Jonathan's answer an example.
import std.stdio;

void main() {

    class Cursor {
        string name = "regular";
    }

    class Application {
        private Cursor _cursor;

        @property Cursor cursor() {
            return _cursor;
        }

        @property void cursor(Cursor value) {
            writeln("setting cursor ", value.name);
            _cursor = value;
        }

        this() { _cursor = new Cursor(); }
    }

    auto app = new Application();

    auto HOURGLASS_CURSOR = new Cursor();
    HOURGLASS_CURSOR.name = "hourglass";

    writeln("try/finally:");

    auto save = app.cursor;
    try {
        app.cursor = HOURGLASS_CURSOR;
        writeln("code here");
    } finally {
        app.cursor = save;
    }

    writeln("\nor scope(exit):");

    {
        save = app.cursor;
        scope(exit) app.cursor = save;
        app.cursor = HOURGLASS_CURSOR;
        writeln("code here");
    }
}

Outputs

try/finally:
setting cursor hourglass
code here
setting cursor regular

or scope(exit):
setting cursor hourglass
code here
setting cursor regular