File indexing completed on 2026-08-06 09:38:31
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef ThePEG_ClassTraits_H
0010 #define ThePEG_ClassTraits_H
0011
0012
0013
0014
0015 #include "ThePEG/Config/ThePEG.h"
0016
0017
0018 #include "ThePEG/Persistency/PersistentOStream.fh"
0019 #include "ThePEG/Persistency/PersistentIStream.fh"
0020 #include "DescriptionList.h"
0021
0022 namespace ThePEG {
0023
0024
0025
0026
0027
0028
0029
0030 struct ClassTraitsType: public TraitsType {};
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 template <typename T>
0052 struct ClassTraitsBase: public ClassTraitsType {
0053
0054 ThePEG_DECLARE_TEMPLATE_POINTERS(T,TPtr);
0055 ThePEG_DECLARE_POINTERS(Base,BPtr);
0056
0057
0058
0059
0060 static TPtr create() { return TPtr::Create(); }
0061
0062
0063
0064
0065
0066 static string className() {
0067 return DescriptionList::className(typeid(T));
0068 }
0069
0070
0071
0072
0073 static int version() {
0074 return DescriptionList::version(typeid(T));
0075 }
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085 static string library() {
0086 return DescriptionList::library(typeid(T));
0087 }
0088
0089
0090
0091
0092 static void output(tcTPtr t, PersistentOStream & os) {
0093 t->persistentOutput(os);
0094 }
0095
0096
0097
0098
0099 static void input(tTPtr t, PersistentIStream & is, int oldVersion) {
0100 t->persistentInput(is, oldVersion);
0101 }
0102
0103
0104
0105
0106 static TPtr cast(BPtr b) { return dynamic_ptr_cast<TPtr>(b); }
0107
0108
0109
0110
0111
0112 static cTPtr cast(cBPtr b) { return dynamic_ptr_cast<cTPtr>(b); }
0113
0114
0115
0116
0117
0118 static tTPtr cast(tBPtr b) { return dynamic_ptr_cast<tTPtr>(b); }
0119
0120
0121
0122
0123
0124 static tcTPtr cast(tcBPtr b) { return dynamic_ptr_cast<tcTPtr>(b); }
0125
0126 };
0127
0128
0129
0130
0131
0132
0133 template <typename T>
0134 struct ClassTraits: public ClassTraitsBase<T> {};
0135
0136
0137
0138
0139 template<>
0140 struct ClassTraits<double> : public ClassTraitsBase<double> {
0141 static string className() { return "double"; }
0142 };
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155 template <typename Derived, int BaseN>
0156 struct BaseClassTrait: public ClassTraitsType {
0157
0158
0159
0160
0161 typedef int NthBase;
0162 };
0163
0164 }
0165
0166 #define ThePEG_DECLARE_BASE_CLASS_TRAITS_1(Class,Base) \
0167
0168 \
0169 template <> \
0170 struct BaseClassTrait<Class,1>: public ClassTraitsType { \
0171 \
0172 typedef Base NthBase; \
0173 }; \
0174
0175 #define ThePEG_DECLARE_BASE_CLASS_TRAITS_2(Class,Base1,Base2) \
0176
0177 \
0178 template <> \
0179 struct BaseClassTrait<Class,1>: public ClassTraitsType { \
0180 \
0181 typedef Base1 NthBase; \
0182 }; \
0183
0184 \
0185 template <> \
0186 struct BaseClassTrait<Class,2>: public ClassTraitsType { \
0187 \
0188 typedef Base2 NthBase; \
0189 }; \
0190
0191 #define ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,Name,Lib) \
0192
0193 \
0194 template <> \
0195 struct ClassTraits<Class>: \
0196 public ClassTraitsBase<Class> { \
0197 \
0198 static string className() { return Name; } \
0199
0200
0201
0202
0203
0204
0205 \
0206 static string library() { return Lib; } \
0207 } \
0208
0209
0210
0211 #define ThePEG_DECLARE_CLASS_TRAITS(Class,Base) \
0212 ThePEG_DECLARE_BASE_CLASS_TRAITS_1(Class,Base) \
0213 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,"ThePEG::" #Class,"") \
0214
0215 #define ThePEG_DECLARE_DYNAMIC_CLASS_TRAITS(Class,Base,Lib) \
0216 ThePEG_DECLARE_BASE_CLASS_TRAITS_1(Class,Base) \
0217 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,"ThePEG::" #Class,Lib) \
0218
0219 #define ThePEG_DECLARE_CLASS_TRAITS_2(Class,Base1,Base2) \
0220 ThePEG_DECLARE_BASE_CLASS_TRAITS_2(Class,Base1,Base2) \
0221 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,"ThePEG/::" #Class,"") \
0222
0223 #define ThePEG_DECLARE_DYNAMIC_CLASS_TRAITS_2(Class,Base1,Base2,Lib) \
0224 ThePEG_DECLARE_BASE_CLASS_TRAITS_2(Class,Base1,Base2) \
0225 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,"ThePEG::" #Class,Lib) \
0226
0227 #define ThePEG_DECLARE_NAMED_CLASS_TRAITS(Class,Base,Name) \
0228 ThePEG_DECLARE_BASE_CLASS_TRAITS_1(Class,Base) \
0229 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,Name,"") \
0230
0231 #define ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS(Class,Base,Name,Lib) \
0232 ThePEG_DECLARE_BASE_CLASS_TRAITS_1(Class,Base) \
0233 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,Name,Lib) \
0234
0235 #define ThePEG_DECLARE_NAMED_CLASS_TRAITS_2(Class,Base1,Base2,Name) \
0236 ThePEG_DECLARE_BASE_CLASS_TRAITS_2(Class,Base1,Base2) \
0237 ThePEG_DECLARE_NAMED_DYNAMIC_CLASS_TRAITS_(Class,Name,"") \
0238
0239 #endif