32 #ifndef VSMC_SMP_BACKEND_BASE_HPP
33 #define VSMC_SMP_BACKEND_BASE_HPP
37 #define VSMC_DEFINE_SMP_BASE_COPY(Name) \
39 Name##Base (const Name##Base<T, Derived> &) {} \
40 Name##Base<T, Derived> &operator= (const Name##Base<T, Derived> &) \
42 VSMC_CRTP_DESTRUCTOR_PREFIX ~Name##Base () {}
44 #define VSMC_DEFINE_SMP_BASE_COPY_VIRTUAL(Name) \
46 Name##Base (const Name##Base<T, Virtual> &) {} \
47 Name##Base<T, Virtual> &operator= (const Name##Base<T, Virtual> &) \
49 virtual ~Name##Base () {}
51 #define VSMC_DEFINE_SMP_IMPL_COPY(Impl, Name) \
53 Name##Impl (const Name##Impl<T, Derived> &other) : \
54 Name##Base<T, Derived>(other) {} \
55 Name##Impl<T, Derived> &operator= (const Name##Impl<T, Derived> &other) \
58 Name##Base<T, Derived>::operator=(other); \
64 #define VSMC_RUNTIME_ASSERT_SMP_BACKEND_BASE_DERIVED(basename) \
65 VSMC_RUNTIME_ASSERT((dynamic_cast<Derived *>(this) != VSMC_NULLPTR), \
66 ("DERIVED FROM " #basename \
67 " WITH INCORRECT **Derived** TEMPLATE PARAMTER"));
69 #define VSMC_RUNTIME_ASSERT_SMP_BACKEND_BASE_COPY_SIZE_MISMATCH(name) \
70 VSMC_RUNTIME_ASSERT((N == static_cast<size_type>(this->size())), \
71 ("**State"#name"::copy** SIZE MISMATCH"))
77 template <
typename T,
typename Derived>
83 {
return initialize_state_dispatch(sp, &Derived::initialize_state);}
86 {initialize_param_dispatch(particle, param, &Derived::initialize_param);}
89 {pre_processor_dispatch(particle, &Derived::pre_processor);}
92 {post_processor_dispatch(particle, &Derived::post_processor);}
102 template <typename D>
107 template <
typename D>
108 void initialize_param_dispatch (
Particle<T> &particle,
void *param,
112 template <
typename D>
113 void pre_processor_dispatch (Particle<T> &particle,
114 void (D::*) (Particle<T> &))
117 template <
typename D>
118 void post_processor_dispatch (Particle<T> &particle,
119 void (D::*) (Particle<T> &))
124 template <
typename D>
125 std::size_t initialize_state_dispatch (SingleParticle<T> sp,
126 std::size_t (D::*) (SingleParticle<T>)
const)
129 template <
typename D>
130 void initialize_param_dispatch (Particle<T> &particle,
void *param,
131 void (D::*) (Particle<T> &,
void *)
const)
134 template <
typename D>
135 void pre_processor_dispatch (Particle<T> &particle,
136 void (D::*) (Particle<T> &)
const)
139 template <
typename D>
140 void post_processor_dispatch (Particle<T> &particle,
141 void (D::*) (Particle<T> &)
const)
146 std::size_t initialize_state_dispatch (SingleParticle<T> sp,
147 std::size_t (*) (SingleParticle<T>))
148 {
return Derived::initialize_state(sp);}
150 void initialize_param_dispatch (Particle<T> &particle,
void *param,
151 void (*) (Particle<T> &,
void *))
152 {Derived::initialize_param(particle, param);}
154 void pre_processor_dispatch (Particle<T> &particle,
155 void (*) (Particle<T> &))
156 {Derived::pre_processor(particle);}
158 void post_processor_dispatch (Particle<T> &particle,
159 void (*) (Particle<T> &))
160 {Derived::post_processor(particle);}
164 std::size_t initialize_state_dispatch (SingleParticle<T>,
168 void initialize_param_dispatch (Particle<T> &,
void *,
171 void pre_processor_dispatch (Particle<T> &,
174 void post_processor_dispatch (Particle<T> &,
180 template <
typename T>
197 template <
typename T,
typename Derived>
203 {
return move_state_dispatch(iter, sp, &Derived::move_state);}
206 {pre_processor_dispatch(iter, particle, &Derived::pre_processor);}
209 {post_processor_dispatch(iter, particle, &Derived::post_processor);}
219 template <typename D>
222 {
return static_cast<Derived *
>(
this)->
move_state(iter, sp);}
224 template <
typename D>
225 void pre_processor_dispatch (std::size_t iter,
Particle<T> &particle,
227 {
static_cast<Derived *
>(
this)->
pre_processor(iter, particle);}
229 template <
typename D>
230 void post_processor_dispatch (std::size_t iter, Particle<T> &particle,
231 void (D::*) (std::size_t, Particle<T> &))
236 template <
typename D>
237 std::size_t move_state_dispatch (std::size_t iter, SingleParticle<T> sp,
238 std::size_t (D::*) (std::size_t, SingleParticle<T>)
const)
239 {
return static_cast<Derived *
>(
this)->
move_state(iter, sp);}
241 template <
typename D>
242 void pre_processor_dispatch (std::size_t iter, Particle<T> &particle,
243 void (D::*) (std::size_t, Particle<T> &)
const)
244 {
static_cast<Derived *
>(
this)->
pre_processor(iter, particle);}
246 template <
typename D>
247 void post_processor_dispatch (std::size_t iter, Particle<T> &particle,
248 void (D::*) (std::size_t, Particle<T> &)
const)
253 std::size_t move_state_dispatch (std::size_t iter, SingleParticle<T> sp,
254 std::size_t (*) (std::size_t, SingleParticle<T>))
255 {
return Derived::move_state(iter, sp);}
257 void pre_processor_dispatch (std::size_t iter, Particle<T> &particle,
258 void (*) (std::size_t, Particle<T> &))
259 {Derived::pre_processor(iter, particle);}
261 void post_processor_dispatch (std::size_t iter, Particle<T> &particle,
262 void (*) (std::size_t, Particle<T> &))
263 {Derived::post_processor(iter, particle);}
267 std::size_t move_state_dispatch (std::size_t, SingleParticle<T>,
268 std::size_t (
MoveBase::*) (std::size_t, SingleParticle<T>))
271 void pre_processor_dispatch (std::size_t, Particle<T> &,
272 void (
MoveBase::*) (std::size_t, Particle<T> &)) {}
274 void post_processor_dispatch (std::size_t, Particle<T> &,
275 void (
MoveBase::*) (std::size_t, Particle<T> &)) {}
280 template <
typename T>
296 template <
typename T,
typename Derived>
303 {monitor_state_dispatch(iter, dim, csp, res, &Derived::monitor_state);}
306 {pre_processor_dispatch(iter, particle, &Derived::pre_processor);}
309 {post_processor_dispatch(iter, particle, &Derived::post_processor);}
319 template <typename D>
320 void monitor_state_dispatch (
std::
size_t iter,
std::
size_t dim,
324 {
static_cast<Derived *
>(
this)->
monitor_state(iter, dim, csp, res);}
326 template <
typename D>
327 void pre_processor_dispatch (std::size_t iter,
330 {
static_cast<Derived *
>(
this)->
pre_processor(iter, particle);}
332 template <
typename D>
333 void post_processor_dispatch (std::size_t iter,
334 const Particle<T> &particle,
335 void (D::*) (std::size_t,
const Particle<T> &))
340 template <
typename D>
341 void monitor_state_dispatch (std::size_t iter, std::size_t dim,
342 ConstSingleParticle<T> csp,
double *res,
343 void (D::*) (std::size_t, std::size_t, ConstSingleParticle<T>,
345 {
static_cast<Derived *
>(
this)->
monitor_state(iter, dim, csp, res);}
347 template <
typename D>
348 void pre_processor_dispatch (std::size_t iter,
349 const Particle<T> &particle,
350 void (D::*) (std::size_t,
const Particle<T> &)
const)
351 {
static_cast<Derived *
>(
this)->
pre_processor(iter, particle);}
353 template <
typename D>
354 void post_processor_dispatch (std::size_t iter,
355 const Particle<T> &particle,
356 void (D::*) (std::size_t,
const Particle<T> &)
const)
361 void monitor_state_dispatch (std::size_t iter, std::size_t dim,
362 ConstSingleParticle<T> csp,
double *res,
363 void (*) (std::size_t, std::size_t, ConstSingleParticle<T>,
365 {Derived::monitor_state(iter, dim, csp, res);}
367 void pre_processor_dispatch (std::size_t iter,
368 const Particle<T> &particle,
369 void (*) (std::size_t,
const Particle<T> &))
370 {Derived::pre_processor(iter, particle);}
372 void post_processor_dispatch (std::size_t iter,
373 const Particle<T> &particle,
374 void (*) (std::size_t,
const Particle<T> &))
375 {Derived::post_processor(iter, particle);}
379 void monitor_state_dispatch (std::size_t, std::size_t ,
380 ConstSingleParticle<T>,
double *,
382 (std::size_t, std::size_t, ConstSingleParticle<T>,
double *)) {}
384 void pre_processor_dispatch (std::size_t,
const Particle<T> &,
387 void post_processor_dispatch (std::size_t,
const Particle<T> &,
393 template <
typename T>
410 template <
typename T,
typename Derived>
416 {
return path_state_dispatch(iter, csp, &Derived::path_state);}
419 {
return path_grid_dispatch(iter, particle, &Derived::path_grid);}
422 {pre_processor_dispatch(iter, particle, &Derived::pre_processor);}
425 {post_processor_dispatch(iter, particle, &Derived::post_processor);}
435 template <typename D>
438 {
return static_cast<Derived *
>(
this)->
path_state(iter, csp);}
440 template <
typename D>
441 double path_grid_dispatch (std::size_t iter,
const Particle<T> &particle,
443 {
return static_cast<Derived *
>(
this)->
path_grid(iter, particle);}
445 template <
typename D>
446 void pre_processor_dispatch (std::size_t iter,
447 const Particle<T> &particle,
448 void (D::*) (std::size_t,
const Particle<T> &))
449 {
static_cast<Derived *
>(
this)->
pre_processor(iter, particle);}
451 template <
typename D>
452 void post_processor_dispatch (std::size_t iter,
453 const Particle<T> &particle,
454 void (D::*) (std::size_t,
const Particle<T> &))
459 template <
typename D>
460 double path_state_dispatch (std::size_t iter, ConstSingleParticle<T> csp,
461 double (D::*) (std::size_t, ConstSingleParticle<T>)
const)
462 {
return static_cast<Derived *
>(
this)->
path_state(iter, csp);}
464 template <
typename D>
465 double path_grid_dispatch (std::size_t iter,
const Particle<T> &particle,
466 double (D::*) (std::size_t,
const Particle<T> &)
const)
467 {
return static_cast<Derived *
>(
this)->
path_grid(iter, particle);}
469 template <
typename D>
470 void pre_processor_dispatch (std::size_t iter,
471 const Particle<T> &particle,
472 void (D::*) (std::size_t,
const Particle<T> &)
const)
473 {
static_cast<Derived *
>(
this)->
pre_processor(iter, particle);}
475 template <
typename D>
476 void post_processor_dispatch (std::size_t iter,
477 const Particle<T> &particle,
478 void (D::*) (std::size_t,
const Particle<T> &)
const)
483 double path_state_dispatch (std::size_t iter, ConstSingleParticle<T> csp,
484 double (*) (std::size_t, ConstSingleParticle<T>))
485 {
return Derived::path_state(iter, csp);}
487 double path_grid_dispatch (std::size_t iter,
const Particle<T> &particle,
488 double (*) (std::size_t,
const Particle<T> &))
489 {
return Derived::path_grid(iter, particle);}
491 void pre_processor_dispatch (std::size_t iter,
const Particle<T> &particle,
492 void (*) (std::size_t,
const Particle<T> &))
493 {Derived::pre_processor(iter, particle);}
495 void post_processor_dispatch (std::size_t iter,
496 const Particle<T> &particle,
497 void (*) (std::size_t,
const Particle<T> &))
498 {Derived::post_processor(iter, particle);}
502 double path_state_dispatch (std::size_t, ConstSingleParticle<T>,
503 double (
PathEvalBase::*) (std::size_t, ConstSingleParticle<T>))
506 double path_grid_dispatch (std::size_t,
const Particle<T> &,
507 double (
PathEvalBase::*) (std::size_t,
const Particle<T> &))
510 void pre_processor_dispatch (std::size_t,
const Particle<T> &,
511 void (
PathEvalBase::*) (std::size_t,
const Particle<T> &)) {}
513 void post_processor_dispatch (std::size_t,
const Particle<T> &,
514 void (
PathEvalBase::*) (std::size_t,
const Particle<T> &)) {}
519 template <
typename T>
536 #endif // VSMC_SMP_BACKEND_BASE_HPP
Particle class representing the whole particle set.
void initialize_param(Particle< T > &particle, void *param)
virtual void pre_processor(std::size_t, const Particle< T > &)
virtual void post_processor(std::size_t, const Particle< T > &)
virtual void pre_processor(std::size_t, Particle< T > &)
void pre_processor(Particle< T > &particle)
Monitor evalution base dispatch class.
void post_processor(std::size_t iter, const Particle< T > &particle)
virtual void pre_processor(Particle< T > &)
virtual double path_state(std::size_t, ConstSingleParticle< T >)
double path_grid(std::size_t iter, const Particle< T > &particle)
void post_processor(std::size_t iter, Particle< T > &particle)
std::size_t move_state(std::size_t iter, SingleParticle< T > sp)
virtual std::size_t initialize_state(SingleParticle< T >)
void pre_processor(std::size_t iter, Particle< T > &particle)
virtual void post_processor(std::size_t, const Particle< T > &)
virtual std::size_t move_state(std::size_t, SingleParticle< T >)
void monitor_state(std::size_t iter, std::size_t dim, ConstSingleParticle< T > csp, double *res)
#define VSMC_DEFINE_SMP_BASE_COPY(Name)
void post_processor(std::size_t iter, const Particle< T > &particle)
std::size_t initialize_state(SingleParticle< T > sp)
void pre_processor(std::size_t iter, const Particle< T > &particle)
Move base dispatch class.
virtual void post_processor(std::size_t, Particle< T > &)
double path_state(std::size_t iter, ConstSingleParticle< T > csp)
virtual void post_processor(Particle< T > &)
virtual double path_grid(std::size_t, const Particle< T > &)
void post_processor(Particle< T > &particle)
Path evalution base dispatch class.
#define VSMC_DEFINE_SMP_BASE_COPY_VIRTUAL(Name)
virtual void pre_processor(std::size_t, const Particle< T > &)
A thin wrapper over a complete Particle.
virtual void initialize_param(Particle< T > &, void *)
void pre_processor(std::size_t iter, const Particle< T > &particle)
A const variant to SingleParticle.
Initialize base dispatch class.
virtual void monitor_state(std::size_t, std::size_t, ConstSingleParticle< T >, double *)