Mercurial > ~dholland > hg > ag > index.cgi
view oldclasslib/include/array.h @ 16:f9e4689b837d
Some minor updates for 15 years later.
author | David A. Holland |
---|---|
date | Tue, 31 May 2022 01:45:26 -0400 |
parents | 13d2b8934445 |
children |
line wrap: on
line source
/* * AnaGram, a System for Syntax Directed Programming * * Array Storage Class Definition * * Please note that the entire class is defined in this module. There * is no supplementary code module. * * Copyright 1993 Parsifal Software. All Rights Reserved. * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ #ifndef ARRAY_H #define ARRAY_H #include <assert.h> #include <stdio.h> #include <string.h> // some forward decls required by current C++ template <class T> class array; template <class T> unsigned size(const array <T> &c); template <class T> class array { private: T *base; // pointer to storage unsigned length; // size of array int *use_count; // reference counter public: // Constructors array (const unsigned n) { base = new T[length = n]; // allocate storage memset(base,0,n*sizeof(T)); // clear to zero use_count = new int; *use_count = 1; // init use count } array (const T *src, const unsigned n) { base = new T[length = n]; // allocate storage memmove(base,src, n*sizeof(T)); // copy initial data use_count = new int; *use_count = 1; // init use count } array(const array<T> &a) { *this = a; (*use_count)++; // increment use count } array<T> &operator =(const array<T> &a) { if (--(*use_count) == 0) { delete [] base; delete use_count; } *this = a; (*use_count)++; // increment use count return *this; } // Destructor ~array() { if (--(*use_count) == 0) { delete [] base; delete use_count; } } // Access to data operator T* () const { // Return pointer to data return base; } T &operator [](unsigned n) const { // Direct access to data assert(n < length); return base[n]; } T &operator [](int n) const { // Direct access to data assert(n >= 0 && (unsigned) n < length); return base[n]; } // Size of array #ifdef __IBMCPP__ friend unsigned size(const array<T> &c); #else friend unsigned size<>(const array<T> &c); #endif }; template <class T> inline unsigned size(const array <T> &c) { return c.length; } #endif