Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 2 // See the file tools.license for terms. 3 3 4 #ifndef tools_S_STRING 4 #ifndef tools_S_STRING 5 #define tools_S_STRING 5 #define tools_S_STRING 6 6 7 // a few place in which a cpp macro help the r 7 // a few place in which a cpp macro help the readability. 8 8 9 #include <string> 9 #include <string> 10 10 11 #define TOOLS_CLASS_STRING(a_name)\ 11 #define TOOLS_CLASS_STRING(a_name)\ 12 static const std::string& s_##a_name() {\ 12 static const std::string& s_##a_name() {\ 13 static const std::string s_v(#a_name);\ 13 static const std::string s_v(#a_name);\ 14 return s_v;\ 14 return s_v;\ 15 } 15 } 16 16 17 #define TOOLS_CLASS_STRING_VALUE(a_name,a_valu 17 #define TOOLS_CLASS_STRING_VALUE(a_name,a_value)\ 18 static const std::string& s_##a_name() {\ 18 static const std::string& s_##a_name() {\ 19 static const std::string s_v(#a_value);\ 19 static const std::string s_v(#a_value);\ 20 return s_v;\ 20 return s_v;\ 21 } 21 } 22 22 23 #define TOOLS_CLASS_STRING_SVALUE(a_name,a_val 23 #define TOOLS_CLASS_STRING_SVALUE(a_name,a_value)\ 24 static const std::string& s_##a_name() {\ 24 static const std::string& s_##a_name() {\ 25 static const std::string s_v(a_value);\ 25 static const std::string s_v(a_value);\ 26 return s_v;\ 26 return s_v;\ 27 } 27 } 28 28 29 #define TOOLS_GLOBAL_STRING(a_name)\ 29 #define TOOLS_GLOBAL_STRING(a_name)\ 30 inline const std::string& s_##a_name() {\ 30 inline const std::string& s_##a_name() {\ 31 static const std::string s_v(#a_name);\ 31 static const std::string s_v(#a_name);\ 32 return s_v;\ 32 return s_v;\ 33 } 33 } 34 34 35 #define TOOLS_GLOBAL_STRING_VALUE(a_name,a_val 35 #define TOOLS_GLOBAL_STRING_VALUE(a_name,a_value)\ 36 inline const std::string& s_##a_name() {\ 36 inline const std::string& s_##a_name() {\ 37 static const std::string s_v(#a_value);\ 37 static const std::string s_v(#a_value);\ 38 return s_v;\ 38 return s_v;\ 39 } 39 } 40 40 41 #define TOOLS_SCLASS(a_name)\ 41 #define TOOLS_SCLASS(a_name)\ 42 static const std::string& s_class() {\ 42 static const std::string& s_class() {\ 43 static const std::string s_v(#a_name);\ 43 static const std::string s_v(#a_name);\ 44 return s_v;\ 44 return s_v;\ 45 }\ 45 }\ 46 static void check_class_name() {a_name::s_clas 46 static void check_class_name() {a_name::s_class();} 47 47 48 #define TOOLS_T_SCLASS(a_T,a_name)\ 48 #define TOOLS_T_SCLASS(a_T,a_name)\ 49 static const std::string& s_class() {\ 49 static const std::string& s_class() {\ 50 static const std::string s_v(#a_name);\ 50 static const std::string s_v(#a_name);\ 51 return s_v;\ 51 return s_v;\ 52 }\ 52 }\ 53 static void check_class_name() {a_name<a_T>::s 53 static void check_class_name() {a_name<a_T>::s_class();} 54 54 55 #define TOOLS_T2_SCLASS(a_T1,a_T2,a_name)\ 55 #define TOOLS_T2_SCLASS(a_T1,a_T2,a_name)\ 56 static const std::string& s_class() {\ 56 static const std::string& s_class() {\ 57 static const std::string s_v(#a_name);\ 57 static const std::string s_v(#a_name);\ 58 return s_v;\ 58 return s_v;\ 59 }\ 59 }\ 60 static void check_class_name() {a_name<a_T1,a_ 60 static void check_class_name() {a_name<a_T1,a_T2>::s_class();} 61 61 62 #define TOOLS_T3_SCLASS(a_T1,a_T2,a_T3,a_name) 62 #define TOOLS_T3_SCLASS(a_T1,a_T2,a_T3,a_name)\ 63 static const std::string& s_class() {\ 63 static const std::string& s_class() {\ 64 static const std::string s_v(#a_name);\ 64 static const std::string s_v(#a_name);\ 65 return s_v;\ 65 return s_v;\ 66 }\ 66 }\ 67 static void check_class_name() {a_name<a_T1,a_ 67 static void check_class_name() {a_name<a_T1,a_T2,a_T3>::s_class();} 68 68 69 // to transform the value of a cpp macro to a 69 // to transform the value of a cpp macro to a string : 70 #define TOOLS_CPP_TO__STRING(a_cpp) #a_cpp 70 #define TOOLS_CPP_TO__STRING(a_cpp) #a_cpp 71 #define TOOLS_CPP_TO_STRING(a_cpp) std::string 71 #define TOOLS_CPP_TO_STRING(a_cpp) std::string(TOOLS_CPP_TO__STRING(a_cpp)) 72 // for example : 72 // for example : 73 // #define FOO foo 73 // #define FOO foo 74 // std::cout << TOOLS_CPP_TO_STRING(FOO) << 74 // std::cout << TOOLS_CPP_TO_STRING(FOO) << std::endl; 75 75 76 #endif 76 #endif