diff --git a/sys/sys/kobj.h b/sys/sys/kobj.h --- a/sys/sys/kobj.h +++ b/sys/sys/kobj.h @@ -131,14 +131,8 @@ * DEFINE_CLASS_1(foo, foo_class, foo_methods, sizeof(foo_softc), * bar); */ -#define DEFINE_CLASS_1(name, classvar, methods, size, \ - base1) \ - \ -static kobj_class_t name ## _baseclasses[] = \ - { &base1, NULL }; \ -struct kobj_class classvar = { \ - #name, methods, size, name ## _baseclasses \ -} +#define DEFINE_CLASS_1(name, classvar, methods, size, base1) \ + DEFINE_CLASSN(name, classvar, methods, size, base1) /* * Define a class inheriting two base classes. Use like this: @@ -146,15 +140,8 @@ * DEFINE_CLASS_2(foo, foo_class, foo_methods, sizeof(foo_softc), * bar, baz); */ -#define DEFINE_CLASS_2(name, classvar, methods, size, \ - base1, base2) \ - \ -static kobj_class_t name ## _baseclasses[] = \ - { &base1, \ - &base2, NULL }; \ -struct kobj_class classvar = { \ - #name, methods, size, name ## _baseclasses \ -} +#define DEFINE_CLASS_2(name, classvar, methods, size, base1, base2) \ + DEFINE_CLASSN(name, classvar, methods, size, base1, base2) /* * Define a class inheriting three base classes. Use like this: @@ -162,17 +149,62 @@ * DEFINE_CLASS_3(foo, foo_class, foo_methods, sizeof(foo_softc), * bar, baz, foobar); */ -#define DEFINE_CLASS_3(name, classvar, methods, size, \ - base1, base2, base3) \ - \ -static kobj_class_t name ## _baseclasses[] = \ - { &base1, \ - &base2, \ - &base3, NULL }; \ -struct kobj_class classvar = { \ - #name, methods, size, name ## _baseclasses \ +#define DEFINE_CLASS_3(name, classvar, methods, size, base1, base2, base3) \ + DEFINE_CLASSN(name, classvar, methods, size, base1, base2, base3) + +/* + * Define a class with unspecified visibility (presently public) + * inheriting any number (including zero) base classes. Use like this: + * + * DEFINE_CLASSN(foo, foo_class, foo_methods, sizeof(foo_softc)[, + * bar[, baz[, foobar]]]); + */ +#define DEFINE_CLASSN(_name, _classvar, _methods, _size, ...) \ + PUBLIC_DEFINE_CLASSN(_name, _classvar, _methods, _size, __VA_ARGS) + +/* + * Define a public class inheriting any number (including zero) base + * classes. Use like this: + * + * PUBLIC_DEFINE_CLASSN(foo, foo_class, foo_methods, sizeof(foo_softc)[, + * bar[, baz[, foobar]]]); + */ +#define PUBLIC_DEFINE_CLASSN(_name, _classvar, _methods, _size, ...) \ + \ +__VA_OPT__(static kobj_class_t _name ## _baseclasses[] = { \ + __DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__), NULL }); \ +struct kobj_class _classvar = { \ + .name = #_name, \ + .methods = _methods, \ + .size = _size, \ + __VA_OPT__(.baseclasses = _name ## _baseclasses,) \ } +/* + * Define a private class inheriting any number (including zero) base + * classes. Use like this: + * + * PRIVATE_DEFINE_CLASSN(foo, foo_class, foo_methods, sizeof(foo_softc)[, + * bar[, baz[, foobar]]]); + */ +#define PRIVATE_DEFINE_CLASSN(_name, _classvar, _methods, _size, ...) \ + \ +__VA_OPT__(static kobj_class_t _name ## _baseclasses[] = { \ + __DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__), NULL }); \ +static struct kobj_class _classvar = { \ + .name = #_name, \ + .methods = _methods, \ + .size = _size, \ + __VA_OPT__(.baseclasses = _name ## _baseclasses,) \ +} + +/* Helper macros for the above, adding ampersands to parent class names */ +#define __DEFINE_CLASSN_BASE_EXPANDER(_base, ...) \ + &_base __VA_OPT__(, ___DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__)) + +#define ___DEFINE_CLASSN_BASE_EXPANDER(_base, ...) \ + &_base __VA_OPT__(, __DEFINE_CLASSN_BASE_EXPANDER(__VA_ARGS__)) + /* * Compile the method table in a class. */