region1d.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:9k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // Template Numerical Toolkit (TNT) for Linear Algebra
  2. //
  3. // BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
  4. // Please see http://math.nist.gov/tnt for updates
  5. //
  6. // R. Pozo
  7. // Mathematical and Computational Sciences Division
  8. // National Institute of Standards and Technology
  9. #ifndef REGION1D_H
  10. #define REGION1D_H
  11. #include "subscrpt.h"
  12. #include "index.h"
  13. #include <iostream.h>
  14. #include <assert.h>
  15. template <class Array1D, class T>       // still needs T parameter
  16. class const_Region1D;                   // see region2d.h
  17. template <class Array1D /*, class T*/>
  18. class Region1D
  19. {
  20.     protected:
  21.         Array1D &  A_;
  22.         Subscript offset_;          // 0-based
  23.         Subscript dim_;
  24.         typedef Array1D::element_type T;
  25.     public:
  26.         const Array1D & array()  const { return A_; }
  27.         Subscript offset() const { return offset_;}
  28.         Subscript dim() const { return dim_; }
  29.         Subscript offset(Subscript i) const
  30.         {
  31. #ifdef TNT_BOUNDS_CHECK
  32.             assert(i==TNT_BASE_OFFSET);
  33. #endif
  34.             return offset_;
  35.         }
  36.         Subscript dim(Subscript i) const
  37.         {
  38. #ifdef TNT_BOUNDS_CHECK
  39.             assert(i== TNT_BASE_OFFSET);
  40. #endif
  41.             return offset_;
  42.         }
  43.         Region1D(Array1D &A, Subscript i1, Subscript i2) : A_(A)
  44.         {
  45. #ifdef TNT_BOUNDS_CHECK
  46.             assert(TNT_BASE_OFFSET <= i1 );
  47.             assert(i2 <= A.dim() + (TNT_BASE_OFFSET-1));
  48.             assert(i1 <= i2);
  49. #endif
  50.             offset_ = i1 - TNT_BASE_OFFSET;
  51.             dim_ = i2-i1 + 1;
  52.         }
  53.         Region1D(Array1D &A, const Index1D &I) : A_(A)
  54.         {
  55. #ifdef TNT_BOUNDS_CHECK
  56.             assert(TNT_BASE_OFFSET <=I.lbound());
  57.             assert(I.ubound() <= A.dim() + (TNT_BASE_OFFSET-1));
  58.             assert(I.lbound() <= I.ubound());
  59. #endif
  60.             offset_ = I.lbound() - TNT_BASE_OFFSET;
  61.             dim_ = I.ubound() - I.lbound() + 1;
  62.         }
  63.         Region1D(Region1D<Array1D> &A, Subscript i1, Subscript i2) :
  64.                 A_(A.A_)
  65.         {
  66. #ifdef TNT_BOUNDS_CHECK
  67.             assert(TNT_BASE_OFFSET <= i1 );
  68.             assert(i2 <= A.dim() + (TNT_BASE_OFFSET - 1));
  69.             assert(i1 <= i2);
  70. #endif
  71.                     //     (old-offset)        (new-offset)
  72.                     //
  73.             offset_ =  (i1 - TNT_BASE_OFFSET) + A.offset_;
  74.             dim_ = i2-i1 + 1;
  75.         }
  76.         Region1D<Array1D> operator()(Subscript i1, Subscript i2)
  77.         {
  78. #ifdef TNT_BOUNDS_CHECK
  79.             assert(TNT_BASE_OFFSET <= i1);
  80.             assert(i2 <= dim() + (TNT_BASE_OFFSET -1));
  81.             assert(i1 <= i2);
  82. #endif
  83.                     // offset_ is 0-based, so no need for
  84.                     //  ( - TNT_BASE_OFFSET)
  85.                     //
  86.             return Region1D<Array1D>(A_, i1+offset_,
  87.                     offset_ + i2);
  88.         }
  89.         Region1D<Array1D> operator()(const Index1D &I)
  90.         {
  91. #ifdef TNT_BOUNDS_CHECK
  92.             assert(TNT_BASE_OFFSET<=I.lbound());
  93.             assert(I.ubound() <= dim() + (TNT_BASE_OFFSET-1));
  94.             assert(I.lbound() <= I.ubound());
  95. #endif
  96.             return Region1D<Array1D>(A_, I.lbound()+offset_,
  97.                 offset_ + I.ubound());
  98.         }
  99.         T & operator()(Subscript i)
  100.         {
  101. #ifdef TNT_BOUNDS_CHECK
  102.             assert(TNT_BASE_OFFSET <= i);
  103.             assert(i <=  dim() + (TNT_BASE_OFFSET-1));
  104. #endif
  105.             return A_(i+offset_);
  106.         }
  107.         const T & operator() (Subscript i) const
  108.         {
  109. #ifdef TNT_BOUNDS_CHECK
  110.             assert(TNT_BASE_OFFSET <= i);
  111.             assert(i <= dim() + (TNT_BASE_OFFSET-1));
  112. #endif
  113.             return A_(i+offset_);
  114.         }
  115.         Region1D<Array1D> & operator=(const Region1D<Array1D> &R)
  116.         {
  117.             // make sure both sides conform
  118.             assert(dim() == R.dim());
  119.             Subscript N = dim();
  120.             Subscript i;
  121.             Subscript istart = TNT_BASE_OFFSET;
  122.             Subscript iend = istart + N-1;
  123.             for (i=istart; i<=iend; i++)
  124.                 (*this)(i) = R(i);
  125.             return *this;
  126.         }
  127.         Region1D<Array1D> & operator=(const const_Region1D<Array1D,T> &R)
  128.         {
  129.             // make sure both sides conform
  130.             assert(dim() == R.dim());
  131.             Subscript N = dim();
  132.             Subscript i;
  133.             Subscript istart = TNT_BASE_OFFSET;
  134.             Subscript iend = istart + N-1;
  135.             for (i=istart; i<=iend; i++)
  136.                 (*this)(i) = R(i);
  137.             return *this;
  138.         }
  139.         Region1D<Array1D> & operator=(const T& t)
  140.         {
  141.             Subscript N=dim();
  142.             Subscript i;
  143.             Subscript istart = TNT_BASE_OFFSET;
  144.             Subscript iend = istart + N-1;
  145.             for (i=istart; i<= iend; i++)
  146.                 (*this)(i) = t;
  147.             return *this;
  148.         }
  149.         Region1D<Array1D> & operator=(const Array1D &R)
  150.         {
  151.             // make sure both sides conform
  152.             Subscript N = dim();
  153.             assert(dim() == R.dim());
  154.             Subscript i;
  155.             Subscript istart = TNT_BASE_OFFSET;
  156.             Subscript iend = istart + N-1;
  157.             for (i=istart; i<=iend; i++)
  158.                 (*this)(i) = R(i);
  159.             return *this;
  160.         }
  161. };
  162. template <class Array1D>
  163. ostream& operator<<(ostream &s, Region1D<Array1D> &A)
  164. {
  165.     Subscript N=A.dim();
  166.     Subscript istart = TNT_BASE_OFFSET;
  167.     Subscript iend = N - 1 + TNT_BASE_OFFSET;
  168.     for (Subscript i=istart; i<=iend; i++)
  169.         s << A(i) << endl;
  170.     return s;
  171. }
  172. /*  ---------  class const_Region1D ------------ */
  173. template <class Array1D, class T>
  174. class const_Region1D
  175. {
  176.     protected:
  177.         const Array1D &  A_;
  178.         Subscript offset_;          // 0-based
  179.         Subscript dim_;
  180.     public:
  181.         const Array1D & array()  const { return A_; }
  182.         Subscript offset() const { return offset_;}
  183.         Subscript dim() const { return dim_; }
  184.         Subscript offset(Subscript i) const
  185.         {
  186. #ifdef TNT_BOUNDS_CHECK
  187.             assert(i==TNT_BASE_OFFSET);
  188. #endif
  189.             return offset_;
  190.         }
  191.         Subscript dim(Subscript i) const
  192.         {
  193. #ifdef TNT_BOUNDS_CHECK
  194.             assert(i== TNT_BASE_OFFSET);
  195. #endif
  196.             return offset_;
  197.         }
  198.         const_Region1D(const Array1D &A, Subscript i1, Subscript i2) : A_(A)
  199.         {
  200. #ifdef TNT_BOUNDS_CHECK
  201.             assert(TNT_BASE_OFFSET <= i1 );
  202.             assert(i2 <= A.dim() + (TNT_BASE_OFFSET-1));
  203.             assert(i1 <= i2);
  204. #endif
  205.             offset_ = i1 - TNT_BASE_OFFSET;
  206.             dim_ = i2-i1 + 1;
  207.         }
  208.         const_Region1D(const Array1D &A, const Index1D &I) : A_(A)
  209.         {
  210. #ifdef TNT_BOUNDS_CHECK
  211.             assert(TNT_BASE_OFFSET <=I.lbound());
  212.             assert(I.ubound() <= A.dim() + (TNT_BASE_OFFSET-1));
  213.             assert(I.lbound() <= I.ubound());
  214. #endif
  215.             offset_ = I.lbound() - TNT_BASE_OFFSET;
  216.             dim_ = I.ubound() - I.lbound() + 1;
  217.         }
  218.         const_Region1D(const_Region1D<Array1D,T> &A, Subscript i1, Subscript i2) :
  219.                 A_(A.A_)
  220.         {
  221. #ifdef TNT_BOUNDS_CHECK
  222.             assert(TNT_BASE_OFFSET <= i1 );
  223.             assert(i2 <= A.dim() + (TNT_BASE_OFFSET - 1));
  224.             assert(i1 <= i2);
  225. #endif
  226.                     //     (old-offset)        (new-offset)
  227.                     //
  228.             offset_ =  (i1 - TNT_BASE_OFFSET) + A.offset_;
  229.             dim_ = i2-i1 + 1;
  230.         }
  231.         const_Region1D<Array1D,T> operator()(Subscript i1, Subscript i2)
  232.         {
  233. #ifdef TNT_BOUNDS_CHECK
  234.             assert(TNT_BASE_OFFSET <= i1);
  235.             assert(i2 <= dim() + (TNT_BASE_OFFSET -1));
  236.             assert(i1 <= i2);
  237. #endif
  238.                     // offset_ is 0-based, so no need for
  239.                     //  ( - TNT_BASE_OFFSET)
  240.                     //
  241.             return const_Region1D<Array1D, T>(A_, i1+offset_,
  242.                     offset_ + i2);
  243.         }
  244.         const_Region1D<Array1D,T> operator()(const Index1D &I)
  245.         {
  246. #ifdef TNT_BOUNDS_CHECK
  247.             assert(TNT_BASE_OFFSET<=I.lbound());
  248.             assert(I.ubound() <= dim() + (TNT_BASE_OFFSET-1));
  249.             assert(I.lbound() <= I.ubound());
  250. #endif
  251.             return const_Region1D<Array1D, T>(A_, I.lbound()+offset_,
  252.                 offset_ + I.ubound());
  253.         }
  254.         const T & operator() (Subscript i) const
  255.         {
  256. #ifdef TNT_BOUNDS_CHECK
  257.             assert(TNT_BASE_OFFSET <= i);
  258.             assert(i <= dim() + (TNT_BASE_OFFSET-1));
  259. #endif
  260.             return A_(i+offset_);
  261.         }
  262. };
  263. template <class Array1D, class T>
  264. ostream& operator<<(ostream &s, const_Region1D<Array1D,T> &A)
  265. {
  266.     Subscript N=A.dim();
  267.     for (Subscript i=1; i<=N; i++)
  268.         s << A(i) << endl;
  269.     return s;
  270. }
  271. #endif
  272. // const_Region1D_H