Windows2003-3790/inetsrv/iis/svcs/cmp/asp/vector.h
2020-09-30 16:53:55 +02:00

101 lines
2.8 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1997 Microsoft Corporation. All Rights Reserved.
Component: misc
File: vector.h
Owner: DGottner
This file contains a dynamic array
===================================================================*
/*
* This file is derived from software bearing the following
* restrictions:
*
* Copyright 1994, David Gottner
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice, this permission notice and
* the following disclaimer notice appear unmodified in all copies.
*
* I DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL I
* BE LIABLE FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
* DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA, OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#ifndef VECTOR_H
#define VECTOR_H
/*---------------------------------------------------------------------------*
** The vector class is a thin encapsulation of a C style array, which
** allows dynamic sizing of the array and bounds checking; you can also use
** this array as a stack. This is a value-based collection.
*/
template <class TYPE>
class vector {
TYPE * m_rgData;
size_t m_cItems;
size_t m_cCells;
public:
vector<TYPE>();
~vector();
HRESULT Init(const TYPE *, size_t);
HRESULT Init(size_t n);
vector<TYPE> &operator= (const vector<TYPE> &);
size_t length() const { return m_cItems; }
const TYPE *vec() const { return m_rgData; }
// STL iterators (const)
const TYPE *begin() const { return &m_rgData[0]; }
const TYPE *end() const { return &m_rgData[m_cItems]; }
// STL iterators (non-const)
TYPE *begin() { return &m_rgData[0]; }
TYPE *end() { return &m_rgData[m_cItems]; }
TYPE operator[](unsigned i) const
{
Assert (i < m_cItems);
return m_rgData[i];
}
TYPE &operator[](unsigned i)
{
Assert (i < m_cItems);
return m_rgData[i];
}
HRESULT resize(size_t);
HRESULT reshape(size_t);
HRESULT append(const TYPE &a) { return insertAt(m_cItems, a); }
HRESULT prepend(const TYPE &a) { return insertAt(0, a); }
HRESULT insertAt(size_t, const TYPE &);
TYPE removeAt(size_t);
HRESULT push(const TYPE &a) { return append(a); }
TYPE pop() { return m_rgData[--m_cItems]; }
int find(const TYPE &) const;
};
#endif /* VECTOR */