diff options
author | Chad Versace <chad.versace@linux.intel.com> | 2012-05-31 21:57:40 -0700 |
---|---|---|
committer | Chad Versace <chad.versace@linux.intel.com> | 2012-06-03 16:29:43 -0700 |
commit | 602fc904b0b15d4841c7a40a27d50351e9147296 (patch) | |
tree | 1a6379a2302dc156462b2d4ffb778dee1c350b9b /src/waffle/core/wcore_window.h | |
parent | 50b0bca22427bf2890ac07cee2b61cfa4fcd8240 (diff) | |
download | waffle-602fc904b0b15d4841c7a40a27d50351e9147296.tar.gz |
all: Replace tagged unions with a more traditional object model
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: Chad Versace <chad.versace@linux.intel.com>
Diffstat (limited to 'src/waffle/core/wcore_window.h')
-rw-r--r-- | src/waffle/core/wcore_window.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/src/waffle/core/wcore_window.h b/src/waffle/core/wcore_window.h new file mode 100644 index 0000000..c642e80 --- /dev/null +++ b/src/waffle/core/wcore_window.h @@ -0,0 +1,80 @@ +// Copyright 2012 Intel Corporation +// +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, this +// list of conditions and the following disclaimer. +// +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#pragma once + +#include <stdbool.h> +#include <stdlib.h> + +#include "wcore_config.h" +#include "wcore_util.h" + +struct wcore_window; + +struct wcore_window_vtbl { + bool + (*destroy)(struct wcore_window *self); + + bool + (*show)(struct wcore_window *self); + + bool + (*swap_buffers)(struct wcore_window *self); +}; + +struct wcore_window { + const struct wcore_window_vtbl *vtbl; + + struct waffle_window {} wfl; + struct api_object api; + + struct wcore_display *display; +}; + +DEFINE_CONTAINER_CAST_FUNC(wcore_window, + struct wcore_window, + struct waffle_window, + wfl) + + +static inline bool +wcore_window_init(struct wcore_window *self, + struct wcore_config *config) +{ + assert(self); + assert(config); + + self->api.display_id = config->display->api.display_id; + self->display = config->display; + + return true; +} + +static inline bool +wcore_window_teardown(struct wcore_window *self) +{ + assert(self); + return true; +} |