/* 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 ConcreteArray1dH #define ConcreteArray1dH class Boolean; class ostream; #include "Array/ConcreteArrayIterator.h" #include "Array/ArrayIterator1d.h" #include "Array/SubscriptArray.h" template class ConcreteArray1dRef; template class ConcreteArray1d; template class ConcreteArray1dConstRef : private Subscriptor { public: Subscriptor::dim; Subscriptor::shape; Subscriptor::numElts; Subscriptor::offset; typedef T EltT; typedef Subscriptor SubscriptorT; typedef const T& ConstProjectionT; typedef ArrayBrowser1d< ConcreteArray1dConstRef > BrowserType; const T& operator()(Subscript s) const { return firstDatum()[offset(s)]; } ConstProjectionT operator[](Subscript s) const { return firstDatum()[offset(s)]; } const T* firstDatum() const { return datap; } Subscriptor subscriptor() const { return *this; } protected: ConcreteArray1dConstRef(Subscriptor s, const T* p) : Subscriptor(s), datap(p) {} friend ConcreteArray1dRef; friend ConcreteArray1d; private: void operator=(const ConcreteArray1dConstRef&); // Prohibit private: const T* const datap; }; template class ConcreteArray1dRef : private Subscriptor { public: Subscriptor::dim; Subscriptor::shape; Subscriptor::numElts; Subscriptor::offset; typedef T EltT; typedef Subscriptor SubscriptorT; typedef T& ProjectionT; typedef const T& ConstProjectionT; typedef ArrayBrowser1d< ConcreteArray1dRef > BrowserType; typedef ArrayIterator1d< ConcreteArray1dRef > IteratorType; T& operator()(Subscript s) const { return firstDatum()[offset(s)]; } ProjectionT operator[](Subscript s) const { return firstDatum()[offset(s)]; } T* firstDatum() const { return datap; } Subscriptor subscriptor() const { return *this; } operator ConcreteArray1dConstRef() const; ConcreteArray1dRef& operator=(ConcreteArray1dConstRef rhs); ConcreteArray1dRef& operator=(const T& rhs); protected: ConcreteArray1dRef(Subscriptor s, T* p) : Subscriptor(s), datap(p) {} friend ConcreteArray1d; private: T* const datap; }; template ConcreteArray1dRef::operator ConcreteArray1dConstRef() const { return ConcreteArray1dConstRef(*this, datap); } template class ConcreteArray1d : private Subscriptor { public: Subscriptor::dim; Subscriptor::shape; Subscriptor::numElts; Subscriptor::offset; typedef T EltT; typedef Subscriptor SubscriptorT; typedef T& ProjectionT; typedef const T& ConstProjectionT; typedef ConcreteArrayBrowser< ConcreteArray1d > BrowserType; typedef ConcreteArrayIterator< ConcreteArray1d > IteratorType; T& operator()(Subscript s) { return firstDatum()[offset(s)]; } const T& operator()(Subscript s) const { return firstDatum()[offset(s)]; } ProjectionT operator[](Subscript s) { return firstDatum()[offset(s)]; } ConstProjectionT operator[](Subscript s) const { return firstDatum()[offset(s)]; } const T * firstDatum() const { return datap; } T* firstDatum() { return datap; } Subscriptor subscriptor() const { return *this; } ConcreteArray1d& operator=(ConcreteArray1dConstRef rhs) { ConcreteArray1dRef(*this) = rhs; return *this; } ConcreteArray1d& operator=(ConcreteArray1d rhs) { ConcreteArray1dRef(*this) = rhs; return *this; } ConcreteArray1d& operator=(const T& rhs) { ConcreteArray1dRef(*this) = rhs; return *this; } operator ConcreteArray1dConstRef() const { return ConcreteArray1dConstRef(*this, datap); } operator ConcreteArray1dRef() { return ConcreteArray1dRef(*this, datap); } protected: ConcreteArray1d(Subscriptor s, T* p) : Subscriptor(s), datap(p) {} void setSizeOnHeap(Subscript n); void reshapeOnHeap(const SubscriptArray<1>&s); protected: T* datap; }; template ostream& operator<<(ostream& os, const ConcreteArray1dConstRef& a); template istream& operator>>(istream& is, ConcreteArray1dRef a); template inline ostream& operator<<(ostream& os, const ConcreteArray1d& a) { return os << ConcreteArray1dConstRef(a); } template inline istream& operator>>(istream& is, ConcreteArray1d& a) { return is >> ConcreteArray1dRef(a); } template void concreteCopy(ConcreteArray1dRef lhs, ConcreteArray1dConstRef rhs); /* template void concreteCopy(ConcreteArray1dRef lhs, const AnArray& rhs); */ template inline void concreteCopy(ConcreteArray1d& lhs, const ConcreteArray1d& rhs) { concreteCopy(ConcreteArray1dRef(lhs), ConcreteArray1dConstRef(rhs)); } template inline void concreteCopy(ConcreteArray1d& lhs, ConcreteArray1dConstRef rhs) { concreteCopy(ConcreteArray1dRef(lhs), rhs); } #ifdef XLC_QNOTEMPINC #include "Array/ConcreteArray1d.c" #endif #endif