xref: /onnv-gate/usr/src/cmd/man/src/util/nsgmls.src/include/Vector.h (revision 0:68f95e015346)
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