提交 93c511a1 编写于 作者: A Anthony Liguori

qom: allow object_class_foreach to take additional parameters to refine search

Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 18b6dade
...@@ -431,6 +431,7 @@ const char *object_class_get_name(ObjectClass *klass); ...@@ -431,6 +431,7 @@ const char *object_class_get_name(ObjectClass *klass);
ObjectClass *object_class_by_name(const char *typename); ObjectClass *object_class_by_name(const char *typename);
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
const char *implements_type, bool include_abstract,
void *opaque); void *opaque);
#endif #endif
...@@ -467,6 +467,8 @@ ObjectClass *object_class_by_name(const char *typename) ...@@ -467,6 +467,8 @@ ObjectClass *object_class_by_name(const char *typename)
typedef struct OCFData typedef struct OCFData
{ {
void (*fn)(ObjectClass *klass, void *opaque); void (*fn)(ObjectClass *klass, void *opaque);
const char *implements_type;
bool include_abstract;
void *opaque; void *opaque;
} OCFData; } OCFData;
...@@ -475,16 +477,28 @@ static void object_class_foreach_tramp(gpointer key, gpointer value, ...@@ -475,16 +477,28 @@ static void object_class_foreach_tramp(gpointer key, gpointer value,
{ {
OCFData *data = opaque; OCFData *data = opaque;
TypeImpl *type = value; TypeImpl *type = value;
ObjectClass *k;
type_class_init(type); type_class_init(type);
k = type->class;
data->fn(value, type->class); if (!data->include_abstract && type->abstract) {
return;
}
if (data->implements_type &&
!object_class_dynamic_cast(k, data->implements_type)) {
return;
}
data->fn(k, data->opaque);
} }
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque), void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),
const char *implements_type, bool include_abstract,
void *opaque) void *opaque)
{ {
OCFData data = { fn, opaque }; OCFData data = { fn, implements_type, include_abstract, opaque };
g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data); g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册