[gst-devel] flag macro inconsistence of gstobjec and gstminiobject
Wim Taymans
wim at fluendo.com
Sat Oct 8 07:11:34 CEST 2005
On Sat, 2005-10-08 at 15:54 +0200, Stefan Kost wrote:
> hi,
>
> was adding more macro docs here and there and notices that
>
> gstobject treats flags as bit-numbers:
>
> #define GST_FLAGS(obj) (GST_OBJECT_CAST (obj)->flags)
> /* for the flags we double-not to make them comparable to TRUE and FALSE */
> #define GST_FLAG_IS_SET(obj,flag) (!!(GST_FLAGS (obj) & (1<<(flag))))
> #define GST_FLAG_SET(obj,flag) (GST_FLAGS (obj) |= (1<<(flag)))
> #define GST_FLAG_UNSET(obj,flag) (GST_FLAGS (obj) &= ~(1<<(flag)))
>
> gstminiobject treats them as masks:
> #define GST_MINI_OBJECT_FLAGS(obj) (GST_MINI_OBJECT(obj)->flags)
> #define GST_MINI_OBJECT_FLAG_IS_SET(obj,flag)
> (GST_MINI_OBJECT_FLAGS(obj) & (flag))
> #define GST_MINI_OBJECT_FLAG_SET(obj,flag)
> (GST_MINI_OBJECT_FLAGS (obj) |= (flag))
> #define GST_MINI_OBJECT_FLAG_UNSET(obj,flag)
> (GST_MINI_OBJECT_FLAGS (obj) &= ~(flag))
>
> A quick look at gtk shows that they have:
> #define GTK_WIDGET_FLAGS(wid) (GTK_OBJECT_FLAGS (wid))
> #define GTK_WIDGET_SET_FLAGS(wid,flag) G_STMT_START{
> (GTK_WIDGET_FLAGS (wid) |= (flag)); }G_STMT_END
> #define GTK_WIDGET_UNSET_FLAGS(wid,flag) G_STMT_START{
> (GTK_WIDGET_FLAGS (wid) &= ~(flag)); }G_STMT_END
The reason for the bit-numbers is so we can say:
typedef enum
{
GST_OBJECT_DISPOSING = 0,
GST_OBJECT_FLOATING,
GST_OBJECT_FLAG_LAST = 4
} GstObjectFlags;
and then in GstElement.h, since it subclasses GstObject:
typedef enum
{
GST_ELEMENT_LOCKED_STATE = GST_OBJECT_FLAG_LAST,
GST_ELEMENT_IS_SINK,
GST_ELEMENT_UNPARENTING,
GST_ELEMENT_FLAG_LAST = GST_OBJECT_FLAG_LAST + 16
} GstElementFlags;
Changing the number of flags in GstObject.h automatically changes the
flag
numbers in all subclasses too that way. It avoids constructs like:
typedef enum
{
GST_OBJECT_DISPOSING = (1 << 0),
GST_OBJECT_FLOATING = (1 << 1),
GST_OBJECT_FLAG_LAST = 4
} GstObjectFlags;
typedef enum
{
GST_ELEMENT_LOCKED_STATE = (1 << (GST_OBJECT_FLAG_LAST + 0)),
GST_ELEMENT_IS_SINK = (1 << (GST_OBJECT_FLAG_LAST + 1)),
GST_ELEMENT_UNPARENTING = (1 << (GST_OBJECT_FLAG_LAST + 2)),
GST_ELEMENT_FLAG_LAST = GST_OBJECT_FLAG_LAST + 16
} GstElementFlags;
Where the _FLAG_LAST enum is not really a flag. Could be fixed with a
#define for the _LAST number.
Or, as wingo suggested:
typedef enum
{
GST_OBJECT_DISPOSING = (1 << 0),
GST_OBJECT_FLOATING = (1 << 1),
GST_OBJECT_FLAG_LAST = (1 << 4)
} GstObjectFlags;
typedef enum
{
GST_ELEMENT_LOCKED_STATE = (GST_OBJECT_FLAG_LAST << 0),
GST_ELEMENT_IS_SINK = (GST_OBJECT_FLAG_LAST << 1),
GST_ELEMENT_UNPARENTING = (GST_OBJECT_FLAG_LAST << 2),
GST_ELEMENT_FLAG_LAST = (GST_OBJECT_FLAG_LAST << 16)
} GstElementFlags;
Which does not seem too ugly. If you really care about this issue you
can change it to this last suggestion.
>
> Furthermore if an api break can still be done I vote to rename the
> macros in gstobject from
> GST_FLAG_* to GST_OBJECT_FLAG
>
Agreed.
Wim
> Any conclusion?
>
> Stefan
>
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by:
> Power Architecture Resource Center: Free content, downloads, discussions,
> and more. http://solutions.newsforge.com/ibmarch.tmpl
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gstreamer-devel
--
Wim Taymans <wim at fluendo.com>
More information about the gstreamer-devel
mailing list