#include <iostream>
#include <memory>
#include <complex>
class Slice{
public:
Slice(unsigned long Nx, unsigned long Ny) :
nx(Nx),
ny(Ny),
data(std::make_shared<std::complex<double>[]>(Nx*Ny))
{}
Slice(unsigned long Nx, unsigned long Ny, std::shared_ptr<std::complex<double>[]> data) :
nx(Nx),
ny(Ny),
data(data)
{}
private:
unsigned long nx;
unsigned long ny;
std::shared_ptr<std::complex<double>[]> data;
};
class Volume{
public:
Volume(unsigned long Nx, unsigned long Ny, unsigned long Nz) :
nx(Nx),
ny(Ny),
nz(Nz),
data(std::make_shared<std::complex<double>[]>(Nx * Ny * Nz))
{
}
Slice get_slice(unsigned long zindex)
{
return Slice(nx, ny, std::shared_ptr<std::complex<double>[]>(data, &data[zindex * nx * ny]));
}
private:
// DATA:
unsigned long nx;
unsigned long ny;
unsigned long nz;
std::shared_ptr<std::complex<double>[]> data;
};
int main(){
unsigned long Nx = 1;
unsigned long Ny = 2;
unsigned long Nz = 3;
Volume testVolume(Nx,Ny,Nz);
/* initialise data in testVolume */
Slice slice = testVolume.get_slice(1);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8Y29tcGxleD4KCmNsYXNzIFNsaWNlewpwdWJsaWM6CiAgICBTbGljZSh1bnNpZ25lZCBsb25nIE54LCB1bnNpZ25lZCBsb25nIE55KSA6CiAgICAJbngoTngpLAogICAgCW55KE55KSwKICAgIAlkYXRhKHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpjb21wbGV4PGRvdWJsZT5bXT4oTngqTnkpKQogICAge30KCiAgICBTbGljZSh1bnNpZ25lZCBsb25nIE54LCB1bnNpZ25lZCBsb25nIE55LCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpjb21wbGV4PGRvdWJsZT5bXT4gZGF0YSkgOgogICAgCW54KE54KSwKICAgIAlueShOeSksCiAgICAJZGF0YShkYXRhKQogICAge30KCnByaXZhdGU6CiAgICB1bnNpZ25lZCBsb25nICAgICBueDsKICAgIHVuc2lnbmVkIGxvbmcgICAgIG55OwogICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6Y29tcGxleDxkb3VibGU+W10+IGRhdGE7Cn07CgpjbGFzcyBWb2x1bWV7CnB1YmxpYzoKICAgIFZvbHVtZSh1bnNpZ25lZCBsb25nIE54LCB1bnNpZ25lZCBsb25nIE55LCB1bnNpZ25lZCBsb25nIE56KSA6CiAgICAJbngoTngpLAogICAgCW55KE55KSwKICAgIAlueihOeiksCiAgICAgICAgZGF0YShzdGQ6Om1ha2Vfc2hhcmVkPHN0ZDo6Y29tcGxleDxkb3VibGU+W10+KE54ICogTnkgKiBOeikpCiAgICB7CiAgICB9CgogICAgU2xpY2UgZ2V0X3NsaWNlKHVuc2lnbmVkIGxvbmcgemluZGV4KQogICAgewogICAgICAgIHJldHVybiBTbGljZShueCwgbnksIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OmNvbXBsZXg8ZG91YmxlPltdPihkYXRhLCAmZGF0YVt6aW5kZXggKiBueCAqIG55XSkpOwogICAgfQpwcml2YXRlOgogICAgLy8gREFUQToKICAgIHVuc2lnbmVkIGxvbmcgICAgIG54OwogICAgdW5zaWduZWQgbG9uZyAgICAgbnk7CiAgICB1bnNpZ25lZCBsb25nICAgICBuejsKICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OmNvbXBsZXg8ZG91YmxlPltdPiBkYXRhOwp9OwoKCgppbnQgbWFpbigpewogICAgdW5zaWduZWQgbG9uZyBOeCA9IDE7CiAgICB1bnNpZ25lZCBsb25nIE55ID0gMjsKICAgIHVuc2lnbmVkIGxvbmcgTnogPSAzOwoKICAgIFZvbHVtZSB0ZXN0Vm9sdW1lKE54LE55LE56KTsKICAgIC8qIGluaXRpYWxpc2UgZGF0YSBpbiB0ZXN0Vm9sdW1lICovCiAgICBTbGljZSBzbGljZSA9IHRlc3RWb2x1bWUuZ2V0X3NsaWNlKDEpOwp9Cg==