Skip to content
  • Chad Versace's avatar
    all: Replace tagged unions with a more traditional object model · 602fc904
    Chad Versace authored
    This rewrites the bulk of Waffle's code.
    
    When I first began writing Waffle, I wanted to experiment with
    a non-traditional object model that used tagged unions. Very soon I began
    to abhor the "innovative" decision. This patch replaces the tagged-union
    model with a more traditional object model (as found in the Linux kernel
    [1], Google's NaCl, libdrm, and many other places) that uses vtables and
    embedded structures.
    
    [1] Neil Brown. LWN, 2011 June 1. Object-oriented design patterns in the kernel.
        (Part 1: http://lwn.net/Articles/444910/).
        (Part 2: http://lwn.net/Articles/446317/
    
    ).
    
    As an example of the new object model, below is an outline of how
    waffle_window_swap_buffers() is now implemeneted.
    
    // file: waffle_window.c
    
    bool
    waffle_window_swap_buffers(struct waffle_window *self)
    {
        struct wcore_window *wc_self = wcore_window(self); // safe cast
        // Check preconditions ...
        return wc_self->vtbl->swap_buffers(wc_self);
    }
    
    // file: wcore_window.h
    
    struct wcore_window_vtbl {
        bool
        (*swap_buffers)(struct wcore_window *self);
        // More member functions ...
    };
    
    struct wcore_window {
        const struct wcore_window_vtbl *vtbl;
        struct waffle_window {} wfl;
        // More members ...
    };
    
    // file: glx_window.h
    
    struct glx_window {
        struct wcore_window wcore;
        // More members ...
    };
    
    // file: glx_window.c
    
    static bool
    glx_window_swap_buffers(struct wcore_window *wc_self)
    {
        struct glx_window *self = glx_window(wc_self); // safe cast
        // Call glXSwapBuffers ...
        return true;
    }
    
    static const struct wcore_window_vtbl glx_window_wcore_vtbl = {
        .swap_buffers = glx_window_swap_buffers,
        // More members ...
    };
    
    Signed-off-by: default avatarChad Versace <chad.versace@linux.intel.com>
    602fc904