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->is_impl_valid()) { \
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_CREATE_IMP_0(ns, impl) \
00054 saga::task ns::createpriv (saga::task_base::Sync) \
00055 { \
00056 saga::task t(saga::task::Done); \
00057 TR1::shared_ptr<impl> i(new impl()); \
00058 i->create_impl_sync(t.get_result<ns>()); \
00059 return t; \
00060 } \
00061 saga::task ns::createpriv (saga::task_base::ASync) \
00062 { return saga::detail::run(impl::create_impl_async()); } \
00063 \
00064 saga::task ns::createpriv (saga::task_base::Task) \
00065 { return impl::create_impl_async(); } \
00066 //-----------------------------------------------------------------------------
00067
00068
00069 #define SAGA_CALL_CONST_IMP_0_EX(ns, name, name_impl) \
00070 saga::task ns::name ## priv (saga::task_base::Sync) const \
00071 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(true); } \
00072 \
00073 saga::task ns::name ## priv (saga::task_base::ASync) const \
00074 { SAGA_OBJECT_CHECK(); return saga::detail::run(get_impl()->name_impl()); } \
00075 \
00076 saga::task ns::name ## priv (saga::task_base::Task) const \
00077 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(); } \
00078 //-----------------------------------------------------------------------------
00079 #define SAGA_CALL_CONST_IMP_0(ns, name) \
00080 SAGA_CALL_CONST_IMP_0_EX(ns, name, name) \
00081 //-----------------------------------------------------------------------------
00082
00084
00085
00086
00088
00089
00090 #define SAGA_CALL_IMP_1_EX(ns, name, name_impl, p1) \
00091 saga::task ns::name ## priv (p1 par1, saga::task_base::Sync) \
00092 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, true); } \
00093 \
00094 saga::task ns::name ## priv (p1 par1, saga::task_base::ASync) \
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) \
00099 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1); } \
00100 //-----------------------------------------------------------------------------
00101 #define SAGA_CALL_IMP_1(ns, name, p1) \
00102 SAGA_CALL_IMP_1_EX(ns, name, name, p1) \
00103 //-----------------------------------------------------------------------------
00104
00105
00106 #define SAGA_CALL_CREATE_IMP_1(ns, impl, p1) \
00107 saga::task ns::createpriv (p1 par1, saga::task_base::Sync) \
00108 { \
00109 saga::task t(saga::task::Done); \
00110 TR1::shared_ptr<impl> i(new impl(par1)); \
00111 i->create_impl_sync(t.get_result<ns>()); \
00112 return t; \
00113 } \
00114 saga::task ns::createpriv (p1 par1, saga::task_base::ASync) \
00115 { return saga::detail::run(impl::create_impl_async(par1)); } \
00116 \
00117 saga::task ns::createpriv (p1 par1, saga::task_base::Task) \
00118 { return impl::create_impl_async(par1); } \
00119 //-----------------------------------------------------------------------------
00120
00121
00122 #define SAGA_CALL_CONST_IMP_1_EX(ns, name, name_impl, p1) \
00123 saga::task ns::name ## priv (p1 par1, saga::task_base::Sync) const \
00124 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, true); } \
00125 \
00126 saga::task ns::name ## priv (p1 par1, saga::task_base::ASync) const \
00127 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl( \
00128 par1))); } \
00129 \
00130 saga::task ns::name ## priv (p1 par1, saga::task_base::Task) const \
00131 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1); } \
00132 //-----------------------------------------------------------------------------
00133 #define SAGA_CALL_CONST_IMP_1(ns, name, p1) \
00134 SAGA_CALL_CONST_IMP_1_EX(ns, name, name, p1) \
00135 //-----------------------------------------------------------------------------
00136
00138
00139
00140
00142
00143
00144 #define SAGA_CALL_IMP_2_EX(ns, name, name_impl, p1, p2) \
00145 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Sync) \
00146 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, true); } \
00147 \
00148 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::ASync) \
00149 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00150 par2))); } \
00151 \
00152 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Task) \
00153 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2); } \
00154 //-----------------------------------------------------------------------------
00155 #define SAGA_CALL_IMP_2(ns, name, p1, p2) \
00156 SAGA_CALL_IMP_2_EX(ns, name, name, p1, p2) \
00157 //-----------------------------------------------------------------------------
00158
00159
00160 #define SAGA_CALL_CREATE_IMP_2(ns, impl, p1, p2) \
00161 saga::task ns::createpriv (p1 par1, p2 par2, saga::task_base::Sync) \
00162 { \
00163 saga::task t(saga::task::Done); \
00164 TR1::shared_ptr<impl> i(new impl(par1, par2)); \
00165 i->create_impl_sync(t.get_result<ns>()); \
00166 return t; \
00167 } \
00168 saga::task ns::createpriv (p1 par1, p2 par2, saga::task_base::ASync) \
00169 { return saga::detail::run(impl::create_impl_async(par1, par2)); } \
00170 \
00171 saga::task ns::createpriv (p1 par1, p2 par2, saga::task_base::Task) \
00172 { return impl::create_impl_async(par1, par2); } \
00173 //-----------------------------------------------------------------------------
00174
00175
00176 #define SAGA_CALL_CONST_IMP_2_EX(ns, name, name_impl, p1, p2) \
00177 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Sync) const \
00178 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, true); } \
00179 \
00180 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::ASync) const\
00181 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00182 par2))); } \
00183 \
00184 saga::task ns::name ## priv (p1 par1, p2 par2, saga::task_base::Task) const \
00185 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2); } \
00186 //-----------------------------------------------------------------------------
00187 #define SAGA_CALL_CONST_IMP_2(ns, name, p1, p2) \
00188 SAGA_CALL_CONST_IMP_2_EX(ns, name, name, p1, p2) \
00189 //-----------------------------------------------------------------------------
00190
00191
00193
00194
00195
00197
00198
00199 #define SAGA_CALL_IMP_3_EX(ns, name, name_impl, p1, p2, p3) \
00200 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Sync) \
00201 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, true); } \
00202 \
00203 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::ASync)\
00204 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00205 par2, par3))); } \
00206 \
00207 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Task) \
00208 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3); } \
00209 //-----------------------------------------------------------------------------
00210 #define SAGA_CALL_IMP_3(ns, name, p1, p2, p3) \
00211 SAGA_CALL_IMP_3_EX(ns, name, name, p1, p2, p3) \
00212 //-----------------------------------------------------------------------------
00213
00214
00215 #define SAGA_CALL_CREATE_IMP_3(ns, impl, p1, p2, p3) \
00216 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, saga::task_base::Sync) \
00217 { \
00218 saga::task t(saga::task::Done); \
00219 TR1::shared_ptr<impl> i(new impl(par1, par2, par3)); \
00220 i->create_impl_sync(t.get_result<ns>()); \
00221 return t; \
00222 } \
00223 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, saga::task_base::ASync)\
00224 { return saga::detail::run(impl::create_impl_async(par1, par2, par3)); } \
00225 \
00226 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, saga::task_base::Task) \
00227 { return impl::create_impl_async(par1, par2, par3); } \
00228 //-----------------------------------------------------------------------------
00229
00230
00231 #define SAGA_CALL_CONST_IMP_3_EX(ns, name, name_impl, p1, p2, p3) \
00232 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Sync) const \
00233 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, true); } \
00234 \
00235 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::ASync) const \
00236 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00237 par2, par3))); } \
00238 \
00239 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, saga::task_base::Task) const \
00240 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3); } \
00241 //-----------------------------------------------------------------------------
00242 #define SAGA_CALL_CONST_IMP_3(ns, name, p1, p2, p3) \
00243 SAGA_CALL_CONST_IMP_3_EX(ns, name, name, p1, p2, p3) \
00244 //-----------------------------------------------------------------------------
00245
00246
00248
00249
00250
00252
00253
00254 #define SAGA_CALL_IMP_4_EX(ns, name, name_impl, p1, p2, p3, p4) \
00255 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00256 saga::task_base::Sync) \
00257 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, true); } \
00258 \
00259 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00260 saga::task_base::ASync) \
00261 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00262 par2, par3, par4))); } \
00263 \
00264 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00265 saga::task_base::Task) \
00266 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4); } \
00267 //-----------------------------------------------------------------------------
00268 #define SAGA_CALL_IMP_4(ns, name, p1, p2, p3, p4) \
00269 SAGA_CALL_IMP_4_EX(ns, name, name, p1, p2, p3, p4) \
00270 //-----------------------------------------------------------------------------
00271
00272
00273 #define SAGA_CALL_CREATE_IMP_4(ns, impl, p1, p2, p3, p4) \
00274 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, p4 par4, \
00275 saga::task_base::Sync) \
00276 { \
00277 saga::task t(saga::task::Done); \
00278 TR1::shared_ptr<impl> i(new impl(par1, par2, par3, par4)); \
00279 i->create_impl_sync(t.get_result<ns>()); \
00280 return t; \
00281 } \
00282 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, p4 par4, \
00283 saga::task_base::ASync) \
00284 { return saga::detail::run( \
00285 impl::create_impl_async(par1, par2, par3, par4)); } \
00286 \
00287 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, p4 par4, \
00288 saga::task_base::Task) \
00289 { return impl::create_impl_async(par1, par2, par3, par4); } \
00290 //-----------------------------------------------------------------------------
00291
00292
00293 #define SAGA_CALL_CONST_IMP_4_EX(ns, name, name_impl, p1, p2, p3, p4) \
00294 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00295 saga::task_base::Sync) const \
00296 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, true); } \
00297 \
00298 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00299 saga::task_base::ASync) const \
00300 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00301 par2, par3, par4))); } \
00302 \
00303 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00304 saga::task_base::Task) const \
00305 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4); } \
00306 //-----------------------------------------------------------------------------
00307 #define SAGA_CALL_CONST_IMP_4(ns, name, p1, p2, p3, p4) \
00308 SAGA_CALL_CONST_IMP_4_EX(ns, name, name, p1, p2, p3, p4) \
00309 //-----------------------------------------------------------------------------
00310
00311
00313
00314
00315
00317
00318
00319 #define SAGA_CALL_IMP_5_EX(ns, name, name_impl, p1, p2, p3, p4, p5) \
00320 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00321 p5 par5, saga::task_base::Sync) \
00322 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00323 par5, true); } \
00324 \
00325 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00326 p5 par5, saga::task_base::ASync) \
00327 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00328 par2, par3, par4, par5))); } \
00329 \
00330 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00331 p5 par5, saga::task_base::Task) \
00332 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00333 par5); } \
00334 //-----------------------------------------------------------------------------
00335 #define SAGA_CALL_IMP_5(ns, name, p1, p2, p3, p4, p5) \
00336 SAGA_CALL_IMP_5_EX(ns, name, name, p1, p2, p3, p4, p5) \
00337 //-----------------------------------------------------------------------------
00338
00339
00340 #define SAGA_CALL_CREATE_IMP_5(ns, impl, p1, p2, p3, p4, p5) \
00341 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, p4 par4, p5 par5, \
00342 saga::task_base::Sync) \
00343 { \
00344 saga::task t(saga::task::Done); \
00345 TR1::shared_ptr<impl> i(new impl(par1, par2, par3, par4, par5)); \
00346 i->create_impl_sync(t.get_result<ns>()); \
00347 return t; \
00348 } \
00349 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, p4 par4, p5 par5, \
00350 saga::task_base::ASync) \
00351 { return saga::detail::run( \
00352 impl::create_impl_async(par1, par2, par3, par4, par5)); } \
00353 \
00354 saga::task ns::createpriv (p1 par1, p2 par2, p3 par3, p4 par4, p5 par5, \
00355 saga::task_base::Task) \
00356 { return impl::create_impl_async(par1, par2, par3, par4, par5); } \
00357 //-----------------------------------------------------------------------------
00358
00359
00360 #define SAGA_CALL_CONST_IMP_5_EX(ns, name, name_impl, p1, p2, p3, p4, p5) \
00361 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00362 p5 par5, saga::task_base::Sync) const \
00363 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00364 par5, true); } \
00365 \
00366 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00367 p5 par5, saga::task_base::ASync) const \
00368 { SAGA_OBJECT_CHECK(); return (saga::detail::run(get_impl()->name_impl(par1,\
00369 par2, par3, par4, par5))); } \
00370 \
00371 saga::task ns::name ## priv (p1 par1, p2 par2, p3 par3, p4 par4, \
00372 p5 par5, saga::task_base::Task) const \
00373 { SAGA_OBJECT_CHECK(); return get_impl()->name_impl(par1, par2, par3, par4, \
00374 par5); } \
00375 //-----------------------------------------------------------------------------
00376 #define SAGA_CALL_CONST_IMP_5(ns, name, p1, p2, p3, p4, p5) \
00377 SAGA_CALL_CONST_IMP_5_EX(ns, name, name, p1, p2, p3, p4, p5) \
00378 //-----------------------------------------------------------------------------
00379
00381
00382 #endif // SAGA_DETAIL_CALL_V1_HPP
00383