18 #ifndef INCLUDE_UTIL_VARIABLEARGMACRO_HPP 19 #define INCLUDE_UTIL_VARIABLEARGMACRO_HPP 24 #include <RCF/MemStream.hpp> 25 #include <RCF/Export.hpp> 33 RCF_EXPORT
void printToOstream(MemOstream & os, std::uint16_t n);
34 RCF_EXPORT
void printToOstream(MemOstream & os, std::uint32_t n);
35 RCF_EXPORT
void printToOstream(MemOstream & os, std::uint64_t n);
38 void printToOstream(MemOstream& os,
const std::u8string& t);
43 void printToOstream(MemOstream & os,
const T & t)
52 class RCF_EXPORT VariableArgMacroFunctor
56 VariableArgMacroFunctor();
57 virtual ~VariableArgMacroFunctor();
59 VariableArgMacroFunctor &
init(
60 const std::string &label,
61 const std::string &msg,
67 void notify(
const T &t,
const char *name)
69 *mArgs << name <<
"=";
70 printToOstream(*mArgs, t);
74 void notify(std::size_t t,
const char *name)
76 *mArgs << name <<
"=";
77 printToOstream(*mArgs, t);
83 void notify(
const wchar_t *,
const char *) {}
84 void notify(
const std::wstring &,
const char *) {}
87 template<
typename T> T &cast()
89 return dynamic_cast<T &
>(*this);
92 template<
typename T> T &cast(T *)
94 return dynamic_cast<T &
>(*this);
105 class DummyVariableArgMacroObject
109 DummyVariableArgMacroObject &operator()(
const T &)
115 #define DUMMY_VARIABLE_ARG_MACRO() \ 116 if (false) ::RCF::DummyVariableArgMacroObject() 121 #define DECLARE_VARIABLE_ARG_MACRO(macro_name, functor) \ 122 DECLARE_VARIABLE_ARG_MACRO_(macro_name, macro_name##_A, macro_name##_B, functor) 124 #define DECLARE_VARIABLE_ARG_MACRO_( macro_name, macro_name_A, macro_name_B, functor) \ 125 template<typename Functor> \ 126 class VariableArgMacro; \ 129 VariableArgMacro< functor > : public functor \ 132 VariableArgMacro() : \ 133 macro_name_A(*this), macro_name_B(*this) \ 135 template<typename T1> \ 136 VariableArgMacro(const T1 &t1) : \ 137 functor(t1), macro_name_A(*this), macro_name_B(*this) \ 139 template<typename T1, typename T2> \ 140 VariableArgMacro(const T1 &t1, const T2 &t2) : \ 141 functor(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 143 template<typename T1, typename T2> \ 144 VariableArgMacro(const T1 &t1, T2 &t2) : \ 145 functor(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 147 template<typename T1, typename T2, typename T3> \ 148 VariableArgMacro(const T1 &t1, const T2 &t2, const T3 & t3) : \ 149 functor(t1,t2,t3), macro_name_A(*this), macro_name_B(*this) \ 151 template<typename T1, typename T2, typename T3, typename T4, typename T5> \ 152 VariableArgMacro(T1 t1, T2 t2, T3 t3, T4 t4, T5 t5) : \ 153 functor(t1,t2,t3,t4,t5), macro_name_A(*this), macro_name_B(*this) \ 155 ~VariableArgMacro() \ 157 VariableArgMacro ¯o_name_A; \ 158 VariableArgMacro ¯o_name_B; \ 159 template<typename T> \ 160 VariableArgMacro< functor > ¬ify_(const T &t, const char *name) \ 162 notify(t,name); return *this; \ 164 VariableArgMacro< functor > ¬ify_(size_t t, const char *name) \ 166 notify(t,name); return *this; \ 170 #define DECLARE_VARIABLE_ARG_MACRO_T1( macro_name, functor ) \ 171 DECLARE_VARIABLE_ARG_MACRO_T1_(macro_name, macro_name##_A, macro_name##_B, functor) 173 #define DECLARE_VARIABLE_ARG_MACRO_T1_( macro_name, macro_name_A, macro_name_B, functor) \ 174 template<typename Functor> \ 175 class VariableArgMacro; \ 177 template<typename U> \ 178 class VariableArgMacro< functor<U> > : public functor<U> \ 181 VariableArgMacro() : \ 182 macro_name_A(*this), macro_name_B(*this) \ 184 template<typename T1> \ 185 VariableArgMacro(const T1 &t1) : \ 186 functor<U>(t1), macro_name_A(*this), macro_name_B(*this) \ 188 template<typename T1, typename T2> \ 189 VariableArgMacro(const T1 &t1, const T2 &t2) : \ 190 functor<U>(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 192 ~VariableArgMacro() \ 194 VariableArgMacro ¯o_name_A; \ 195 VariableArgMacro ¯o_name_B; \ 196 template<typename T> \ 197 VariableArgMacro< functor<U> > ¬ify_(const T &t, const char *name) \ 202 VariableArgMacro< functor<U> > ¬ify_(size_t t, const char *name) \ 209 #define DECLARE_VARIABLE_ARG_MACRO_T2( macro_name, functor ) \ 210 DECLARE_VARIABLE_ARG_MACRO_T2_(macro_name, macro_name##_A, macro_name##_B, functor) 212 #define DECLARE_VARIABLE_ARG_MACRO_T2_( macro_name, macro_name_A, macro_name_B, functor) \ 213 template<typename Functor> \ 214 class VariableArgMacro; \ 216 template<typename U, typename V> \ 217 class VariableArgMacro< functor<U,V> > : public functor<U,V> \ 220 VariableArgMacro() : \ 221 macro_name_A(*this), macro_name_B(*this) \ 223 template<typename T1> \ 224 VariableArgMacro(const T1 &t1) : \ 225 functor<U,V>(t1), macro_name_A(*this), macro_name_B(*this) \ 227 template<typename T1, typename T2> \ 228 VariableArgMacro(const T1 &t1, const T2 &t2) : \ 229 functor<U,V>(t1,t2), macro_name_A(*this), macro_name_B(*this) \ 231 ~VariableArgMacro() \ 233 VariableArgMacro ¯o_name_A; \ 234 VariableArgMacro ¯o_name_B; \ 235 template<typename T> \ 236 VariableArgMacro< functor<U,V> > ¬ify_(const T &t, const char *name) \ 241 VariableArgMacro< functor<U,V> > ¬ify_(size_t t, const char *name) \ 248 #endif // ! INCLUDE_UTIL_VARIABLEARGMACRO_HPP Definition: AmiIoHandler.hpp:23
RCF_EXPORT bool init(RcfConfigT *=nullptr)
Reference-counted initialization of RCF library. May be called multiple times (see deinit())...