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

Reply via email to