]> git.jsancho.org Git - guile-irrlicht.git/blobdiff - src/reference-counted.cpp
Some doc
[guile-irrlicht.git] / src / reference-counted.cpp
index b13cbb02f799c656c7c65a652147209d90a4837e..24394a4d850a67dd90d887aecf5f6a4fde4b6ee6 100644 (file)
 
 #include <irrlicht/irrlicht.h>
 #include <libguile.h>
-
-#include "device.h"
 #include "gsubr.h"
 #include "reference-counted.h"
-#include "scene-node-animator.h"
-
-extern "C" {
-
-  DEFINE_WRAPPED_TYPE (irr::IReferenceCounted*, "reference-counted",
-                       init_reference_counted_type, reference_counted_p,
-                       wrap_reference_counted, unwrap_reference_counted);
+#include "wrapped.h"
 
-  void
-  init_reference_counted (void)
-  {
-    init_reference_counted_type ();
-    DEFINE_GSUBR ("drop!", 1, 0, 0, irr_drop);
-  }
+using namespace irr;
 
-  bool
-  is_reference_counted_object (SCM wrapped_obj)
-  {
-    return
-      device_p (wrapped_obj) ||
-      reference_counted_p (wrapped_obj) ||
-      scene_node_animator_p (wrapped_obj);
-  }
-
-  SCM
-  irr_drop (SCM wrapped_obj)
-  {
-    if (is_reference_counted_object (wrapped_obj))
-      {
-        irr::IReferenceCounted* obj = unwrap_reference_counted (wrapped_obj, false);
-        return scm_from_bool (obj->drop ());
-      }
-    else
-      {
-        scm_error (scm_arg_type_key, NULL, "Object cannot be dropped: ~S",
-                   scm_list_1 (wrapped_obj), scm_list_1 (wrapped_obj));
-      }
-  }
+template <typename T>
+SCM
+IReferenceCounted_drop (SCM obj)
+{
+  return scm_from_bool (((T) scm_to_irr_pointer (obj))->drop ());
+}
 
+void
+init_reference_counted (void)
+{
+  DEFINE_GSUBR ("IrrlichtDevice_drop", 1, 0, 0, IReferenceCounted_drop<IrrlichtDevice*>);
+  DEFINE_GSUBR ("ISceneNodeAnimator_drop", 1, 0, 0,
+                IReferenceCounted_drop<scene::ISceneNodeAnimator*>);
 }