X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Fvirtual-methods.hh;h=e56496605d199bf526f0b037d53e9f87a920ac49;hb=13e79c0250d34b6bdfbafbc551ef64e8b59b2991;hp=ea81cbbc992fc8eb0ff9496e248de8e4d4a0825c;hpb=0dc651561ed849b121d26cbd07a192e9fefeb832;p=lilypond.git diff --git a/flower/include/virtual-methods.hh b/flower/include/virtual-methods.hh index ea81cbbc99..e56496605d 100644 --- a/flower/include/virtual-methods.hh +++ b/flower/include/virtual-methods.hh @@ -12,36 +12,48 @@ /** a macro to declare the classes name as a static and virtual function. The static_name() can *not* be inlined (this might have the effect that - s->name() != S::static_name(). Overlapping strings need not be merged in C++ + s->name() != S::static_name (). Overlapping strings need not be merged in C++ */ -#define NAME_MEMBERS() \ +#define DECLARE_MY_RUNTIME_TYPEINFO \ static char const *static_name();\ -virtual bool is_type_b(const char *)const; \ -virtual char const *name() const{ return static_name(); } \ +static bool static_is_type_b (const char*s);\ +virtual bool is_type_b (const char *s)const { return static_is_type_b (s); } \ +virtual char const *name() const{ return static_name (); } \ int a_stupid_nonexistent_function_to_allow_the_semicolon_come_out() #define IMPLEMENT_STATIC_NAME(c)\ char const *c::static_name() { return #c; } + + #define VIRTUAL_COPY_CONS(T, R)\ virtual R *clone() const { return new T(*this); } \ int yet_another_stupid_function_to_allow_semicolon() + +#define DECLARE_VIRTUAL_COPY_CONS(T,R)\ + virtual R *clone() const +#define IMPLEMENT_VIRTUAL_COPY_CONS(T,R)\ + R *T::clone() const { return new T(*this); } \ + #define IMPLEMENT_IS_TYPE_B(D) \ - bool D::is_type_b(const char *s) const \ + IMPLEMENT_STATIC_NAME(D)\ + bool D::static_is_type_b (const char *s) \ { \ return s == static_name(); \ } #define IMPLEMENT_IS_TYPE_B1(D,B) \ - bool D::is_type_b(const char *s)const \ + IMPLEMENT_STATIC_NAME(D)\ + bool D::static_is_type_b (const char *s) \ { \ - return s == static_name() || B::is_type_b(s); \ + return s == static_name() || B::static_is_type_b (s); \ } #define IMPLEMENT_IS_TYPE_B2(D, BA, BB) \ - bool D::is_type_b(const char *s) const \ + IMPLEMENT_STATIC_NAME(D)\ + bool D::static_is_type_b (const char *s) \ { \ - return s == static_name() || BA::is_type_b(s) || BB::is_type_b(s); \ + return s == static_name() || BA::static_is_type_b (s) || BB::static_is_type_b (s); \ } #endif