19 #ifndef INCLUDE_UTIL_VARIABLEARGMACRO_HPP 20 #define INCLUDE_UTIL_VARIABLEARGMACRO_HPP 25 #include <RCF/MemStream.hpp> 26 #include <RCF/Export.hpp> 34 RCF_EXPORT
void printToOstream(MemOstream & os, std::uint16_t n);
35 RCF_EXPORT
void printToOstream(MemOstream & os, std::uint32_t n);
36 RCF_EXPORT
void printToOstream(MemOstream & os, std::uint64_t n);
40 void printToOstream(MemOstream & os,
const T & t)
49 class RCF_EXPORT VariableArgMacroFunctor
53 VariableArgMacroFunctor();
54 virtual ~VariableArgMacroFunctor();
56 VariableArgMacroFunctor &
init(
57 const std::string &label,
58 const std::string &msg,
64 void notify(
const T &t,
const char *name)
66 *mArgs << name <<
"=";
67 printToOstream(*mArgs, t);
71 void notify(std::size_t t,
const char *name)
73 *mArgs << name <<
"=";
74 printToOstream(*mArgs, t);
80 void notify(
const wchar_t *,
const char *) {}
81 void notify(
const std::wstring &,
const char *) {}
84 template<
typename T> T &cast()
86 return dynamic_cast<T &
>(*this);
89 template<
typename T> T &cast(T *)
91 return dynamic_cast<T &
>(*this);
102 class DummyVariableArgMacroObject
106 DummyVariableArgMacroObject &operator()(
const T &)
112 #define DUMMY_VARIABLE_ARG_MACRO() \ 113 if (false) ::RCF::DummyVariableArgMacroObject() 118 #define DECLARE_VARIABLE_ARG_MACRO(macro_name, functor) \ 119 DECLARE_VARIABLE_ARG_MACRO_(macro_name, macro_name##_A, macro_name##_B, functor) 121 #define DECLARE_VARIABLE_ARG_MACRO_( macro_name, macro_name_A, macro_name_B, functor) \ 122 template<typename Functor> \ 123 class VariableArgMacro; \ 126 VariableArgMacro< functor > : public functor \ 129 VariableArgMacro() : \ 130 macro_name_A(*this), macro_name_B(*this) \ 132 template<typename T1> \ 133 VariableArgMacro(const T1 &t1) : \ 134 functor(t1), macro_name_A(*this), macro_name_B(*this) \ 136 template<typename T1, typename T2> \ 137 VariableArgMacro(const T1 &t1, const T2 &t2) : \ 138 functor(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 140 template<typename T1, typename T2> \ 141 VariableArgMacro(const T1 &t1, T2 &t2) : \ 142 functor(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 144 template<typename T1, typename T2, typename T3> \ 145 VariableArgMacro(const T1 &t1, const T2 &t2, const T3 & t3) : \ 146 functor(t1,t2,t3), macro_name_A(*this), macro_name_B(*this) \ 148 template<typename T1, typename T2, typename T3, typename T4, typename T5> \ 149 VariableArgMacro(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) : \ 150 functor(t1,t2,t3,t4,t5), macro_name_A(*this), macro_name_B(*this) \ 152 ~VariableArgMacro() \ 154 VariableArgMacro ¯o_name_A; \ 155 VariableArgMacro ¯o_name_B; \ 156 template<typename T> \ 157 VariableArgMacro< functor > ¬ify_(const T &t, const char *name) \ 159 notify(t,name); return *this; \ 161 VariableArgMacro< functor > ¬ify_(size_t t, const char *name) \ 163 notify(t,name); return *this; \ 167 #define DECLARE_VARIABLE_ARG_MACRO_T1( macro_name, functor ) \ 168 DECLARE_VARIABLE_ARG_MACRO_T1_(macro_name, macro_name##_A, macro_name##_B, functor) 170 #define DECLARE_VARIABLE_ARG_MACRO_T1_( macro_name, macro_name_A, macro_name_B, functor) \ 171 template<typename Functor> \ 172 class VariableArgMacro; \ 174 template<typename U> \ 175 class VariableArgMacro< functor<U> > : public functor<U> \ 178 VariableArgMacro() : \ 179 macro_name_A(*this), macro_name_B(*this) \ 181 template<typename T1> \ 182 VariableArgMacro(const T1 &t1) : \ 183 functor<U>(t1), macro_name_A(*this), macro_name_B(*this) \ 185 template<typename T1, typename T2> \ 186 VariableArgMacro(const T1 &t1, const T2 &t2) : \ 187 functor<U>(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 189 ~VariableArgMacro() \ 191 VariableArgMacro ¯o_name_A; \ 192 VariableArgMacro ¯o_name_B; \ 193 template<typename T> \ 194 VariableArgMacro< functor<U> > ¬ify_(const T &t, const char *name) \ 199 VariableArgMacro< functor<U> > ¬ify_(size_t t, const char *name) \ 206 #define DECLARE_VARIABLE_ARG_MACRO_T2( macro_name, functor ) \ 207 DECLARE_VARIABLE_ARG_MACRO_T2_(macro_name, macro_name##_A, macro_name##_B, functor) 209 #define DECLARE_VARIABLE_ARG_MACRO_T2_( macro_name, macro_name_A, macro_name_B, functor) \ 210 template<typename Functor> \ 211 class VariableArgMacro; \ 213 template<typename U, typename V> \ 214 class VariableArgMacro< functor<U,V> > : public functor<U,V> \ 217 VariableArgMacro() : \ 218 macro_name_A(*this), macro_name_B(*this) \ 220 template<typename T1> \ 221 VariableArgMacro(const T1 &t1) : \ 222 functor<U,V>(t1), macro_name_A(*this), macro_name_B(*this) \ 224 template<typename T1, typename T2> \ 225 VariableArgMacro(const T1 &t1, const T2 &t2) : \ 226 functor<U,V>(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 228 ~VariableArgMacro() \ 230 VariableArgMacro ¯o_name_A; \ 231 VariableArgMacro ¯o_name_B; \ 232 template<typename T> \ 233 VariableArgMacro< functor<U,V> > ¬ify_(const T &t, const char *name) \ 238 VariableArgMacro< functor<U,V> > ¬ify_(size_t t, const char *name) \ 245 #endif // ! INCLUDE_UTIL_VARIABLEARGMACRO_HPP Definition: AmiIoHandler.hpp:24
RCF_EXPORT bool init(RcfConfigT *=nullptr)
Reference-counted initialization of RCF library. May be called multiple times (see deinit())...