2021-04-21 15:45:31 -07:00
|
|
|
|
|
|
|
|
// A Scalar that asserts for uninitialized access.
|
|
|
|
|
template <typename T>
|
|
|
|
|
class SafeScalar {
|
|
|
|
|
public:
|
|
|
|
|
SafeScalar() : initialized_(false) {}
|
2023-12-05 21:22:55 +00:00
|
|
|
|
2024-03-29 21:49:27 +00:00
|
|
|
SafeScalar(const T& val) : val_(val), initialized_(true) {}
|
|
|
|
|
|
|
|
|
|
template <typename Source>
|
|
|
|
|
explicit SafeScalar(const Source& val) : SafeScalar(T(val)) {}
|
2023-12-05 21:22:55 +00:00
|
|
|
|
2021-04-21 15:45:31 -07:00
|
|
|
operator T() const {
|
|
|
|
|
VERIFY(initialized_ && "Uninitialized access.");
|
|
|
|
|
return val_;
|
|
|
|
|
}
|
2023-12-05 21:22:55 +00:00
|
|
|
|
2024-03-29 21:49:27 +00:00
|
|
|
template <typename Target>
|
|
|
|
|
explicit operator Target() const {
|
|
|
|
|
return Target(this->operator T());
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-21 15:45:31 -07:00
|
|
|
private:
|
|
|
|
|
T val_;
|
|
|
|
|
bool initialized_;
|
|
|
|
|
};
|
2024-01-31 08:16:29 +00:00
|
|
|
|
|
|
|
|
namespace Eigen {
|
|
|
|
|
template <typename T>
|
2024-03-29 21:49:27 +00:00
|
|
|
struct NumTraits<SafeScalar<T>> : GenericNumTraits<T> {
|
|
|
|
|
enum { RequireInitialization = 1 };
|
2024-01-31 08:16:29 +00:00
|
|
|
};
|
2024-03-29 21:49:27 +00:00
|
|
|
} // namespace Eigen
|