• 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
    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 {
        (*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>
Last commit
Last update
bin Loading commit data...
cmake/Modules Loading commit data...
doc Loading commit data...
doxygen Loading commit data...
examples Loading commit data...
include Loading commit data...
src Loading commit data...
tests Loading commit data...
.gitignore Loading commit data...
CMakeLists.txt Loading commit data...
LICENSE.txt Loading commit data...
README.txt Loading commit data...
waffle.pc.in Loading commit data...