mirror of https://github.com/ArduPilot/ardupilot
Implement a cast_to_float method for convenience; at a cost of a couple of bytes in the vtable this will save many callers having to play type introspection games.
It might be possible to implement a set of virtual cast operator overrides, but only float lets us return NAN to indicate that a cast can't be made, so for now we'll stick with just this one. git-svn-id: https://arducopter.googlecode.com/svn/trunk@1614 f9c3cf11-9bcb-44bc-f272-b75c42450872
This commit is contained in:
parent
56eea84a89
commit
107e06d849
|
@ -19,6 +19,7 @@ extern "C" { extern void delay(unsigned long); }
|
|||
|
||||
#include <AP_Common.h>
|
||||
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
|
||||
// Global constants exported for general use.
|
||||
|
@ -313,6 +314,14 @@ AP_Var::key(void)
|
|||
return var_header.key;
|
||||
}
|
||||
|
||||
// Default implementation of cast_to_float, which always fails.
|
||||
//
|
||||
float
|
||||
AP_Var::cast_to_float(void) const
|
||||
{
|
||||
return NAN;
|
||||
}
|
||||
|
||||
// Return the next variable in the global list.
|
||||
//
|
||||
AP_Var *
|
||||
|
|
|
@ -335,6 +335,17 @@ public:
|
|||
///
|
||||
Key key(void);
|
||||
|
||||
/// Casts the value to float, if possible.
|
||||
///
|
||||
/// This is a convenience method for code that would rather not try to
|
||||
/// meta-cast to the various subtypes. It cannot guarantee that a useful value
|
||||
/// will be returned; the caller must check the returned value against NAN
|
||||
/// before using it.
|
||||
///
|
||||
/// @return The value cast to float, or NAN if it cannot be cast.
|
||||
///
|
||||
virtual float cast_to_float() const;
|
||||
|
||||
private:
|
||||
AP_Var_group *_group; ///< Group that the variable may be a member of
|
||||
AP_Var *_link; ///< linked list pointer to next variable
|
||||
|
@ -547,10 +558,23 @@ public:
|
|||
return *this;
|
||||
}
|
||||
|
||||
/// AP_VarT types can implement AP_Var::cast_to_float
|
||||
///
|
||||
virtual float cast_to_float() const;
|
||||
|
||||
protected:
|
||||
T _value;
|
||||
};
|
||||
|
||||
// Implement AP_Var::cast_to_float.
|
||||
//
|
||||
template<typename T>
|
||||
float
|
||||
AP_VarT<T>::cast_to_float() const
|
||||
{
|
||||
return (float)_value;
|
||||
}
|
||||
|
||||
/// Template class for array variables.
|
||||
///
|
||||
/// Objects created using this template behave like arrays of the type T,
|
||||
|
@ -671,7 +695,6 @@ protected:
|
|||
T _value[N];
|
||||
};
|
||||
|
||||
|
||||
/// Convenience macro for defining instances of the AP_VarT template.
|
||||
///
|
||||
#define AP_VARDEF(_t, _n) typedef AP_VarT<_t> AP_##_n;
|
||||
|
|
Loading…
Reference in New Issue