]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/smobs.hh
Define derived_unsmob<class T> function
[lilypond.git] / lily / include / smobs.hh
index 3ee2ef80abce09b44b2acadf1081173eb6579ce6..138bf363469ded7281485af6996a98f49ca87a38 100644 (file)
 // class) to make sure the variable is actually instantiated.
 
 class Scm_init {
+  static const Scm_init * list_;
+  void (*const fun_)(void);
+  Scm_init const * const next_;
+  Scm_init ();          // don't use default constructor, don't define
+  Scm_init (const Scm_init &);  // don't define copy constructor
 public:
-  Scm_init () { }
-  Scm_init (void (*fun) (void))
-  {
-    add_scm_init_func (fun);
-  }
+  Scm_init (void (*fun) (void)) : fun_ (fun), next_ (list_)
+  { list_ = this; }
+  static void init ();
 };
 
 template <class Super>
@@ -231,6 +234,14 @@ public:
   }
 };
 
+// derived_unsmob includes a dynamic_cast:
+
+template <class T>
+inline T *derived_unsmob (SCM arg)
+{
+  return dynamic_cast<T *> (T::unsmob (arg));
+}
+
 // Simple smobs
 template <class Super>
 class Simple_smob : public Smob_base<Super> {