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