00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkFixedArray_h
00018
#define __itkFixedArray_h
00019
00020
#include "itkMacro.h"
00021
00022
namespace itk
00023 {
00024
00031
template <
typename TVector>
00032 struct GetVectorDimension
00033 {
00034
itkStaticConstMacro(VectorDimension,
unsigned int, TVector::Dimension);
00035 };
00036
00037
00038
00058
template <
typename TValueType,
unsigned int VLength=3>
00059 class FixedArray
00060 {
00061
public:
00063
itkStaticConstMacro(Length,
unsigned int, VLength);
00064
00066
itkStaticConstMacro(Dimension,
unsigned int, VLength);
00067
00069 typedef TValueType ValueType;
00070
00072 typedef ValueType
CArray[VLength];
00073
00075 typedef ValueType*
Iterator;
00076
00078 typedef const ValueType*
ConstIterator;
00079
00081 class ReverseIterator
00082 {
00083
public:
00084 explicit ReverseIterator(
Iterator i): m_Iterator(i) {}
00085 Iterator operator++() {
return --m_Iterator; }
00086 Iterator operator++(
int) {
return m_Iterator--; }
00087 Iterator operator--() {
return ++m_Iterator; }
00088 Iterator operator--(
int) {
return m_Iterator++; }
00089 Iterator operator->()
const {
return (m_Iterator-1); }
00090 ValueType&
operator*()
const {
return *(m_Iterator-1); }
00091
private:
00092
Iterator m_Iterator;
00093 };
00094
00096 class ConstReverseIterator
00097 {
00098
public:
00099 explicit ConstReverseIterator(
ConstIterator i): m_Iterator(i) {}
00100 ConstIterator operator++() {
return --m_Iterator; }
00101 ConstIterator operator++(
int) {
return m_Iterator--; }
00102 ConstIterator operator--() {
return ++m_Iterator; }
00103 ConstIterator operator--(
int) {
return m_Iterator++; }
00104 ConstIterator operator->()
const {
return (m_Iterator-1); }
00105 const ValueType&
operator*()
const {
return *(m_Iterator-1); }
00106
private:
00107
ConstIterator m_Iterator;
00108 };
00109
00111 typedef ValueType*
pointer;
00112
00114 typedef const ValueType*
const_pointer;
00115
00117 typedef ValueType&
reference;
00118
00120 typedef const ValueType&
const_reference;
00121
00122 typedef unsigned int SizeType;
00123
00124
public:
00126
FixedArray();
00127
FixedArray(
const FixedArray& r);
00128
FixedArray(
const ValueType r[VLength]);
00129
00132
~FixedArray();
00133
00135
FixedArray&
operator= (
const FixedArray& r);
00136
FixedArray&
operator= (
const ValueType r[VLength]);
00137
00141
bool operator==(
const FixedArray& r )
const;
00142
bool operator!=(
const FixedArray& r )
const
00143
{
return !
operator==(r); }
00144
00148
reference operator[](
short index) {
return m_InternalArray[index]; }
00149 const_reference
operator[](
short index)
const {
return m_InternalArray[index]; }
00150 reference
operator[](
unsigned short index) {
return m_InternalArray[index]; }
00151 const_reference operator[](
unsigned short index)
const {
return m_InternalArray[index]; }
00152 reference operator[](
int index) {
return m_InternalArray[index]; }
00153 const_reference operator[](
int index)
const {
return m_InternalArray[index]; }
00154 reference operator[](
unsigned int index) {
return m_InternalArray[index]; }
00155 const_reference operator[](
unsigned int index)
const {
return m_InternalArray[index]; }
00156 reference operator[](
long index) {
return m_InternalArray[index]; }
00157 const_reference operator[](
long index)
const {
return m_InternalArray[index]; }
00158 reference operator[](
unsigned long index) {
return m_InternalArray[index]; }
00159 const_reference operator[](
unsigned long index)
const {
return m_InternalArray[index]; }
00160
00162 void SetElement(
unsigned short index,
const_reference value )
00163 { m_InternalArray[ index ] = value; }
00164 const_reference
GetElement(
unsigned short index )
const {
return m_InternalArray[index]; }
00165
00167 ValueType*
GetDataPointer() {
return m_InternalArray; }
00168 const ValueType*
GetDataPointer()
const {
return m_InternalArray; }
00169
00171 Iterator
Begin();
00172 ConstIterator Begin() const;
00173 Iterator End();
00174
ConstIterator End() const;
00175 ReverseIterator rBegin();
00176 ConstReverseIterator rBegin() const;
00177 ReverseIterator rEnd();
00178 ConstReverseIterator rEnd() const;
00179
SizeType Size() const;
00180
void Fill(const ValueType&);
00181
00182 private:
00184
CArray m_InternalArray;
00185
00186 public:
00187
00188 static
FixedArray Filled(const ValueType&);
00189 };
00190
00191 template <typename TValueType,
unsigned int VLength>
00192 std::ostream & operator<<(std::ostream &os, const
FixedArray<TValueType,VLength> &arr)
00193 {
00194 os <<
"[";
00195
if ( VLength == 1 )
00196 {
00197 os << arr[0] ;
00198 }
00199 else
00200 {
00201
for (
int i=0; i < static_cast<int>(VLength) - 1; ++i)
00202 {
00203 os << arr[i] <<
", ";
00204 }
00205 os << arr[VLength-1];
00206 }
00207 os <<
"]";
00208
return os;
00209 }
00210
00211 }
00212
00213
#ifndef ITK_MANUAL_INSTANTIATION
00214
#include "itkFixedArray.txx"
00215
#endif
00216
00217
#endif