From c60b3a96cf9bfedbfc402a50e0b85f22d231d67b Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Wed, 16 Oct 2024 19:41:27 -0600 Subject: wip lib9o --- lib9o/include/lib9o/lib9o.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 lib9o/include/lib9o/lib9o.h (limited to 'lib9o/include') diff --git a/lib9o/include/lib9o/lib9o.h b/lib9o/include/lib9o/lib9o.h new file mode 100644 index 0000000..ed22293 --- /dev/null +++ b/lib9o/include/lib9o/lib9o.h @@ -0,0 +1,27 @@ +/* lib9o.h - A simple Go-ish object system built on GCC -fplan9-extensions + * + * Copyright (C) 2024 Luke T. Shumaker + * SPDX-Licence-Identifier: AGPL-3.0-or-later + */ + +#ifndef _LIB9O_H_ +#define _LIB9O_H_ + +#include /* for assert() and static_assert() */ +#include /* for offsetof() */ + +#define MCALL(o, m, ...) \ + ({ \ + assert(o); \ + (o)->vtable->m(o __VA_OPT__(,) __VA_ARGS__); \ + }) + +#define MSELF(obj_typ, iface_typ, iface_ptr) \ + ({ \ + static_assert(_Generic(iface_ptr, iface_typ *: 1, default: 0), \ + "typeof("#iface_ptr") != "#iface_typ); \ + assert(iface_ptr); \ + ((obj_typ*)(((void*)iface_ptr)-offsetof(obj_typ,iface_typ))); \ + }) + +#endif /* _LIB9O_H_ */ -- cgit v1.2.3-2-g168b