Array3(int x, int y, int z) : a(x), b(y), c(z) {
assert (x > 0 && y > 0 && z > 0);
data = new value_type [x*y*z];
}
Array3(const Array3 &x) {
bInternal = x.bInternal;
if (bInternal) {
data = x.data;
} else {
a = x.a, b = x.b, c = x.c;
data = new value_type (a * b * c);
for (int i=0;i<a*b*c;++i)
data [i] = x.data [i];
}
}
Array3 &operator = (const Array3 &x) {
~Array3 ();
bInternal = x.bInternal;
if (bInternal) {
data = x.data;
} else {
a = x.a, b = x.b, c = x.c;
data = new value_type (a * b * c);
for (int i=0;i<a*b*c;++i)
data [i] = x.data [i];
}
return *this;
}
~Array3() {
if(!bInternal)
delete [] data;
}
a2type operator [] (int i) {
assert(i>= 0 && i < a);
return a2type(data + i * b * c, b, c);
}
const_a2type operator [] (int i) const {
assert(i>= 0 && i < a);
return a2type(data + i * b * c, b, c);
}
protected:
// used in template class Array4
Array3(value_type* ptr, int x, int y, int z) : data(ptr), a(x),
b(y), c(z) {
};