X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=flower%2Finclude%2Fvirtual-methods.hh;h=bf28b66737510b205b05074dc891d5cf353c0333;hb=81dcfb73186ab358fabd1c4278b590429d616d2d;hp=e56496605d199bf526f0b037d53e9f87a920ac49;hpb=1a66290a98e7de8d6d41485b5b71a9f7e1fe35c7;p=lilypond.git diff --git a/flower/include/virtual-methods.hh b/flower/include/virtual-methods.hh index e56496605d..bf28b66737 100644 --- a/flower/include/virtual-methods.hh +++ b/flower/include/virtual-methods.hh @@ -1,59 +1,44 @@ /* - virtual-methods.hh -- declare + virtual-methods.hh -- declare macros for our do-it-yourself RTTI source file of the Flower Library - (c) 1997 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ - #ifndef VIRTUAL_METHODS_HH #define VIRTUAL_METHODS_HH -/** 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++ - */ -#define DECLARE_MY_RUNTIME_TYPEINFO \ -static char const *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) \ - IMPLEMENT_STATIC_NAME(D)\ - bool D::static_is_type_b (const char *s) \ -{ \ - return s == static_name(); \ -} - -#define IMPLEMENT_IS_TYPE_B1(D,B) \ - IMPLEMENT_STATIC_NAME(D)\ - bool D::static_is_type_b (const char *s) \ -{ \ - return s == static_name() || B::static_is_type_b (s); \ -} -#define IMPLEMENT_IS_TYPE_B2(D, BA, BB) \ - IMPLEMENT_STATIC_NAME(D)\ - bool D::static_is_type_b (const char *s) \ -{ \ - return s == static_name() || BA::static_is_type_b (s) || BB::static_is_type_b (s); \ +#include +using namespace std; + +#define classname(class_ptr) demangle_classname (typeid (* (class_ptr))) + +char const * +demangle_classname (type_info const &); + +/* + +Virtual copy constructor. Make up for C++'s lack of a standard +factory or clone () function. Usage: + +class Foo : Baseclass +{ +VIRTUAL_COPY_CONSTRUCTOR (Baseclass, Foo); +}; + +*/ + +#define DECLARE_CLASSNAME(name) \ + virtual const char *class_name () const { \ + return #name; \ } -#endif +#define VIRTUAL_COPY_CONSTRUCTOR(Base, name) \ + DECLARE_CLASSNAME(name);\ + virtual Base *clone () const \ + { \ + return new name (*this); \ + } + +#endif /* VIRTUAL_METHODS_HH */