00001 #ifndef MERT_SCOPED_VECTOR_H_
00002 #define MERT_SCOPED_VECTOR_H_
00003
00004 #include <vector>
00005
00006 namespace MosesTuning
00007 {
00008
00009 template <class T>
00010 class ScopedVector
00011 {
00012 public:
00013 typedef typename std::vector<T*>::iterator iterator;
00014 typedef typename std::vector<T*>::const_iterator const_iterator;
00015
00016 ScopedVector() {}
00017 virtual ~ScopedVector() {
00018 reset();
00019 }
00020
00021 bool empty() const {
00022 return m_vec.empty();
00023 }
00024
00025 void push_back(T *e) {
00026 m_vec.push_back(e);
00027 }
00028
00029 void reset() {
00030 for (iterator it = m_vec.begin(); it != m_vec.end(); ++it) {
00031 delete *it;
00032 }
00033 m_vec.clear();
00034 }
00035
00036 void reserve(std::size_t capacity) {
00037 m_vec.reserve(capacity);
00038 }
00039 void resize(std::size_t size) {
00040 m_vec.resize(size);
00041 }
00042
00043 std::size_t size() const {
00044 return m_vec.size();
00045 }
00046
00047 iterator begin() {
00048 return m_vec.begin();
00049 }
00050 const_iterator begin() const {
00051 return m_vec.begin();
00052 }
00053
00054 iterator end() {
00055 return m_vec.end();
00056 }
00057 const_iterator end() const {
00058 return m_vec.end();
00059 }
00060
00061 std::vector<T*>& get() {
00062 return m_vec;
00063 }
00064 const std::vector<T*>& get() const {
00065 return m_vec;
00066 }
00067
00068 std::vector<T*>* operator->() {
00069 return &m_vec;
00070 }
00071 const std::vector<T*>* operator->() const {
00072 return &m_vec;
00073 }
00074
00075 T*& operator[](std::size_t i) {
00076 return m_vec[i];
00077 }
00078 const T* operator[](std::size_t i) const {
00079 return m_vec[i];
00080 }
00081
00082 private:
00083 std::vector<T*> m_vec;
00084
00085
00086 ScopedVector<T>(const ScopedVector<T>&);
00087 void operator=(const ScopedVector<T>&);
00088 };
00089
00090 }
00091
00092 #endif // MERT_SCOPED_VECTOR_H_