/* Example programs from the book Scientific and Engineering Programming in C++: An Introduction with Advanced Techniques and Examples, Addison-Wesley, 1994. (c) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 1994. ALL RIGHTS RESERVED. See README file for further details. */ #ifndef ConcreteArray3dH #define ConcreteArray3dH #include "Array/ConcreteArrayIterator.h" #include "Array/ArrayIterator3d.h" #include "Array/ConcreteArrayProjection2d.h" template class ConcreteArray3dRef; template class ConcreteArray3d; template class ConcreteArray3dConstRef : private Subscriptor { public: Subscriptor::dim; Subscriptor::shape; Subscriptor::numElts; Subscriptor::offset; typedef T EltT; typedef Subscriptor SubscriptorT; typedef ConstConcreteArrayProjection2d ConstProjectionT; typedef ArrayBrowser3d< ConcreteArray3dConstRef > BrowserType; const T& operator()(Subscript s0, Subscript s1, Subscript s2) const { return firstDatum()[offset(SubscriptArray<3>(s0, s1, s2))]; } ConstProjectionT project(Subscript, Dimension) const; ConstProjectionT operator[](Subscript s) const { return project(s, 0); } ConstProjectionT row(Subscript s) const { return project(s, 0); } ConstProjectionT column(Subscript s) const { return project(s, 1); } ConstProjectionT plane(Subscript s) const { return project(s, 2); } const T* firstDatum() const { return datap; } Subscriptor subscriptor() const { return *this; } protected: ConcreteArray3dConstRef(Subscriptor s, const T* p) : Subscriptor(s), datap(p) {} friend ConcreteArray3dRef; friend ConcreteArray3d; private: void operator=(const ConcreteArray3dConstRef&); // Prohibit private: const T* const datap; }; template class ConcreteArray3dRef : private Subscriptor { public: Subscriptor::dim; Subscriptor::shape; Subscriptor::numElts; Subscriptor::offset; typedef T EltT; typedef Subscriptor SubscriptorT; typedef ConstConcreteArrayProjection2d ConstProjectionT; typedef ConcreteArrayProjection2d ProjectionT; typedef ArrayBrowser3d< ConcreteArray3dRef > BrowserType; typedef ArrayIterator3d< ConcreteArray3dRef > IteratorType; T& operator()(Subscript s0, Subscript s1, Subscript s2) const { return firstDatum()[offset(SubscriptArray<3>(s0, s1, s2))]; } ProjectionT project(Subscript, Dimension) const; ProjectionT operator[](Subscript s) const { return project(s, 0); } ProjectionT row(Subscript s) const { return project(s, 0); } ProjectionT column(Subscript s) const { return project(s, 1); } ProjectionT plane(Subscript s) const { return project(s, 2); } T* firstDatum() const { return datap; } Subscriptor subscriptor() const { return *this; } operator ConcreteArray3dConstRef() const { return ConcreteArray3dConstRef(*this, datap); } ConcreteArray3dRef& operator=(const ConcreteArray3dConstRef& rhs); ConcreteArray3dRef& operator=(const T& rhs); protected: ConcreteArray3dRef(Subscriptor s, T* p) : Subscriptor(s), datap(p) {} friend ConcreteArray3d; private: T* const datap; }; template class ConcreteArray3d : private Subscriptor { public: Subscriptor::dim; Subscriptor::shape; Subscriptor::numElts; Subscriptor::offset; typedef T EltT; typedef Subscriptor SubscriptorT; typedef ConcreteArrayProjection2d< Subscriptor, T > ProjectionT; typedef ConstConcreteArrayProjection2d< Subscriptor, T > ConstProjectionT; typedef ConcreteArrayBrowser< ConcreteArray3d > BrowserType; typedef ConcreteArrayIterator< ConcreteArray3d > IteratorType; const T& operator()(Subscript s0, Subscript s1, Subscript s2) const { return firstDatum()[offset(SubscriptArray<3>(s0, s1, s2))]; } T& operator()(Subscript s0, Subscript s1, Subscript s2) { return firstDatum()[offset(SubscriptArray<3>(s0, s1, s2))]; } ConstProjectionT project(Subscript s, Dimension d) const { return ConcreteArray3dConstRef(*this).project(s, d); } ProjectionT project(Subscript s, Dimension d) { return ConcreteArray3dRef(*this).project(s, d); } ConstProjectionT operator[](Subscript s) const { return project(s, 0); } ProjectionT operator[](Subscript s) { return project(s, 0); } ConstProjectionT row(Subscript i) const { return project(i, 0); } ProjectionT row(Subscript i) { return project(i, 0); } ConstProjectionT column(Subscript i) const { return project(i, 1); } ProjectionT column(Subscript i) { return project(i, 1); } ConstProjectionT plane(Subscript i) const { return project(i, 2); } ProjectionT plane(Subscript i) { return project(i, 2); } T const * firstDatum() const { return datap; } T * firstDatum() { return datap; } Subscriptor subscriptor() const { return *this; } ConcreteArray3d& operator=(const ConcreteArray3dConstRef& rhs) { ConcreteArray3dRef(*this) = rhs; return *this; } ConcreteArray3d& operator=(const ConcreteArray3d& rhs) { ConcreteArray3dRef(*this) = rhs; return *this; } ConcreteArray3d& operator=(const T& rhs) { ConcreteArray3dRef(*this) = rhs; return *this; } operator ConcreteArray3dConstRef() const { return ConcreteArray3dConstRef(*this, datap); } operator ConcreteArray3dRef() { return ConcreteArray3dRef(*this, datap); } protected: ConcreteArray3d(const Subscriptor& s, T* p) : Subscriptor(s), datap(p) {} void setSizeOnHeap(Subscript n); void reshapeOnHeap(const SubscriptArray<3>& s); protected: T* datap; }; template ostream& operator<<(ostream& os, const ConcreteArray3dConstRef& a); template istream& operator>>(istream& is, const ConcreteArray3dRef& a); template inline ostream& operator<<(ostream& os, const ConcreteArray3d& a) { return os << ConcreteArray3dConstRef(a); } template inline istream& operator>>(istream& is, ConcreteArray3d& a) { return is >> ConcreteArray3dRef(a); } template void concreteCopy(const ConcreteArray3dRef& lhs, const ConcreteArray3dConstRef& rhs); template inline void concreteCopy(ConcreteArray3d& lhs, const ConcreteArray3d& rhs) { concreteCopy(ConcreteArray3dRef(lhs), ConcreteArray3dConstRef(rhs)); } template inline void concreteCopy(ConcreteArray3d& lhs, const ConcreteArray3dConstRef& rhs) { concreteCopy(ConcreteArray3dRef(lhs), rhs); } #ifdef XLC_QNOTEMPINC #include "Array/ConcreteArray3d.c" #endif #endif