00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkOffset_h
00018
#define __itkOffset_h
00019
00020
#include "itkMacro.h"
00021
#include "itkSize.h"
00022
00023
#include <memory>
00024
00025
#include "itkExceptionObject.h"
00026
00027
namespace itk
00028 {
00029
00047
template<
unsigned int VOffsetDimension=2>
00048 class Offset {
00049
public:
00051 typedef Offset Self;
00052
00054 static unsigned int GetOffsetDimension() {
return VOffsetDimension; }
00055
00057 typedef Offset<VOffsetDimension> OffsetType;
00058 typedef long OffsetValueType;
00059
00061
const Self
00062 operator+(
const Self &offset)
const
00063
{
00064
Self result;
00065
for (
unsigned int i=0; i < VOffsetDimension; i++)
00066 { result[i] = m_Offset[i] + offset[i]; }
00067
return result;
00068 }
00069
00071
const Self
00072
operator+(
const Size<VOffsetDimension> &size)
const
00073 {
00074
Self result;
00075
for (
unsigned int i=0; i < VOffsetDimension; i++)
00076 { result[i] = m_Offset[i] + size[i]; }
00077
return result;
00078 }
00079
00081
const Self &
00082
operator+=(
const Size<VOffsetDimension> &size)
00083 {
00084 for (
unsigned int i=0; i < VOffsetDimension; i++)
00085 { m_Offset[i] += size[i]; }
00086
return *
this;
00087 }
00088
00090
const Self &
00091
operator-=(
const Size<VOffsetDimension> &size)
00092 {
00093
for (
unsigned int i=0; i < VOffsetDimension; i++)
00094 { m_Offset[i] -= size[i]; }
00095
return *
this;
00096 }
00097
00099
const Self
00100
operator-(
const Self &vec)
00101 {
00102 Self result;
00103
for (
unsigned int i=0; i < VOffsetDimension; i++)
00104 { result[i] = m_Offset[i] - vec.m_Offset[i]; }
00105
return result;
00106 }
00107
00109
const Self &
00110
operator+=(
const Self &vec)
00111 {
00112
for (
unsigned int i=0; i < VOffsetDimension; i++)
00113 { m_Offset[i] += vec.m_Offset[i]; }
00114
return *
this;
00115 }
00116
00118
const Self &
00119
operator-=(
const Self &vec)
00120 {
00121
for (
unsigned int i=0; i < VOffsetDimension; i++)
00122 { m_Offset[i] -= vec.m_Offset[i]; }
00123
return *
this;
00124 }
00125
00127
bool
00128
operator==(
const Self &vec)
const
00129
{
00130
bool same=1;
00131
for (
unsigned int i=0; i < VOffsetDimension && same; i++)
00132 { same = (m_Offset[i] == vec.
m_Offset[i]); }
00133
return same;
00134 }
00135
00137
bool
00138
operator!=(
const Self &vec)
const
00139
{
00140
bool same=1;
00141
for (
unsigned int i=0; i < VOffsetDimension && same; i++)
00142 { same = (m_Offset[i] == vec.
m_Offset[i]); }
00143
return !same;
00144 }
00145
00148 OffsetValueType &
operator[](
unsigned int dim)
00149 {
return m_Offset[dim]; }
00150
00154 OffsetValueType
operator[](
unsigned int dim)
const
00155
{
return m_Offset[dim]; }
00156
00159
const OffsetValueType *
GetOffset()
const {
return m_Offset; };
00160
00165
void SetOffset(
const OffsetValueType val[VOffsetDimension])
00166 { memcpy(m_Offset, val,
sizeof(OffsetValueType)*VOffsetDimension); }
00167
00171
static Self GetBasisOffset(
unsigned int dim);
00172
00175
void Fill(OffsetValueType value)
00176 {
for(
unsigned int i=0;i < VOffsetDimension; ++i)
m_Offset[i] = value; }
00177
00183
OffsetValueType m_Offset[VOffsetDimension];
00184
00185 };
00186
00187
00188
template<
unsigned int VOffsetDimension>
00189
Offset<VOffsetDimension>
00190
Offset<VOffsetDimension>
00191
::GetBasisOffset(
unsigned int dim)
00192 {
00193
Self ind;
00194
00195 memset(ind.
m_Offset, 0,
sizeof(
OffsetValueType)*VOffsetDimension);
00196 ind.
m_Offset[dim] = 1;
00197
return ind;
00198 }
00199
00200 template<
unsigned int VOffsetDimension>
00201 std::ostream & operator<<(std::ostream &os, const Offset<VOffsetDimension> &ind)
00202 {
00203 os <<
"[";
00204
for (
unsigned int i=0; i < VOffsetDimension - 1; ++i)
00205 {
00206 os << ind[i] <<
", ";
00207 }
00208
if (VOffsetDimension >= 1)
00209 {
00210 os << ind[VOffsetDimension-1];
00211 }
00212 os <<
"]";
00213
return os;
00214 }
00215
00216 }
00217
00218
#endif