#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*>);
}