]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/include/listener.hh
Doc: Issue 4349: Clarify where changes to beatStructure should be placed
[lilypond.git] / lily / include / listener.hh
index 0bc937f2b3b7559e212dd14950aad9d7baf7b121..959f7e510f1fa8b1c3a4d309b47b398756754f8e 100644 (file)
@@ -67,10 +67,16 @@ typedef struct
 {
   void (*listen_callback) (void *, SCM);
   void (*mark_callback) (void *);
+  bool (*equal_callback) (void *, void *);
 } Listener_function_table;
 
-class Listener
+class Listener : public Simple_smob<Listener>
 {
+public:
+  static SCM equal_p (SCM, SCM);
+  SCM mark_smob ();
+  static const char type_p_name_[];
+private:
   void *target_;
   Listener_function_table *type_;
 public:
@@ -81,11 +87,12 @@ public:
   void listen (SCM ev) const;
 
   bool operator == (Listener const &other) const
-  { return target_ == other.target_ && type_ == other.type_; }
+  {
+    return type_ == other.type_
+           && (*type_->equal_callback) ((void *) target_, (void *) other.target_);
+  }
 
-  DECLARE_SIMPLE_SMOBS (Listener);
 };
-DECLARE_UNSMOB (Listener, listener);
 
 #define IMPLEMENT_LISTENER(cl, method)                  \
 void                                                    \
@@ -100,12 +107,18 @@ cl :: method ## _mark (void *self)                      \
   cl *s = (cl *)self;                                   \
   scm_gc_mark (s->self_scm ());                         \
 }                                                       \
+bool                                                    \
+cl :: method ## _is_equal (void *a, void *b)            \
+{                                                       \
+  return a == b;                                        \
+}                                                       \
 Listener                                                \
 cl :: method ## _listener () const                      \
 {                                                       \
   static Listener_function_table callbacks;             \
   callbacks.listen_callback = &cl::method ## _callback; \
   callbacks.mark_callback = &cl::method ## _mark;       \
+  callbacks.equal_callback = &cl::method ## _is_equal;  \
   return Listener (this, &callbacks);                   \
 }
 
@@ -115,6 +128,7 @@ cl :: method ## _listener () const                      \
   inline void name (SCM);                               \
   static void name ## _callback (void *self, SCM ev);   \
   static void name ## _mark (void *self);               \
+  static bool name ## _is_equal (void *a, void *b);     \
   Listener name ## _listener () const
 
 #endif /* LISTENER_HH */