aboutsummaryrefslogtreecommitdiff
path: root/src/waffle/core/wcore_window.h
diff options
context:
space:
mode:
authorChad Versace <chad.versace@linux.intel.com>2012-05-31 21:57:40 -0700
committerChad Versace <chad.versace@linux.intel.com>2012-06-03 16:29:43 -0700
commit602fc904b0b15d4841c7a40a27d50351e9147296 (patch)
tree1a6379a2302dc156462b2d4ffb778dee1c350b9b /src/waffle/core/wcore_window.h
parent50b0bca22427bf2890ac07cee2b61cfa4fcd8240 (diff)
downloadwaffle-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.h80
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;
+}