]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/virtual-methods.hh
release: 0.0.77.jcn1
[lilypond.git] / flower / include / virtual-methods.hh
1 /*
2   virtual-methods.hh -- declare 
3
4   source file of the Flower Library
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9
10 #ifndef VIRTUAL_METHODS_HH
11 #define VIRTUAL_METHODS_HH
12
13 /** a macro to declare the classes name as a static and virtual function.
14   The static_name() can *not* be inlined (this might have the effect that 
15   s->name() != S::static_name(). Overlapping strings need not be merged in C++
16  */
17 #define NAME_MEMBERS()  \
18 static char const *static_name();\
19 static bool static_is_type_b(const char*s);\
20 virtual bool is_type_b(const char *s)const { return static_is_type_b(s); } \
21 virtual char const *name() const{ return static_name(); } \
22 int a_stupid_nonexistent_function_to_allow_the_semicolon_come_out()
23
24 #define IMPLEMENT_STATIC_NAME(c)\
25     char const *c::static_name() { return #c; } 
26
27 #define VIRTUAL_COPY_CONS(T, R)\
28   virtual R *clone() const { return  new T(*this); } \
29   int  yet_another_stupid_function_to_allow_semicolon()
30
31 #define IMPLEMENT_IS_TYPE_B(D)                                                     \
32     IMPLEMENT_STATIC_NAME(D)\
33   bool D::static_is_type_b(const char *s)                                          \
34 {                                                                                  \
35     return s == static_name();                                                     \
36 }                                                                                  
37                                                                                    
38 #define IMPLEMENT_IS_TYPE_B1(D,B)                                                  \
39         IMPLEMENT_STATIC_NAME(D)\
40   bool D::static_is_type_b(const char *s)                                                  \
41 {                                                                                  \
42     return s == static_name() || B::static_is_type_b(s);                                   \
43 }                                                                                  
44 #define IMPLEMENT_IS_TYPE_B2(D, BA, BB)                                                    \
45         IMPLEMENT_STATIC_NAME(D)\
46   bool D::static_is_type_b(const char *s)                                                  \
47 {                                                                                  \
48     return s == static_name() || BA::static_is_type_b(s) || BB::static_is_type_b(s); \
49 }
50
51 #endif