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