SAGA Adaptor CPI v.1.0
|
00001 // Copyright (c) 2005-2007 Andre Merzky (andre@merzky.net) 00002 // Copyright (c) 2005-2009 Hartmut Kaiser 00003 // 00004 // Distributed under the Boost Software License, Version 1.0. (See accompanying 00005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 00006 00007 #ifndef SAGA_DETAIL_CALL_HPP 00008 #define SAGA_DETAIL_CALL_HPP 00009 00010 #include <saga/impl/exception.hpp> 00011 00013 00015 // 00016 // FIXME: document usage extensively 00017 // 00018 // This file defines the API macros for the private functions and the 00019 // function implementation. 00020 00022 // Helper macro to ensure properly initialized objects 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 00031 00032 // 00033 // 0 parameters 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 // 1 parameter 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 // 2 parameters 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 // 3 parameters 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 // 4 parameters 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 // 5 parameters 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