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 / Array.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  7KB  |  369 lines

  1. // Template array classes                              -*- 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_Array_h)
  25. #define octave_Array_h 1
  26.  
  27. #include <assert.h>
  28.  
  29. #include "lo-error.h"
  30.  
  31. extern "C++" {
  32.  
  33. // Classes we declare.
  34.  
  35. template <class T> class ArrayRep;
  36. template <class T> class Array;
  37. template <class T> class Array2;
  38. template <class T> class Array3;
  39. template <class T> class DiagArray;
  40.  
  41. /*
  42.  * The real representation of all arrays.
  43.  */
  44.  
  45. template <class T>
  46. class ArrayRep
  47. {
  48. // Rethink resize()?
  49.   friend class Array<T>;
  50.   friend class Array2<T>;
  51.   friend class Array3<T>;
  52.   friend class DiagArray<T>;
  53.  
  54. protected:
  55.  
  56.   ArrayRep (T *d, int l);
  57.  
  58. public:
  59.  
  60.   ArrayRep (void);
  61.   ArrayRep (int n);
  62.   ArrayRep (const ArrayRep<T>& a);
  63.  
  64.   ~ArrayRep (void);
  65.  
  66.   int length (void) const;
  67.  
  68.   T& elem (int n);
  69.  
  70.   T elem (int n) const;
  71.  
  72.   void resize (int n);
  73.  
  74. private:
  75.  
  76.   T *data;
  77.   int len;
  78.   int count;
  79. };
  80.  
  81. /*
  82.  * One dimensional array class.  Handles the reference counting for
  83.  * all the derived classes.
  84.  */
  85.  
  86. template <class T>
  87. class Array
  88. {
  89. protected:
  90.  
  91.   ArrayRep<T> *rep;
  92.  
  93.   Array (T *d, int l);
  94.  
  95. public:
  96.  
  97.   Array (void);
  98.   Array (int n);
  99.   Array (int n, const T& val);
  100.  
  101.   Array (const Array<T>& a);
  102.  
  103.   ~Array (void);
  104.  
  105.   Array<T>& operator = (const Array<T>& a);
  106.  
  107.   int capacity (void) const;
  108.   int length (void) const;
  109.  
  110.   T& elem (int n);
  111.   T& checkelem (int n);
  112.   T& operator () (int n);
  113.  
  114. // No checking.
  115.   T& xelem (int n);
  116.  
  117.   T elem (int n) const;
  118.   T checkelem (int n) const;
  119.   T operator () (int n) const;
  120.  
  121.   void resize (int n);
  122.   void resize (int n, const T& val);
  123.  
  124.   const T *data (void) const;
  125.  
  126.   T *fortran_vec (void);
  127. };
  128.  
  129. /*
  130.  * Two dimensional array class.
  131.  */
  132.  
  133. template <class T>
  134. class Array2 : public Array<T>
  135. {
  136. protected:
  137.  
  138.   int d1;
  139.   int d2;
  140.  
  141.   Array2 (T *d, int n, int m);
  142.  
  143. public:
  144.  
  145.   Array2 (void);
  146.   Array2 (int n, int m);
  147.   Array2 (int n, int m, const T& val);
  148.   Array2 (const Array2<T>& a);
  149.   Array2 (const DiagArray<T>& a);
  150.  
  151.   Array2<T>& operator = (const Array2<T>& a);
  152.  
  153.   int dim1 (void) const;
  154.   int dim2 (void) const;
  155.  
  156.   int rows (void) const;
  157.   int cols (void) const;
  158.   int columns (void) const;
  159.  
  160.   T& elem (int i, int j);
  161.   T& checkelem (int i, int j);
  162.   T& operator () (int i, int j);
  163.  
  164. // No checking.
  165.   T& xelem (int i, int j);
  166.  
  167.   T elem (int i, int j) const;
  168.   T checkelem (int i, int j) const;
  169.   T operator () (int i, int j) const;
  170.  
  171.   void resize (int n, int m);
  172.   void resize (int n, int m, const T& val);
  173. };
  174.  
  175. /*
  176.  * Three dimensional array class.
  177.  */
  178.  
  179. template <class T>
  180. class Array3 : public Array2<T>
  181. {
  182. protected:
  183.  
  184.   int d3;
  185.  
  186.   Array3 (T *d, int n, int m, int k);
  187.  
  188. public:
  189.  
  190.   Array3 (void);
  191.   Array3 (int n, int m, int k);
  192.   Array3 (int n, int m, int k, const T& val);
  193.   Array3 (const Array3<T>& a);
  194.  
  195.   Array3<T>& operator = (const Array3<T>& a);
  196.  
  197.   int dim3 (void) const;
  198.  
  199.   T& elem (int i, int j, int k);
  200.   T& checkelem (int i, int j, int k);
  201.   T& operator () (int i, int j, int k);
  202.  
  203. // No checking.
  204.   T& xelem (int i, int j, int k);
  205.  
  206.   T elem (int i, int j, int k) const;
  207.   T checkelem (int i, int j, int k) const;
  208.   T operator () (int i, int j, int k) const;
  209.  
  210.   void resize (int n, int m, int k);
  211.   void resize (int n, int m, int k, const T& val);
  212. };
  213.  
  214. /*
  215.  * A two-dimensional array with diagonal elements only.
  216.  *
  217.  * Idea and example code for Proxy class and functions from:
  218.  *
  219.  * From: kanze@us-es.sel.de (James Kanze)
  220.  * Subject: Re: How to overload [] to do READ/WRITE differently ?
  221.  * Message-ID: <KANZE.93Nov29151407@slsvhdt.us-es.sel.de>
  222.  * Sender: news@us-es.sel.de
  223.  * Date: 29 Nov 1993 14:14:07 GMT
  224.  * --
  225.  * James Kanze                             email: kanze@us-es.sel.de
  226.  * GABI Software, Sarl., 8 rue du Faisan, F-67000 Strasbourg, France
  227.  */
  228.  
  229. template <class T>
  230. class DiagArray : public Array<T>
  231. {
  232. private:
  233.   inline T get (int i) { return Array<T>::elem (i); }
  234.   inline void set (const T& val, int i) { Array<T>::elem (i) = val; }
  235.  
  236. #if 0
  237. #if ! (defined (_AIX) && defined (__GNUG__) && __GNUC__ > 1 && __GNUC_MINOR__ < 6)
  238.   class Proxy
  239.   {
  240.   public:
  241.  
  242.     inline Proxy (DiagArray<T> *ref, int r, int c)
  243.       : i (r), j (c), object (ref) { } 
  244.  
  245.     inline const Proxy& operator = (const T& val) const
  246.     {
  247.       if (i == j)
  248.     {
  249.       if (object)
  250.         object->set (val, i);
  251.     }
  252.       else
  253.     (*current_liboctave_error_handler)
  254.       ("assignment to off-diagonal element attempted for diagonal array");
  255.  
  256.       return *this;
  257.     }
  258.  
  259.     inline operator T () const
  260.     {
  261.       if (object && i == j)
  262.     return object->get (i);
  263.       else
  264.     {
  265.       static T foo (0);
  266.       return foo;
  267.     }
  268.     }
  269.  
  270.   private:
  271.  
  272. // XXX FIXME XXX -- this is declared private to keep the user from
  273. // taking the address of a Proxy.  Maybe it should be implemented by
  274. // means of a companion function in the DiagArray class.
  275.  
  276.     inline T *operator& () const { assert (0); return (T *) 0; }
  277.  
  278.     int i;
  279.     int j;
  280.  
  281.     DiagArray<T> *object;
  282.  
  283.   };
  284.  
  285. friend class Proxy;
  286. #endif
  287. #endif
  288.  
  289. protected:
  290.  
  291.   int nr;
  292.   int nc;
  293.  
  294.   DiagArray (T *d, int r, int c);
  295.  
  296. public:
  297.  
  298.   DiagArray (void);
  299.   DiagArray (int n);
  300.   DiagArray (int n, const T& val);
  301.   DiagArray (int r, int c);
  302.   DiagArray (int r, int c, const T& val);
  303.   DiagArray (const Array<T>& a);
  304.   DiagArray (const DiagArray<T>& a);
  305.  
  306.   DiagArray<T>& operator = (const DiagArray<T>& a);
  307.  
  308.   int dim1 (void) const;
  309.   int dim2 (void) const;
  310.  
  311.   int rows (void) const;
  312.   int cols (void) const;
  313.   int columns (void) const;
  314.  
  315. #if 0
  316.   inline Proxy elem (int r, int c)
  317.   {
  318.     return Proxy (this, r, c);
  319.   }
  320.  
  321.   inline Proxy checkelem (int r, int c)
  322.   {
  323.     if (r < 0 || c < 0 || r >= nr || c >= nc)
  324.       {
  325.     (*current_liboctave_error_handler) ("range error");
  326.     return Proxy (0, r, c);
  327.       }
  328.     else
  329.       return Proxy (this, r, c);
  330.   }
  331.  
  332.   inline Proxy operator () (int r, int c)
  333.   {
  334.     if (r < 0 || c < 0 || r >= nr || c >= nc)
  335.       {
  336.     (*current_liboctave_error_handler) ("range error");
  337.     return Proxy (0, r, c);
  338.       }
  339.     else
  340.       return Proxy (this, r, c);
  341.   }
  342. #else
  343.   T& elem (int r, int c);
  344.   T& checkelem (int r, int c);
  345.   T& operator () (int r, int c);
  346. #endif
  347.  
  348. // No checking.
  349.   T& xelem (int r, int c);
  350.  
  351.   T elem (int r, int c) const;
  352.   T checkelem (int r, int c) const;
  353.   T operator () (int r, int c) const;
  354.  
  355.   void resize (int n, int m);
  356.   void resize (int n, int m, const T& val);
  357. };
  358.  
  359. } // extern "C++"
  360.  
  361. #endif
  362.  
  363. /*
  364. ;;; Local Variables: ***
  365. ;;; mode: C++ ***
  366. ;;; page-delimiter: "^/\\*" ***
  367. ;;; End: ***
  368. */
  369.