6 #include <KrisLibrary/utils/IntTriple.h> 7 #include <KrisLibrary/utils/indexing.h> 8 #include <KrisLibrary/errors.h> 36 Array3D(
int m,
int n,
int p,
const T& initVal);
41 inline T& operator()(
int i,
int j,
int k) { Assert(i>=0&&i<m);
return items[(i*n+j)*p+k]; }
42 inline const T& operator()(
int i,
int j,
int k)
const {
return items[(i*n+j)*p+k]; }
43 inline T& operator()(
const IntTriple& t) {
return operator()(t.a,t.b,t.c); }
44 inline const T& operator()(
const IntTriple& t)
const {
return operator()(t.a,t.b,t.c); }
49 bool Write(
File& f)
const;
51 inline int dim1()
const {
return m; }
52 inline int dim2()
const {
return n; }
53 inline int dim3()
const {
return p; }
55 inline bool empty()
const {
return m==0&&n==0&&p==0; }
56 void initialize(
int m,
int n,
int p);
57 void initialize(
int m,
int n,
int p,
const T& initVal);
58 void resize(
int m,
int n,
int p);
59 void resize(
int m,
int n,
int p,
const T& initVal);
60 void reserve(
int cap);
63 bool find(
const T& item,
int& i,
int& j,
int& k)
const;
64 bool find(
const T& item,
IntTriple& t)
const {
return find(item,t.a,t.b,t.c); }
65 inline bool contains(
const T& item)
const {
int i,j,k;
return find(item,i,j,k); }
66 void set(
const T& item);
69 inline T* getData()
const {
return items; }
79 inline iterator& operator ++() { ++it;
return *
this; }
80 inline iterator& operator --() { --it;
return *
this; }
81 inline iterator& operator +=(
int skip) { it+=skip;
return *
this; }
82 inline iterator& operator -=(
int skip) { it-=skip;
return *
this; }
83 inline void incFirst(
int skip=1) { it.incFirst(skip); }
84 inline void incSecond(
int skip=1) { it.incSecond(skip); }
85 inline void incThird(
int skip=1) { it.incThird(skip); }
86 inline T& operator*() {
return array->getData()[*it]; }
88 inline bool operator == (
const iterator& rhs)
const {
return it == rhs.it && array==rhs.array; }
89 inline bool operator != (
const iterator& rhs)
const {
return !operator==(rhs); }
90 inline bool operator < (
const iterator& rhs)
const {
return it<rhs.it; }
98 int kstride = range.kstride;
99 int jstride = range.jstride/array->p;
100 int istride = range.istride/(array->p*array->n);
101 div_t d=div(range.base,array->p);
103 d=div(d.quot,array->n);
106 return IntTriple(i.a*istride+ibase,i.b*jstride+jbase,i.c*kstride+kbase);
127 std::istream& operator >> (std::istream& in,
Array3D<T>& a)
132 Assert(m >= 0 && n >= 0 && p >= 0);
142 std::ostream& operator << (std::ostream& out,const Array3D<T>& a)
144 out<<a.m<<
" "<<a.n<<
" "<<
" "<<a.p<<std::endl;
145 for(
int i=0;i<a.m;i++) {
146 for(
int j=0;j<a.n;j++) {
147 for(
int k=0;k<a.p;k++)
157 :m(0),n(0),p(0),items(0),capacity(0)
162 :m(0),n(0),p(0),items(0),capacity(0)
164 initialize(_m,_n,_p);
169 :m(0),n(0),p(0),items(0),capacity(0)
171 initialize(_m,_n,_p,initVal);
176 :m(0),n(0),p(0),items(0),capacity(0)
188 capacity = rhs.capacity;
213 capacity = rhs.capacity;
226 if(!ReadArrayFile(f,items,m*n*p))
return false;
236 if(!WriteArrayFile(f,items,m*n*p))
return false;
248 items=
new T[capacity];
259 items=
new T[capacity];
266 if(_m*_n*_p > capacity)
267 initialize(_m,_n,_p);
276 if(_m*_n*_p > capacity)
277 initialize(_m,_n,_p);
298 if(
operator()(s,t,u)==item) {
308 for(
int i=0;i<m*n*p;i++) items[i]=item;
314 resize(rhs.m,rhs.n,rhs.p);
315 for(
int i=0;i<m*n*p;i++) items[i]=rhs.items[i];
321 int tempm=m,tempn=n,tempp=p;
322 int tempcap=capacity;
327 b.m=tempm; b.n=tempn; b.p=tempp;
334 :array(_array),range(_array->m,_array->n,_array->p),it(&range)
339 :array(_array),range(_array->m,_array->n,_array->p),it(range.end())
344 :array(_array),range(_range),it(&range)
349 :array(_array),range(_range),it(range.end())
354 :array(rhs.array),range(rhs.range),it(rhs.it)
A lightweight integer 3-tuple class.
Definition: IntTriple.h:9
bool WriteFile(File &f, const std::vector< type > &v)
WriteFile() for STL vectors. See File.h.
Definition: ioutils.h:81
A 3D lattice of regular ranges.
Definition: utils/indexing.h:175
Definition: rayprimitives.h:132
Utilities commonly used throughout a program.
A unified interface for reading/writing binary data to file.
Definition: utils/indexing.h:312
bool ReadFile(File &f, std::vector< type > &v)
ReadFile() for STL vectors. See File.h.
Definition: ioutils.h:69
A cross-platform class for reading/writing binary data.
Definition: File.h:47
A 3D lattice indexing into a linear sequence, in a striping pattern.
Definition: utils/indexing.h:295
A three-dimensional m x n x parray.
Definition: array3d.h:31
#define SafeArrayDelete(x)
Delete a non-NULL pointer to an array and set it to NULL.
Definition: utils.h:95