mpd

GStreamer element: "parent_class" idiom in the boilerplate

May 21, 2023 21:28

https://dememax.dreamwidth.org/185986.html

Как в glib, в GStreamer имя "parent_class" используется для определения первого поля структуры нового класса, например:
struct _GTypeModuleClass
{
  GObjectClass parent_class;
...Для нового элемента в GStreamer используется макро G_DEFINE_TYPE (которое раскрывается в DEFINE_TYPE_EXTENDED) из GObject:
https://gitlab.gnome.org/GNOME/glib/-/blob/main/gobject/gtype.h

Это макро рассчитано на использование в исходнике (some_object.c), оно определяет среди прочего статическую глобальную переменную:
static gpointer some_object_parent_class = NULL;В GStreamer идут дальше и используют перед макро G_DEFINE_TYPE дополнительный дефайн:
#define some_object_parent_class parent_classНо обратите внимание, обычно дефайн используется следующим образом:
#define something_new something_already_definedА в этой GStreamer parent_class idiom получается наоборот:
#define something_intermediate new_symbol_that_will_be_usedТ.е., что мне не нравится:
  1. используется одно и то же имя для поля в определении структуры класса, и для глобальной статической переменной.
  2. вспомогательное макро запутывает порядком, к тому же, надо знать, что переопределяемое дефайном имя - промежуточное и используется исключительно в макро G_DEFINE_TYPE
Масштаб этого носит такой характер в моно-репо GStreamer:
> git grep -n -H -E "^ +G[0-9a-zA-Z_]+ +parent_class;$" | wc
   1225    3675  117823
> git grep -n -H -E "#define +(\w+_)+parent_class +parent_class$" | wc
    748    2244   83736
Update: Совсем забыл сказать, для чего это всё делается (define ..._parent_class parent_class), чтобы не писать длинно:
G_OBJECT_CLASS (some_class_parent_class)->finalize (object);а коратко
G_OBJECT_CLASS (parent_class)->finalize (object);Всё!
Но иногда в исходнике других упоминаний parent_class нет вообще, и это ещё больше меня расстраивает.
Зачем?!
"Один ответ на это есть!" Boilerplate! В смысле, copy-past technology!

Update 2: Мло того, есть ещё и в обратную сторону:
> git grep -n -H -E "^ *# *define +parent_class +.*_parent_class *$" | wc
146 438 16605
> git grep -n -H -E "^ *# *define +.*_parent_class +parent_class *$" | wc
748 2244 83736

plain c, gstreamer, работа, казус

Previous post Next post
Up