src/output-impl.lisp: Add a debugging dump of the known constraints.
[sod] / lib / sod.h
index 919b927..dc85843 100644 (file)
--- a/lib/sod.h
+++ b/lib/sod.h
@@ -7,7 +7,7 @@
 
 /*----- Licensing notice --------------------------------------------------*
  *
- * This file is part of the Sensble Object Design, an object system for C.
+ * This file is part of the Sensible Object Design, an object system for C.
  *
  * The SOD Runtime Library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public License as
   extern "C" {
 #endif
 
+/*----- Preliminary utilities ---------------------------------------------*/
+
+/* --- @SOD__CAR@ --- *
+ *
+ * Arguments:  @...@ = a nonempty list of arguments
+ *
+ * Returns:    The first argument only.
+ */
+
+#if __STDC_VERSION__ >= 199901
+#  define SOD__CAR(...) SOD__CARx(__VA_LIST__, _)
+#  define SOD__CARx(a, ...) a
+#endif
+
 /*----- Header files ------------------------------------------------------*/
 
 #include <stdarg.h>
@@ -53,7 +67,7 @@ struct sod_vtable {
  * these.
  */
 struct sod_instance {
-  struct sod_vtable *_vt;              /* Pointer to (chain's) vtable */
+  const struct sod_vtable *_vt;                /* Pointer to (chain's) vtable */
 };
 
 /* Information about a particular chain of superclasses.  In each class,
@@ -76,14 +90,15 @@ struct sod_chain {
  * Arguments:  @chead@ = nickname of target chain's head
  *             @obj@ = pointer to an instance chain
  *
- * Returns:    Pointer to target chain, as a @char *@.
+ * Returns:    Pointer to target chain, as a @void *@.
  *
  * Use:                Utility for implementing cross-chain upcasts.  It's probably
  *             not that clever to use this macro directly; it's used to make
  *             the automatically-generated upcast macros more palatable.
  */
 
-#define SOD_XCHAIN(chead, obj) ((char *)(obj) + (obj)->_vt->_off_##chead)
+#define SOD_XCHAIN(chead, obj)                                         \
+  ((void *)((char *)(obj) + (obj)->_vt->_off_##chead))
 
 /* --- @SOD_OFFSETDIFF@ --- *
  *
@@ -130,7 +145,7 @@ struct sod_chain {
  *
  * Arguments:  @p@ = pointer to an instance chain
  *
- * Returns:    A pointer to the instance's class, as a const SodClass.
+ * Returns:    A pointer to the instance's class, as a @const SodClass *@.
  */
 
 #define SOD_CLASSOF(obj) ((const SodClass *)(obj)->_vt->_class)