1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/*
* File: FixVec.h
* Summary: Fixed size vector class that asserts if you do something bad.
* Written by: Jesse Jones
*
* Change History (most recent first):
*
* <2> 7/29/00 JDJ Added a variable argument ctor.
* <1> 6/16/00 JDJ Created
*/
#ifndef FIXVEC_H
#define FIXVEC_H
#include <stdarg.h>
#include "debug.h"
// ==========================================================================
// class FixedVector
// ==========================================================================
template <class TYPE, int SIZE> class FixedVector {
//-----------------------------------
// Types
//
public:
typedef TYPE value_type;
typedef TYPE& reference;
typedef const TYPE& const_reference;
typedef TYPE* pointer;
typedef const TYPE* const_pointer;
typedef unsigned long size_type;
typedef long difference_type;
typedef TYPE* iterator;
typedef const TYPE* const_iterator;
#if 0
#if MSVC >= 1100
typedef std::reverse_iterator<const_iterator, const TYPE> const_reverse_iterator;
typedef std::reverse_iterator<iterator, TYPE> reverse_iterator;
#else
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
#endif
#endif
//-----------------------------------
// Initialization/Destruction
//
public:
~FixedVector() {}
FixedVector() {}
FixedVector(TYPE value0, TYPE value1, ...);
// Allows for something resembling C array initialization, eg
// instead of "int a[3] = {0, 1, 2}" you'd use "FixedVector<int, 3>
// a(0, 1, 2)". Note that there must be SIZE arguments.
// public:
// FixedVector(const FixedVector& rhs);
//
// FixedVector& operator=(const FixedVector& rhs);
//-----------------------------------
// API
//
public:
// ----- Size -----
bool empty() const {return SIZE == 0;}
int size() const {return SIZE;}
// ----- Access -----
TYPE& operator[](unsigned long index) {ASSERT(index < SIZE); return mData[index];}
const TYPE& operator[](unsigned long index) const {ASSERT(index < SIZE); return mData[index];}
TYPE& front() {ASSERT(SIZE > 0); return mData[0];}
const TYPE& front() const {ASSERT(SIZE > 0); return mData[0];}
TYPE& back() {ASSERT(SIZE > 0); return mData[SIZE - 1];}
const TYPE& back() const {ASSERT(SIZE > 0); return mData[SIZE - 1];}
TYPE* buffer() {return mData;}
const TYPE* buffer() const {return mData;}
// ----- Iterating -----
iterator begin() {return mData;}
const_iterator begin() const {return mData;}
iterator end() {return this->begin() + this->size();}
const_iterator end() const {return this->begin() + this->size();}
// reverse_iterator rbegin() {return reverse_iterator(this->end());}
// const_reverse_iterator rbegin() const {return const_reverse_iterator(this->end());}
// reverse_iterator rend() {return reverse_iterator(this->begin());}
// const_reverse_iterator rend() const {return const_reverse_iterator(this->begin());}
//-----------------------------------
// Member Data
//
protected:
TYPE mData[SIZE];
};
// ==========================================================================
// Outlined Methods
// ==========================================================================
template <class TYPE, int SIZE>
FixedVector<TYPE, SIZE>::FixedVector(TYPE value0, TYPE value1, ...)
{
mData[0] = value0;
mData[1] = value1;
va_list ap;
va_start(ap, value1); // second argument is last fixed parameter
for (int index = 2; index < SIZE; index++) {
TYPE value = va_arg(ap, TYPE);
mData[index] = value;
}
va_end(ap);
}
#endif // FIXVEC_H
|