BEAST - Free Software Audio Synthesizer and Tracker  0.10.0
bseobject.hh
Go to the documentation of this file.
1  // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html
2 #ifndef __BSE_OBJECT_H__
3 #define __BSE_OBJECT_H__
4 
5 #include <bse/bseparam.hh>
6 
7 namespace Bse {
8 
9 class ObjectImpl : public virtual ObjectIface {
10  BseObject *gobject_;
11 public:
12  explicit ObjectImpl (BseObject*);
13  virtual ~ObjectImpl ();
14  virtual std::string debug_name () override;
15  virtual int64_t proxy_id () override;
16  void changed (const String &what);
17  operator BseObject* () { return gobject_; }
18  // template<class BseObjectPtr> BseObjectPtr as (); // provided by ObjectIface
19  virtual BseObject* as_bse_object () override { return gobject_; }
20 };
22 
23 } // Bse
24 
25 
26 G_BEGIN_DECLS
27 
28 /* --- BSE type macros --- */
29 #define BSE_TYPE_OBJECT (BSE_TYPE_ID (BseObject))
30 #define BSE_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BSE_TYPE_OBJECT, BseObject))
31 #define BSE_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), BSE_TYPE_OBJECT, BseObjectClass))
32 #define BSE_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BSE_TYPE_OBJECT))
33 #define BSE_IS_OBJECT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), BSE_TYPE_OBJECT))
34 #define BSE_OBJECT_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), BSE_TYPE_OBJECT, BseObjectClass))
35 
36 /* --- object member/convenience macros --- */
37 #define BSE_OBJECT_TYPE(object) (G_TYPE_FROM_INSTANCE (object))
38 #define BSE_OBJECT_TYPE_NAME(object) (g_type_name (BSE_OBJECT_TYPE (object)))
39 #define BSE_OBJECT_UNAME(object) ((gchar*) g_datalist_id_get_data (&((GObject*) (object))->qdata, bse_quark_uname))
40 #define BSE_OBJECT_FLAGS(object) (((BseObject*) (object))->flags)
41 #define BSE_OBJECT_SET_FLAGS(object, f) (BSE_OBJECT_FLAGS (object) |= (f))
42 #define BSE_OBJECT_UNSET_FLAGS(object, f) (BSE_OBJECT_FLAGS (object) &= ~(f))
43 #define BSE_OBJECT_IS_LOCKED(object) (((BseObject*) (object))->lock_count > 0)
44 #define BSE_OBJECT_DISPOSING(object) ((BSE_OBJECT_FLAGS (object) & BSE_OBJECT_FLAG_DISPOSING) > 0)
45 #define BSE_OBJECT_IN_RESTORE(object) ((BSE_OBJECT_FLAGS (object) & BSE_OBJECT_FLAG_IN_RESTORE) > 0)
46 #define BSE_OBJECT_ID(object) (((BseObject*) (object))->unique_id)
47 
48 /* --- object flags --- */
49 typedef enum /*< skip >*/
50 {
51  BSE_OBJECT_FLAG_FIXED_UNAME = 1 << 0,
52  BSE_OBJECT_FLAG_DISPOSING = 1 << 1,
53  BSE_OBJECT_FLAG_IN_RESTORE = 1 << 2
54 } BseObjectFlags;
55 #define BSE_OBJECT_FLAGS_USHIFT (3)
56 #define BSE_OBJECT_FLAGS_MAX_SHIFT (16)
57 
58 G_END_DECLS // BseObject templates need C++ linkage
59 
60 /* --- typedefs & structures --- */
61 struct BseObject : GObject {
62  Bse::ObjectImpl *cxxobject_;
63  Bse::ObjectImplP *cxxobjref_; // shared_ptr that keeps a reference on cxxobject_ until dispose()
64  guint16 flags;
65  guint16 lock_count;
66  guint unique_id;
67  operator Bse::ObjectImpl* () { return cxxobject_; }
68  // DERIVES_shared_ptr (uses void_t to prevent errors for T without shared_ptr's typedefs)
69  template<class T, typename = void> struct DERIVES_shared_ptr : std::false_type {};
70  template<class T> struct DERIVES_shared_ptr<T, Rapicorn::void_t< typename T::element_type > > :
71  std::is_base_of< std::shared_ptr<typename T::element_type>, T > {};
72  // as<T*>()
73  template<class ObjectImplPtr, typename ::std::enable_if<std::is_pointer<ObjectImplPtr>::value, bool>::type = true>
74  ObjectImplPtr as ()
75  {
76  static_assert (std::is_pointer<ObjectImplPtr>::value, "");
77  typedef typename std::remove_pointer<ObjectImplPtr>::type ObjectImplT;
79  return dynamic_cast<ObjectImplPtr> (cxxobject_);
80  }
81  // as<shared_ptr<T>>()
82  template<class ObjectImplP, typename ::std::enable_if<DERIVES_shared_ptr<ObjectImplP>::value, bool>::type = true>
83  ObjectImplP as ()
84  {
85  typedef typename ObjectImplP::element_type ObjectImplT;
87  ObjectImplT *impl = this && cxxobject_ ? as<ObjectImplT*>() : NULL;
88  return impl ? Rapicorn::shared_ptr_cast<ObjectImplT> (impl) : NULL;
89  }
90 };
91 
92 G_BEGIN_DECLS // BseObject templates need C++ linkage
93 
94 struct BseObjectClass : GObjectClass {
95  gboolean (*editable_property) (BseObject *object, /* for set_property/get_property implementations */
96  guint param_id,
97  GParamSpec *pspec);
98  /* custom methods for specific object needs, most of them require chaining */
99  gboolean (*check_pspec_editable) (BseObject *object, /* for containers */
100  GParamSpec *pspec);
101  void (*set_uname) (BseObject *object,
102  const gchar *uname);
103  void (*store_private) (BseObject *object,
104  BseStorage *storage);
105  void (*restore_start) (BseObject *object,
106  BseStorage *storage);
107  GTokenType (*restore_private) (BseObject *object,
108  BseStorage *storage,
109  GScanner *scanner);
110  void (*restore_finish) (BseObject *object,
111  guint vmajor,
112  guint vminor,
113  guint vmicro);
114  void (*unlocked) (BseObject *object);
115  BseIc0n* (*get_icon) (BseObject *object);
116 };
117 
118 /* --- object class API ---*/
119 void bse_object_class_add_property (BseObjectClass *oclass,
120  const gchar *property_group,
121  guint property_id,
122  GParamSpec *pspec);
123 void bse_object_class_add_grouped_property (BseObjectClass *oclass,
124  guint property_id,
125  GParamSpec *pspec);
126 #define bse_object_class_add_param bse_object_class_add_property
127 guint bse_object_class_add_signal (BseObjectClass *oclass,
128  const gchar *signal_name,
129  GType return_type,
130  guint n_params,
131  ...);
132 guint bse_object_class_add_asignal (BseObjectClass *oclass,
133  const gchar *signal_name,
134  GType return_type,
135  guint n_params,
136  ...);
137 guint bse_object_class_add_dsignal (BseObjectClass *oclass,
138  const gchar *signal_name,
139  GType return_type,
140  guint n_params,
141  ...);
142 
143 
144 /* --- object API --- */
145 GObject* bse_object_new (GType object_type, const gchar *first_property_name, ...);
146 GObject* bse_object_new_valist (GType object_type, const gchar *first_property_name, va_list var_args);
147 void bse_object_lock (gpointer object);
148 void bse_object_unlock (gpointer object);
149 gboolean bse_object_editable_property (gpointer object,
150  const gchar *property);
151 BseIc0n* bse_object_get_icon (BseObject *object);
152 void bse_object_notify_icon_changed (BseObject *object);
153 BseObject* bse_object_from_id (guint unique_id);
154 GList* bse_objects_list (GType type);
155 GList* bse_objects_list_by_uname (GType type,
156  const gchar *uname);
157 void bse_object_debug_leaks (void);
158 const gchar* bse_object_debug_name (gpointer object);
159 gchar* bse_object_strdup_debug_handle (gpointer object);
160 void bse_object_restore_start (BseObject *object,
161  BseStorage *storage);
162 void bse_object_restore_finish (BseObject *object,
163  guint vmajor,
164  guint vminor,
165  guint vmicro);
166 void bse_object_reemit_signal (gpointer src_object,
167  const gchar *src_signal,
168  gpointer dest_obejct,
169  const gchar *dest_signal);
170 void bse_object_remove_reemit (gpointer src_object,
171  const gchar *src_signal,
172  gpointer dest_object,
173  const gchar *dest_signal);
174 static inline void
175 bse_object_proxy_notifies (gpointer src_object,
176  gpointer dest_object,
177  const gchar *dest_signal)
178 {
179  bse_object_reemit_signal (src_object, "notify::uname", dest_object, dest_signal);
180  bse_object_reemit_signal (src_object, "icon-changed", dest_object, dest_signal);
181 }
182 static inline void
183 bse_object_unproxy_notifies (gpointer src_object,
184  gpointer dest_object,
185  const gchar *dest_signal)
186 {
187  bse_object_remove_reemit (src_object, "notify::uname", dest_object, dest_signal);
188  bse_object_remove_reemit (src_object, "icon-changed", dest_object, dest_signal);
189 }
190 
191 
192 /* --- implementation details --- */
193 extern GQuark bse_quark_uname;
194 void bse_object_marshal_signal (GClosure *closure,
195  GValue /*out*/ *return_value,
196  guint n_param_values,
197  const GValue *param_values,
198  gpointer invocation_hint,
199  gpointer marshal_data);
200 
201 G_END_DECLS
202 
203 #endif /* __BSE_OBJECT_H__ */
The Bse namespace contains all functions of the synthesis engine.
Definition: bstbseutils.cc:88
Definition: bstserverapi.cc:585
typedef int64_t
gchar * bse_object_strdup_debug_handle(gpointer object)
Definition: bseobject.cc:117
STL class.
virtual std::string debug_name() override
See Object::debug_name()
Definition: bseobject.cc:33
Definition: bseobject.hh:61
Definition: bseobject.hh:94
Definition: bsestorage.hh:49
See also the corresponding IDL class Object.
Definition: bseserverapi.hh:600
Definition: bseobject.hh:9
virtual int64_t proxy_id() override
See Object::proxy_id()
Definition: bseobject.cc:39
Definition: bseobject.hh:69
uname