On Monday, 31 October 2016 at 16:55:51 UTC, WhatMeWorry wrote:

Is there a way to turn off nothrow or work around it? Because to me it looks like nothrow prevents me from doing anything useful.

extern(C) void onKeyEvent(GLFWwindow* window, int key, int scancode, int action, int modifier) nothrow
{
    if(queue.roomInQueue())
    {
        auto event = new Event;
        event.type = EventType.keyboard;
        event.keyboard.key = cast(Key) key;

        // etc.
}

Error: function 'event_handler.CircularQueue.roomInQueue' is not nothrow Error: function 'event_handler.onKeyEvent' is nothrow yet may throw


The compiler wouldn't let me just remove "nothrow" from the function. I tried a kludge where I had this function just pass all its parameters to another throwable function, but this caused errors as well.

So I'm stuck.  Anyone know how to proceed.
Thanks.

If you can't change the interface of CiricularQueue to be nothrow and don't want to wrap everything in a try...catch block, then just use a dynamic array. You can also use the old C union trick to avoid the need to allocate every event. That's the same thing SDL does. Something like this:

```
enum EventType {
   key,
   mouse,
}

struct KeyEvent {
   EventType type;
   ...

   this(...)
   {
        this.type = EventType.key;
        ...
   }
}

struct MouseEvent {
   EventType type;
   ...

   this(...)
   {
        this.type = EventType.mouse;
        ...
   }
}

union Event {
   EventType type;
   KeyEvent key;
   MouseEvent mouse;
}

Event[] eventq;
extern(C) void onKeyEvent(GLFWwindow* window, int key, int scancode, int action, int modifier) nothrow {
    Event event;
    event.key = KeyEvent(window, key, scancode, action, modifier);
    eventq ~= event;
}
```

Reply via email to