5 #include <KrisLibrary/errors.h> 6 #include <KrisLibrary/utils/IntPair.h> 7 #include <KrisLibrary/utils/indexing.h> 35 Array2D(
int m,
int n,
const T& initVal);
40 inline T& operator()(
int i,
int j) { Assert(i>=0&&i<m); Assert(j>=0&&j<n);
return items[i*n+j]; }
41 inline const T& operator()(
int i,
int j)
const { Assert(i>=0&&i<m); Assert(j>=0&&j<n);
return items[i*n+j]; }
42 inline T& operator()(
const IntPair& t) {
return operator()(t.a,t.b); }
43 inline const T& operator()(
const IntPair& t)
const {
return operator()(t.a,t.b); }
48 bool Write(
File& f)
const;
50 inline int numRows()
const {
return m; }
51 inline int numCols()
const {
return n; }
53 inline bool empty()
const {
return m==0&&n==0; }
54 void initialize(
int m,
int n);
55 void initialize(
int m,
int n,
const T& initVal);
56 void resize(
int m,
int n);
57 void resize(
int m,
int n,
const T& initVal);
58 void reserve(
int numItems);
61 bool find(
const T& item,
int& i,
int& j)
const;
62 bool find(
const T& item,
IntPair& t)
const {
return find(item,t.a,t.b); }
63 inline bool contains(
const T& item)
const {
int i,j;
return find(item,i,j); }
64 void set(
const T& item);
67 inline T* getData()
const {
return items; }
68 inline T* getRowData(
int i)
const {
return &items[i*n]; }
78 inline iterator& operator ++() { ++it;
return *
this; }
79 inline iterator& operator --() { --it;
return *
this; }
80 inline iterator& operator +=(
int skip) { it+=skip;
return *
this; }
81 inline iterator& operator -=(
int skip) { it-=skip;
return *
this; }
82 inline void incFirst(
int skip=1) { it.incFirst(skip); }
83 inline void incSecond(
int skip=1) { it.incSecond(skip); }
84 inline T& operator*() {
return array->getData()[*it]; }
86 inline bool operator == (
const iterator& rhs)
const {
return it == rhs.it && array==rhs.array; }
87 inline bool operator != (
const iterator& rhs)
const {
return !operator==(rhs); }
88 inline bool operator < (
const iterator& rhs)
const {
return it<rhs.it; }
92 int ibase=range.base/range.istride;
93 int jbase=range.base/range.jstride;
94 int istride=range.istride/(range.jsize*range.jstride);
95 int jstride=range.jstride;
96 return IntPair(i.a*istride+ibase,i.b*jstride+jbase);
119 :m(0),n(0),items(0),capacity(0)
124 :m(0),n(0),items(0),capacity(0)
131 :m(0),n(0),items(0),capacity(0)
133 initialize(_m,_n,initVal);
138 :m(0),n(0),items(0),capacity(0)
145 :m(rhs.m),n(rhs.n),items(rhs.items),capacity(rhs.capacity)
170 capacity = rhs.capacity;
182 if(!ReadArrayFile(f,items,m*n))
return false;
191 if(!WriteArrayFile(f,items,m*n))
return false;
202 items=
new T[capacity];
212 items=
new T[capacity];
240 FatalError(
"TODO: copy elements in Array2D resize/reserve");
241 if(items)
delete [] items;
243 items =
new T[capacity];
263 if(
operator()(p,q)==item) {
273 for(
int i=0;i<m*n;i++) items[i]=item;
280 for(
int i=0;i<m*n;i++) items[i]=rhs.items[i];
288 int tempcap=capacity;
292 b.m=tempm; b.n=tempn;
299 std::ostream& operator << (std::ostream& out,const Array2D<T>& a)
301 out<<a.m<<
" "<<a.n<<std::endl;
302 for(
int i=0;i<a.m;i++) {
303 for(
int j=0;j<a.n;j++) {
305 if(j+1 < a.n) out<<
" ";
307 if(i+1 < a.m) out<<std::endl;
313 std::istream& operator >> (std::istream& in,
Array2D<T>& a)
317 if(in.bad())
return in;
318 Assert(m>=0 && n>=0);
320 for(
int i=0;i<m;i++) {
321 for(
int j=0;j<n;j++) {
330 :array(_array),range(_array->m,_array->n,_array->p),it(&range)
335 :array(_array),range(_array->m,_array->n,_array->p),it(range.end())
340 :array(_array),range(_range),it(&range)
345 :array(_array),range(_range),it(range.end())
350 :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:73
A lightweight integer 2-tuple class.
Definition: IntPair.h:9
Definition: rayprimitives.h:132
A unified interface for reading/writing binary data to file.
bool ReadFile(File &f, std::vector< type > &v)
ReadFile() for STL vectors. See File.h.
Definition: ioutils.h:61
Definition: utils/indexing.h:258
A two-dimensional m x n array.
Definition: array2d.h:30
A 2D lattice of regular ranges.
Definition: utils/indexing.h:116
A 2D lattice indexing into a linear sequence, in a striping pattern.
Definition: utils/indexing.h:241
A cross-platform class for reading/writing binary data.
Definition: File.h:47