#ifndef FznMZXtH9pg7npfVO7D248udzM8 #define FznMZXtH9pg7npfVO7D248udzM8 #include #include #include "context.hpp" #include "continuous_property.hpp" #include "template_helpers.hpp" #include "pla_set.hpp" #include "time.hpp" // local state // general case: no action (and zero storage) template struct PLA_Evolve_LocalState { template inline void evolve(PropComp &pc, Context context, LocalData &data, Time newTime) { DO_NOT_CALL; } template inline void commit(PropComp &pc, Context context, Time time) { DO_NOT_CALL; } }; // matching case: get/set the value to local storage template struct PLA_Evolve_LocalState { typename Prop::type val; template inline void evolve(PropComp &pc, Context context, LocalData &data, Time newTime) { // calc time difference (= time amount we evolve) Time oldTime = data.data.getTime(newTime, context.template getptr()()); Time dt = newTime - oldTime; assert(dt >= 0); // calc new val and store locally val = ContinuousProperty_Evolve:: eval(pc, context, oldTime, dt); } template inline void commit(PropComp &pc, Context context, Time time) { Ptr dst(context.template getptr()); PLA_Set pla_set(time, dst, val); pc.call(pla_set); } }; // evolve action template > struct PLA_Evolve { // action types & consts typedef Void result_t; template struct local_state_t : PLA_Evolve_LocalState { typedef ContextProp prop; }; // action state & constructor typedef typename Quant::instance_ptr_t instance_ptr_t; Context context; Time newTime; result_t result; PLA_Evolve(Context context, Time newTime) : context(context), newTime(newTime) {} // action methods template inline void pre(PropComp &pc, LocalData &data, LocalState &state) { // if we have the correct quantity ... if (boost::is_same::value) state.evolve(pc, context, data, newTime); // ... evolve it } template inline void post(_PropComp &pc, _LocalData &data, LocalState &state) { // if we have the correct quantity ... if (boost::is_same::value) state.commit(pc, context, newTime); // ... store new value and time } private: PLA_Evolve(); }; #endif // FznMZXtH9pg7npfVO7D248udzM8