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