19 #ifndef INCLUDE_UTIL_VARIABLEARGMACRO_HPP
20 #define INCLUDE_UTIL_VARIABLEARGMACRO_HPP
24 #include <boost/cstdint.hpp>
25 #include <boost/noncopyable.hpp>
27 #include <RCF/MemStream.hpp>
28 #include <RCF/Export.hpp>
29 #include <RCF/ThreadLibrary.hpp>
34 RCF_EXPORT
void printToOstream(MemOstream & os, boost::uint16_t n);
35 RCF_EXPORT
void printToOstream(MemOstream & os, boost::uint32_t n);
36 RCF_EXPORT
void printToOstream(MemOstream & os, boost::uint64_t n);
40 void printToOstream(MemOstream & os,
const T & t)
49 class RCF_EXPORT VariableArgMacroFunctor : boost::noncopyable
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