1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */ 2 3 #ifndef _SAFE_VECTOR_H 4 #define _SAFE_VECTOR_H 5 6 #include <vector> 7 8 #define USE_SAFE_VECTOR 9 10 #ifdef USE_SAFE_VECTOR 11 #include "System/creg/creg_cond.h" 12 13 template<class T> 14 class safe_vector : public std::vector<T> 15 { 16 CR_DECLARE_STRUCT(safe_vector) 17 18 public: 19 typedef typename std::vector<T>::size_type size_type; 20 safe_vector()21 safe_vector(): showError(true) {} safe_vector(size_type size,T value)22 safe_vector(size_type size, T value): std::vector<T>(size, value), showError(true) {} safe_vector(const safe_vector<T> & vec)23 safe_vector(const safe_vector<T>& vec): std::vector<T>(vec), showError(true) {} 24 25 const T& operator[] (const size_type i) const { 26 if (i >= std::vector<T>::size()) 27 return safe_element(i); 28 return std::vector<T>::operator[](i); 29 } 30 T& operator[] (const size_type i) { 31 if (i >= std::vector<T>::size()) 32 return safe_element(i); 33 return std::vector<T>::operator[](i); 34 } 35 at(const size_type i)36 const T& at (const size_type i) const { 37 if (i >= std::vector<T>::size()) 38 return safe_element(i); 39 return std::vector<T>::at(i); 40 } at(const size_type i)41 T& at (const size_type i) { 42 if (i >= std::vector<T>::size()) 43 return safe_element(i); 44 return std::vector<T>::at(i); 45 } 46 47 private: 48 const T& safe_element(size_type idx) const; 49 T& safe_element(size_type idx); 50 51 mutable bool showError; 52 }; 53 54 #else 55 #define safe_vector std::vector 56 #endif 57 58 #endif // _SAFE_VECTOR_H 59