00001
00002
00003
00004
00005 #ifndef __VMS_ARRAY_H_
00006 #define __VMS_ARRAY_H_
00007
00008 namespace vms
00009 {
00010
00011 template <class T>
00012 struct array
00013 {
00014 array (int nInitialSize = 0) {
00015 construct_init_object ();
00016 if (nInitialSize)
00017 realloc (nInitialSize);
00018 }
00019 ~array () {if (m_p) delete [] m_p;}
00020
00021 array (const array& a) {
00022 construct_init_object ();
00023 operator=(a);
00024 }
00025
00026 operator T* () {return m_p;}
00027
00028 void put_Data (const T* const p, int len) {
00029 if (m_size < len)
00030 realloc (len);
00031 CopyMemory (m_p, p, len * sizeof (T));
00032 m_len = len;
00033 }
00034
00035 array& operator= (const array& a) {
00036 put_Data (a, a.m_len);
00037 return *this;
00038 }
00039
00040 array& operator += (const array& a) {add (a, a.m_len); return *this;}
00041
00042 void add (const T* const p, int len) {
00043 realloc (m_len + len);
00044 CopyMemory (m_p + m_len, p, len * sizeof (T));
00045 m_len += len;
00046 }
00047
00048 T& operator [] (int nIndex)
00049 {
00050 if (nIndex+1 > m_size)
00051 realloc (nIndex+1);
00052
00053 if (m_len <= nIndex) {
00054 m_len = nIndex + 1;
00055 m_p [nIndex] = T(0);
00056 }
00057 return m_p [nIndex];
00058 }
00059
00060 void realloc (int nNewLen)
00061 {
00062 if (nNewLen < m_size)
00063 return;
00064 T* p = new T [nNewLen];
00065 if (m_p) {
00066 CopyMemory (p, m_p, sizeof (T)*m_len);
00067 delete [] m_p;
00068 }
00069 m_p = p;
00070 m_size = nNewLen;
00071 }
00072
00073 void clear () {m_len = 0;};
00074
00075 int length () {return m_len;}
00076 int capacity () {return m_size;}
00077
00078 protected:
00079 void construct_init_object () {
00080 m_p = 0;
00081 m_size = m_len = 0;
00082 m_grow = 1000;
00083 };
00084 T* m_p;
00085 int m_size;
00086 int m_len;
00087 int m_grow;
00088 };
00089
00090 };
00091
00092 #endif