SAGA C++ API 1.6
call.hpp
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines