xref: /aosp_15_r20/external/eigen/test/SafeScalar.h (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li 
2*bf2c3715SXin Li // A Scalar that asserts for uninitialized access.
3*bf2c3715SXin Li template<typename T>
4*bf2c3715SXin Li class SafeScalar {
5*bf2c3715SXin Li  public:
SafeScalar()6*bf2c3715SXin Li   SafeScalar() : initialized_(false) {}
SafeScalar(const SafeScalar & other)7*bf2c3715SXin Li   SafeScalar(const SafeScalar& other) {
8*bf2c3715SXin Li     *this = other;
9*bf2c3715SXin Li   }
10*bf2c3715SXin Li   SafeScalar& operator=(const SafeScalar& other) {
11*bf2c3715SXin Li     val_ = T(other);
12*bf2c3715SXin Li     initialized_ = true;
13*bf2c3715SXin Li     return *this;
14*bf2c3715SXin Li   }
15*bf2c3715SXin Li 
SafeScalar(T val)16*bf2c3715SXin Li   SafeScalar(T val) : val_(val), initialized_(true) {}
17*bf2c3715SXin Li   SafeScalar& operator=(T val) {
18*bf2c3715SXin Li     val_ = val;
19*bf2c3715SXin Li     initialized_ = true;
20*bf2c3715SXin Li   }
21*bf2c3715SXin Li 
T()22*bf2c3715SXin Li   operator T() const {
23*bf2c3715SXin Li     VERIFY(initialized_ && "Uninitialized access.");
24*bf2c3715SXin Li     return val_;
25*bf2c3715SXin Li   }
26*bf2c3715SXin Li 
27*bf2c3715SXin Li  private:
28*bf2c3715SXin Li   T val_;
29*bf2c3715SXin Li   bool initialized_;
30*bf2c3715SXin Li };
31