home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / liboctave / MArray.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  7KB  |  218 lines

  1. // Template array classes with like-type math ops          -*- C++ -*-
  2. /*
  3.  
  4. Copyright (C) 1993, 1994, 1995 John W. Eaton
  5.  
  6. This file is part of Octave.
  7.  
  8. Octave is free software; you can redistribute it and/or modify it
  9. under the terms of the GNU General Public License as published by the
  10. Free Software Foundation; either version 2, or (at your option) any
  11. later version.
  12.  
  13. Octave is distributed in the hope that it will be useful, but WITHOUT
  14. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16. for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with Octave; see the file COPYING.  If not, write to the Free
  20. Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. */
  23.  
  24. #if !defined (octave_MArray_h)
  25. #define octave_MArray_h 1
  26.  
  27. extern "C++" {
  28.  
  29. #include "Array.h"
  30.  
  31. // Classes we declare.
  32.  
  33. template <class T> class MArray;
  34. template <class T> class MArray2;
  35. template <class T> class MDiagArray;
  36.  
  37. /*
  38.  * One dimensional array with math ops.
  39.  */
  40.  
  41. template <class T>
  42. class MArray : public Array<T>
  43. {
  44. protected:
  45.  
  46.   MArray (T *d, int l) : Array<T> (d, l) { }
  47.  
  48. public:
  49.   
  50.   MArray (void) : Array<T> () { }
  51.   MArray (int n) : Array<T> (n) { }
  52.   MArray (int n, const T& val) : Array<T> (n, val) { }
  53.   MArray (const Array<T>& a) : Array<T> (a) { }
  54.   MArray (const MArray<T>& a) : Array<T> (a) { }
  55.  
  56.   MArray<T>& operator = (const MArray<T>& a)
  57.     { return Array<T>::operator = (a); }
  58.  
  59. // Element by element MArray by scalar ops.
  60.  
  61.   MArray<T>& operator += (const T& s) { /* XXX FIXME XXX */ }
  62.   MArray<T>& operator -= (const T& s) { /* XXX FIXME XXX */ }
  63.  
  64. // Element by element MArray by MArray ops.
  65.  
  66.   MArray<T>& operator += (const MArray<T>& a) { /* XXX FIXME XXX */ }
  67.   MArray<T>& operator -= (const MArray<T>& a) { /* XXX FIXME XXX */ }
  68.  
  69. // Element by element MArray by scalar ops.
  70.  
  71.   friend MArray<T> operator + (const MArray<T>& a, const T& s);
  72.   friend MArray<T> operator - (const MArray<T>& a, const T& s);
  73.   friend MArray<T> operator * (const MArray<T>& a, const T& s);
  74.   friend MArray<T> operator / (const MArray<T>& a, const T& s);
  75.  
  76. // Element by element scalar by MArray ops.
  77.  
  78.   friend MArray<T> operator + (const T& s, const MArray<T>& a);
  79.   friend MArray<T> operator - (const T& s, const MArray<T>& a);
  80.   friend MArray<T> operator * (const T& s, const MArray<T>& a);
  81.   friend MArray<T> operator / (const T& s, const MArray<T>& a);
  82.  
  83. // Element by element MArray by MArray ops.
  84.  
  85.   friend MArray<T> operator + (const MArray<T>& a, const MArray<T>& b);
  86.  
  87.   friend MArray<T> operator - (const MArray<T>& a, const MArray<T>& b);
  88.  
  89.   friend MArray<T> product (const MArray<T>& a, const MArray<T>& b);
  90.   friend MArray<T> quotient (const MArray<T>& a, const MArray<T>& b);
  91.  
  92.   friend MArray<T> operator - (const MArray<T>& a);
  93. };
  94.  
  95. /*
  96.  * Two dimensional array with math ops.
  97.  */
  98.  
  99. template <class T>
  100. class MArray2 : public Array2<T>
  101. {
  102. protected:
  103.  
  104.   MArray2 (T *d, int n, int m) : Array2<T> (d, n, m) { }
  105.  
  106. public:
  107.  
  108.   MArray2 (void) : Array2<T> () { }
  109.   MArray2 (int n, int m) : Array2<T> (n, m) { }
  110.   MArray2 (int n, int m, const T& val) : Array2<T> (n, m, val) { }
  111.   MArray2 (const Array2<T>& a) : Array2<T> (a) { }
  112.   MArray2 (const MArray2<T>& a) : Array2<T> (a) { }
  113.   MArray2 (const MDiagArray<T>& a);
  114.  
  115.   MArray2<T>& operator = (const MArray2<T>& a)
  116.     { return Array2<T>::operator = (a); }
  117.  
  118. // Element by element MArray2 by scalar ops.
  119.  
  120.   MArray2<T>& operator += (const T& s) { /* XXX FIXME XXX */ }
  121.   MArray2<T>& operator -= (const T& s) { /* XXX FIXME XXX */ }
  122.  
  123. // Element by element MArray2 by MArray2 ops.
  124.  
  125.   MArray2<T>& operator += (const MArray2<T>& a) { /* XXX FIXME XXX */ }
  126.   MArray2<T>& operator -= (const MArray2<T>& a) { /* XXX FIXME XXX */ }
  127.  
  128. // Element by element MArray2 by scalar ops.
  129.  
  130.   friend MArray2<T> operator + (const MArray2<T>& a, const T& s);
  131.   friend MArray2<T> operator - (const MArray2<T>& a, const T& s);
  132.   friend MArray2<T> operator * (const MArray2<T>& a, const T& s);
  133.   friend MArray2<T> operator / (const MArray2<T>& a, const T& s);
  134.  
  135. // Element by element scalar by MArray2 ops.
  136.  
  137.   friend MArray2<T> operator + (const T& s, const MArray2<T>& a);
  138.   friend MArray2<T> operator - (const T& s, const MArray2<T>& a);
  139.   friend MArray2<T> operator * (const T& s, const MArray2<T>& a);
  140.   friend MArray2<T> operator / (const T& s, const MArray2<T>& a);
  141.  
  142. // Element by element MArray2 by MArray2 ops.
  143.  
  144.   friend MArray2<T> operator + (const MArray2<T>& a, const MArray2<T>& b);
  145.   friend MArray2<T> operator - (const MArray2<T>& a, const MArray2<T>& b);
  146.  
  147.   friend MArray2<T> product (const MArray2<T>& a, const MArray2<T>& b);
  148.   friend MArray2<T> quotient (const MArray2<T>& a, const MArray2<T>& b);
  149.  
  150.   friend MArray2<T> operator - (const MArray2<T>& a);
  151. };
  152.  
  153. /*
  154.  * Two dimensional diagonal array with math ops.
  155.  */
  156.  
  157. template <class T>
  158. class MDiagArray : public DiagArray<T>
  159. {
  160. protected:
  161.  
  162.   MDiagArray (T *d, int r, int c) : DiagArray<T> (d, r, c) { }
  163.  
  164. public:
  165.   
  166.   MDiagArray (void) : DiagArray<T> () { }
  167.   MDiagArray (int n) : DiagArray<T> (n) { }
  168.   MDiagArray (int n, const T& val) : DiagArray<T> (n, val) { }
  169.   MDiagArray (int r, int c) : DiagArray<T> (r, c) { }
  170.   MDiagArray (int r, int c, const T& val) : DiagArray<T> (r, c, val) { }
  171.   MDiagArray (const DiagArray<T>& a) : DiagArray<T> (a) { }
  172.   MDiagArray (const MDiagArray<T>& a) : DiagArray<T> (a) { }
  173.   MDiagArray (const MArray<T>& a) : DiagArray<T> (a) { }
  174.  
  175.   MDiagArray<T>& operator = (const MDiagArray<T>& a)
  176.     { return DiagArray<T>::operator = (a); }
  177.  
  178.   MDiagArray<T>& operator += (const MDiagArray<T>& a) { /* XXX FIXME XXX */ }
  179.   MDiagArray<T>& operator -= (const MDiagArray<T>& a) { /* XXX FIXME XXX */ }
  180.  
  181. // Element by element MDiagArray by scalar ops.
  182.  
  183.   friend MDiagArray<T> operator * (const MDiagArray<T>& a, const T& s);
  184.   friend MDiagArray<T> operator / (const MDiagArray<T>& a, const T& s);
  185.  
  186. // Element by element scalar by MDiagArray ops.
  187.  
  188.   friend MDiagArray<T> operator * (const T& s, const MDiagArray<T>& a);
  189.  
  190. // Element by element MDiagArray by MDiagArray ops.
  191.  
  192.   friend MDiagArray<T> operator + (const MDiagArray<T>& a,
  193.                    const MDiagArray<T>& b); 
  194.  
  195.   friend MDiagArray<T> operator - (const MDiagArray<T>& a,
  196.                    const MDiagArray<T>& b);
  197.  
  198.   friend MDiagArray<T> product (const MDiagArray<T>& a,
  199.                 const MDiagArray<T>& b);
  200.  
  201.   friend MDiagArray<T> operator - (const MDiagArray<T>& a);
  202. };
  203.  
  204. #ifdef __GNUG__
  205. #include "MArray.cc"
  206. #endif
  207.  
  208. } // extern "C++"
  209.  
  210. #endif
  211.  
  212. /*
  213. ;;; Local Variables: ***
  214. ;;; mode: C++ ***
  215. ;;; page-delimiter: "^/\\*" ***
  216. ;;; End: ***
  217. */
  218.