00001
00002
00003
00004
00005
00006
00007 #ifndef SAGA_DETAIL_CALL_HPP
00008 #define SAGA_DETAIL_CALL_HPP
00009
00010 #include <saga/impl/exception.hpp>
00011
00013
00015
00016
00017
00018
00019
00020
00022
00024 #define SAGA_OBJECT_CHECK() \
00025 if (!this->get_impl()) { \
00026 SAGA_THROW("The object has not been properly initialized.", \
00027 saga::IncorrectState); \
00028 } \
00029
00030
00032 //
00033
00034
00036
00037
00038 #define SAGA_CALL_IMP_0_EX(ns, name, name_impl) \
00039 saga::task ns::name ## priv (saga::task_base::Sync) \
00040 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(true); } \
00041 \
00042 saga::task ns::name ## priv (saga::task_base::ASync) \
00043 { SAGA_OBJECT_CHECK(); return saga::detail::run(get_impl()->name_impl()); } \
00044 \
00045 saga::task ns::name ## priv (saga::task_base::Task) \
00046 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(); } \
00047 //-----------------------------------------------------------------------------
00048 #define SAGA_CALL_IMP_0(ns, name) \
00049 SAGA_CALL_IMP_0_EX(ns, name, name) \
00050 //-----------------------------------------------------------------------------
00051
00052
00053 #define SAGA_CALL_CONST_IMP_0_EX(ns, name, name_impl) \
00054 saga::task ns::name ## priv (saga::task_base::Sync) const \
00055 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(true); } \
00056 \
00057 saga::task ns::name ## priv (saga::task_base::ASync) const \
00058 { SAGA_OBJECT_CHECK(); return saga::detail::run(get_impl()->name_impl()); } \
00059 \
00060 saga::task ns::name ## priv (saga::task_base::Task) const \
00061 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(); } \
00062 //-----------------------------------------------------------------------------
00063 #define SAGA_CALL_CONST_IMP_0(ns, name) \
00064 SAGA_CALL_CONST_IMP_0_EX(ns, name, name) \
00065 //-----------------------------------------------------------------------------
00066
00068
00069
00070
00072
00073
00074 #define SAGA_CALL_IMP_1_EX(ns, name, name_impl, p1) \
00075 saga::task ns::name ## priv (p1 par1, saga::task_base::Sync) \
00076 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, true); } \
00077 \
00078 saga::task ns::name ## priv (p1 par1, saga::task_base::ASync) \
00079 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl( \
00080 par1))); } \
00081 \
00082 saga::task ns::name ## priv (p1 par1, saga::task_base::Task) \
00083 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1); } \
00084 //-----------------------------------------------------------------------------
00085 #define SAGA_CALL_IMP_1(ns, name, p1) \
00086 SAGA_CALL_IMP_1_EX(ns, name, name, p1) \
00087 //-----------------------------------------------------------------------------
00088
00089
00090 #define SAGA_CALL_CONST_IMP_1_EX(ns, name, name_impl, p1) \
00091 saga::task ns::name ## priv (p1 par1, saga::task_base::Sync) const \
00092 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, true); } \
00093 \
00094 saga::task ns::name ## priv (p1 par1, saga::task_base::ASync) const \
00095 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl( \
00096 par1))); } \
00097 \
00098 saga::task ns::name ## priv (p1 par1, saga::task_base::Task) const \
00099 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1); } \
00100 //-----------------------------------------------------------------------------
00101 #define SAGA_CALL_CONST_IMP_1(ns, name, p1) \
00102 SAGA_CALL_CONST_IMP_1_EX(ns, name, name, p1) \
00103 //-----------------------------------------------------------------------------
00104
00106
00107
00108
00110
00111
00112 #define SAGA_CALL_IMP_2_EX(ns, name, name_impl, p1, p2) \
00113 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Sync) \
00114 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, true); } \
00115 \
00116 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::ASync) \
00117 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00118 par2))); } \
00119 \
00120 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Task) \
00121 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2); } \
00122 //-----------------------------------------------------------------------------
00123 #define SAGA_CALL_IMP_2(ns, name, p1, p2) \
00124 SAGA_CALL_IMP_2_EX(ns, name, name, p1, p2) \
00125 //-----------------------------------------------------------------------------
00126
00127
00128
00129 #define SAGA_CALL_CONST_IMP_2_EX(ns, name, name_impl, p1, p2) \
00130 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Sync) const \
00131 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, true); } \
00132 \
00133 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::ASync) const\
00134 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00135 par2))); } \
00136 \
00137 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Task) const \
00138 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2); } \
00139 //-----------------------------------------------------------------------------
00140 #define SAGA_CALL_CONST_IMP_2(ns, name, p1, p2) \
00141 SAGA_CALL_CONST_IMP_2_EX(ns, name, name, p1, p2) \
00142 //-----------------------------------------------------------------------------
00143
00144
00146
00147
00148
00150
00151
00152 #define SAGA_CALL_IMP_3_EX(ns, name, name_impl, p1, p2, p3) \
00153 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Sync) \
00154 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, true); } \
00155 \
00156 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::ASync)\
00157 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00158 par2, par3))); } \
00159 \
00160 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Task) \
00161 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3); } \
00162 //-----------------------------------------------------------------------------
00163 #define SAGA_CALL_IMP_3(ns, name, p1, p2, p3) \
00164 SAGA_CALL_IMP_3_EX(ns, name, name, p1, p2, p3) \
00165 //-----------------------------------------------------------------------------
00166
00167
00168 #define SAGA_CALL_CONST_IMP_3_EX(ns, name, name_impl, p1, p2, p3) \
00169 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Sync) const \
00170 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, true); } \
00171 \
00172 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::ASync) const \
00173 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00174 par2, par3))); } \
00175 \
00176 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Task) const \
00177 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3); } \
00178 //-----------------------------------------------------------------------------
00179 #define SAGA_CALL_CONST_IMP_3(ns, name, p1, p2, p3) \
00180 SAGA_CALL_CONST_IMP_3_EX(ns, name, name, p1, p2, p3) \
00181 //-----------------------------------------------------------------------------
00182
00183
00185
00186
00187
00189
00190
00191 #define SAGA_CALL_IMP_4_EX(ns, name, name_impl, p1, p2, p3, p4) \
00192 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00193 saga::task_base::Sync) \
00194 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, true); } \
00195 \
00196 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00197 saga::task_base::ASync) \
00198 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00199 par2, par3, par4))); } \
00200 \
00201 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00202 saga::task_base::Task) \
00203 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4); } \
00204 //-----------------------------------------------------------------------------
00205 #define SAGA_CALL_IMP_4(ns, name, p1, p2, p3, p4) \
00206 SAGA_CALL_IMP_4_EX(ns, name, name, p1, p2, p3, p4) \
00207 //-----------------------------------------------------------------------------
00208
00209
00210
00211 #define SAGA_CALL_CONST_IMP_4_EX(ns, name, name_impl, p1, p2, p3, p4) \
00212 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00213 saga::task_base::Sync) const \
00214 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, true); } \
00215 \
00216 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00217 saga::task_base::ASync) const \
00218 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00219 par2, par3, par4))); } \
00220 \
00221 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00222 saga::task_base::Task) const \
00223 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4); } \
00224 //-----------------------------------------------------------------------------
00225 #define SAGA_CALL_CONST_IMP_4(ns, name, p1, p2, p3, p4) \
00226 SAGA_CALL_CONST_IMP_4_EX(ns, name, name, p1, p2, p3, p4) \
00227 //-----------------------------------------------------------------------------
00228
00229
00231
00232
00233
00235
00236
00237 #define SAGA_CALL_IMP_5_EX(ns, name, name_impl, p1, p2, p3, p4, p5) \
00238 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00239 p5 par5, saga::task_base::Sync) \
00240 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00241 par5, true); } \
00242 \
00243 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00244 p5 par5, saga::task_base::ASync) \
00245 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00246 par2, par3, par4, par5))); } \
00247 \
00248 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00249 p5 par5, saga::task_base::Task) \
00250 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00251 par5); } \
00252 //-----------------------------------------------------------------------------
00253 #define SAGA_CALL_IMP_5(ns, name, p1, p2, p3, p4, p5) \
00254 SAGA_CALL_IMP_5_EX(ns, name, name, p1, p2, p3, p4, p5) \
00255 //-----------------------------------------------------------------------------
00256
00257
00258
00259 #define SAGA_CALL_CONST_IMP_5_EX(ns, name, name_impl, p1, p2, p3, p4, p5) \
00260 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00261 p5 par5, saga::task_base::Sync) const \
00262 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00263 par5, true); } \
00264 \
00265 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00266 p5 par5, saga::task_base::ASync) const \
00267 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00268 par2, par3, par4, par5))); } \
00269 \
00270 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00271 p5 par5, saga::task_base::Task) const \
00272 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00273 par5); } \
00274 //-----------------------------------------------------------------------------
00275 #define SAGA_CALL_CONST_IMP_5(ns, name, p1, p2, p3, p4, p5) \
00276 SAGA_CALL_CONST_IMP_5_EX(ns, name, name, p1, p2, p3, p4, p5) \
00277 //-----------------------------------------------------------------------------
00278
00280
00281 #endif // SAGA_DETAIL_CALL_V1_HPP
00282