1 #ifndef SimTK_SimTKCOMMON_MEASURE_H_
2 #define SimTK_SimTKCOMMON_MEASURE_H_
64 #define SimTK_MEASURE_HANDLE_PREAMBLE_BASE(MH,PH) \
65 class Implementation; \
66 explicit MH(Implementation* imp) : PH(imp) {} \
67 MH(SimTK::Subsystem& sub, Implementation* imp, \
68 const SimTK::AbstractMeasure::SetHandle& sh) \
70 MH& operator=(const MH& src) {PH::operator=(src); return *this;}\
71 MH& shallowAssign(const MH& src) {PH::shallowAssign(src); return *this;}\
72 MH& deepAssign(const MH& src) {PH::deepAssign(src); return *this;}
78 #define SimTK_MEASURE_HANDLE_PREAMBLE(MH,PH) \
79 SimTK_MEASURE_HANDLE_PREAMBLE_BASE(MH,PH) \
80 MH() : PH(new Implementation()) {} \
81 explicit MH(SimTK::Subsystem& sub) \
82 : PH(sub,new Implementation(), typename PH::SetHandle()) {}
88 #define SimTK_MEASURE_HANDLE_PREAMBLE_ABSTRACT(MH,PH) \
89 SimTK_MEASURE_HANDLE_PREAMBLE_BASE(MH,PH) \
111 #define SimTK_MEASURE_HANDLE_POSTSCRIPT(MH,PH) \
112 static bool isA(const SimTK::AbstractMeasure& m) \
113 { return dynamic_cast<const Implementation*>(&m.getImpl()) != 0; } \
114 static const MH& getAs(const SimTK::AbstractMeasure& m) \
115 { assert(isA(m)); return static_cast<const MH&>(m); } \
116 static MH& updAs(SimTK::AbstractMeasure& m) \
117 { assert(isA(m)); return static_cast<MH&>(m); } \
118 const Implementation& getImpl() const \
119 { return SimTK_DYNAMIC_CAST_DEBUG<const Implementation&> \
120 (SimTK::AbstractMeasure::getImpl());} \
121 Implementation& updImpl() \
122 { return SimTK_DYNAMIC_CAST_DEBUG<Implementation&> \
123 (SimTK::AbstractMeasure::updImpl());}
180 {
return shallowAssign(source); }
206 int getNumTimeDerivatives()
const;
216 Stage getDependsOnStage(
int derivOrder=0)
const;
221 {
return impl && impl==other.impl;}
226 bool isInSubsystem()
const;
234 MeasureIndex getSubsystemMeasureIndex()
const;
244 int getRefCount()
const;
249 Implementation* impl;
357 {
updImpl().setValue(value);
return *
this; }
378 explicit Zero(
int size);
398 explicit One(
int size);
432 void setValue(
State& state,
const T& value)
const
433 {
getImpl().setValue(state, value); }
493 {
updImpl().setDependsOnStage(dependsOn);
return *
this; }
500 {
updImpl().setInvalidatedStage(invalidated);
return *
this; }
514 Result& setIsPresumedValidAtDependsOnStage(
bool presume)
519 bool getIsPresumedValidAtDependsOnStage()
const
528 T& updValue(
const State& state)
const
529 {
return getImpl().updValue(state); }
551 void markAsNotValid(
const State& state)
const
552 {
getImpl().markAsNotValid(state); }
557 void setValue(
const State& state,
const T& value)
const
558 { updValue(state) = value; markAsValid(state); }
605 "Measure_<T>::Plus::ctor()",
606 "Arguments must be in the same Subsystem as this Measure.");
630 "Measure_<T>::Minus::ctor()",
631 "Arguments must be in the same Subsystem as this Measure.");
654 "Measure_<T>::Scale::ctor()",
655 "Argument must be in the same Subsystem as this Measure.");
660 {
return getImpl().getOperandMeasure(); }
688 const T& initAlloc=T(0))
694 void setValue(
State& s,
const T& value)
const
695 {
return getImpl().setValue(s, value); }
700 {
return getImpl().getDerivativeMeasure(); }
704 {
return getImpl().getInitialConditionMeasure(); }
707 {
updImpl().setDerivativeMeasure(d);
return *
this; }
709 {
updImpl().setInitialConditionMeasure(ic);
return *
this; }
758 bool isUsingApproximation()
const
759 {
return getImpl().isUsingApproximation(); }
764 {
return getImpl().getOperandMeasure(); }
770 {
updImpl().setOperandMeasure(operand);
return *
this; }
775 void setForceUseApproximation(
bool mustApproximate)
776 {
updImpl().setForceUseApproximation(mustApproximate); }
782 bool getForceUseApproximation()
const
783 {
return getImpl().getForceUseApproximation(); }
855 {
updImpl().setOperation(op);
return *
this; }
866 {
return getImpl().getTimeOfExtremeValue(state); }
868 void setValue(
State& s,
const T& value)
const
869 {
return getImpl().setValue(s, value); }
872 {
return getImpl().getOperandMeasure(); }
875 {
updImpl().setOperandMeasure(s);
return *
this; }
988 Delay& setUseLinearInterpolationOnly(
bool linearOnly)
989 {
updImpl().setUseLinearInterpolationOnly(linearOnly);
return *
this; }
1004 Delay& setCanUseCurrentValue(
bool canUseCurrentValue)
1005 {
updImpl().setCanUseCurrentValue(canUseCurrentValue);
return *
this; }
1009 {
updImpl().setSourceMeasure(source);
return *
this; }
1013 {
updImpl().setDelay(delay);
return *
this; }
1016 bool getUseLinearInterpolationOnly()
const
1017 {
return getImpl().getUseLinearInterpolationOnly(); }
1020 bool getCanUseCurrentValue()
const
1021 {
return getImpl().getCanUseCurrentValue(); }
1025 {
return getImpl().getSourceMeasure(); }
1030 {
return getImpl().getDelay(); }
1063 void setValue(
State& s,
const T& value)
const;
1066 void sample(
State& s)
const;
1079 #endif // SimTK_SimTKCOMMON_MEASURE_H_