1 // Copyright (c) 1994, 1996 James Clark 2 // See the file COPYING for copying permission. 3 #pragma ident "%Z%%M% %I% %E% SMI" 4 5 #ifndef Vector_INCLUDED 6 #define Vector_INCLUDED 1 7 8 #include <stddef.h> 9 #include "xnew.h" 10 11 // This offers a subset of the interface offered by the standard C++ 12 // vector class as defined in the Jan 96 WP. 13 // Code in SP currently assumes that size_type is size_t. 14 15 #ifdef SP_NAMESPACE 16 namespace SP_NAMESPACE { 17 #endif 18 19 template<class T> 20 class Vector { 21 public: 22 typedef size_t size_type; 23 typedef T *iterator; 24 typedef const T *const_iterator; Vector()25 Vector() : ptr_(0), size_(0), alloc_(0) { } Vector(size_t n)26 Vector(size_t n) : ptr_(0), size_(0), alloc_(0) { append(n); } 27 ~Vector(); resize(size_t n)28 void resize(size_t n) { 29 if (n < size_) 30 erase(ptr_ + n, ptr_ + size_); 31 else if (n > size_) 32 append(n - size_); 33 } 34 #ifndef NC 35 Vector(size_t, const T &); 36 Vector(const Vector<T> &); 37 Vector<T> &operator=(const Vector<T> &); 38 void assign(size_t, const T &); push_back(const T & t)39 void push_back(const T &t) { 40 reserve(size_ + 1); 41 (void)new (ptr_ + size_) T(t); 42 size_++; 43 } 44 void insert(const_iterator p, size_t n, const T &t); 45 void insert(const_iterator p, const_iterator q1, const_iterator q2); 46 #endif 47 void swap(Vector<T> &); clear()48 void clear() { erase(ptr_, ptr_ + size_); } size()49 size_t size() const { return size_; } 50 T &operator[](size_t i) { return ptr_[i]; } 51 const T &operator[](size_t i) const { return ptr_[i]; } begin()52 iterator begin() { return ptr_; } begin()53 const_iterator begin() const { return ptr_; } back()54 T &back() { return ptr_[size_ - 1]; } back()55 const T &back() const { return ptr_[size_ - 1]; } reserve(size_t n)56 void reserve(size_t n) { if (n > alloc_) reserve1(n); } 57 iterator erase(const_iterator, const_iterator); 58 private: 59 #ifdef NC 60 Vector(const Vector<T> &); 61 void operator=(const Vector<T> &); 62 #endif 63 void append(size_t); 64 void reserve1(size_t); 65 66 size_t size_; 67 T *ptr_; 68 size_t alloc_; // allocated size 69 }; 70 71 #ifdef SP_NAMESPACE 72 } 73 #endif 74 75 #endif /* not Vector_INCLUDED */ 76 77 #ifdef SP_DEFINE_TEMPLATES 78 #include "Vector.cxx" 79 #endif 80