LEFT | RIGHT |
1 /* | 1 /* |
2 This file is part of LilyPond, the GNU music typesetter. | 2 This file is part of LilyPond, the GNU music typesetter. |
3 | 3 |
4 Copyright (C) 1997--2019 Han-Wen Nienhuys <hanwen@xs4all.nl> | 4 Copyright (C) 1997--2019 Han-Wen Nienhuys <hanwen@xs4all.nl> |
5 | 5 |
6 LilyPond is free software: you can redistribute it and/or modify | 6 LilyPond is free software: you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation, either version 3 of the License, or | 8 the Free Software Foundation, either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
11 LilyPond is distributed in the hope that it will be useful, | 11 LilyPond is distributed in the hope that it will be useful, |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 GNU General Public License for more details. | 14 GNU General Public License for more details. |
15 | 15 |
16 You should have received a copy of the GNU General Public License | 16 You should have received a copy of the GNU General Public License |
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>. | 17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>. |
18 */ | 18 */ |
19 | 19 |
20 #ifndef VIRTUAL_METHODS_HH | 20 #ifndef VIRTUAL_METHODS_HH |
21 #define VIRTUAL_METHODS_HH | 21 #define VIRTUAL_METHODS_HH |
22 | 22 |
23 #include <type_traits> | 23 #include <type_traits> |
24 | 24 |
25 /* | 25 #define VIRTUAL_CLASS_NAME(name) \ |
26 Virtual copy constructor. Make up for C++'s lack of a standard | |
27 factory or clone () function. Usage: | |
28 | |
29 class Foo : Baseclass | |
30 { | |
31 VIRTUAL_COPY_CONSTRUCTOR (Baseclass, Foo); | |
32 }; | |
33 */ | |
34 | |
35 #define DECLARE_CLASSNAME(name) \ | |
36 virtual const char *class_name () const { \ | 26 virtual const char *class_name () const { \ |
37 /* It is annoying that we must repeat the class name for */ \ | 27 /* It is annoying that we must repeat the class name for */ \ |
38 /* the preprocessor, but we can check that it is correct. */ \ | 28 /* the preprocessor, but we can check that it is correct. */ \ |
39 typedef std::decay<decltype(*this)>::type self_type; \ | 29 typedef std::decay<decltype(*this)>::type self_type; \ |
40 static_assert (std::is_same<name, self_type>::value, ""); \ | 30 static_assert (std::is_same<name, self_type>::value, ""); \ |
41 \ | 31 \ |
42 return #name; \ | 32 return #name; \ |
43 } | 33 } |
44 | 34 |
45 #define VIRTUAL_COPY_CONSTRUCTOR(Base, name) \ | 35 #define OVERRIDE_CLASS_NAME(name) \ |
46 virtual Base *clone () const \ | 36 const char *class_name () const override { \ |
47 { \ | 37 /* It is annoying that we must repeat the class name for */ \ |
48 return new name (*this); \ | 38 /* the preprocessor, but we can check that it is correct. */ \ |
| 39 typedef std::decay<decltype(*this)>::type self_type; \ |
| 40 static_assert (std::is_same<name, self_type>::value, ""); \ |
| 41 \ |
| 42 return #name; \ |
49 } | 43 } |
50 | 44 |
51 #endif /* VIRTUAL_METHODS_HH */ | 45 #endif /* VIRTUAL_METHODS_HH */ |
LEFT | RIGHT |