Changeset 2915 in Sophya for trunk/SophyaLib/TArray


Ignore:
Timestamp:
Feb 22, 2006, 7:17:30 PM (20 years ago)
Author:
ansari
Message:

Amelioration de la classe Range - permettant une valeur symbolique pour specifier le dernier index (last()) - Reza 22/02/2006

Location:
trunk/SophyaLib/TArray
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/TArray/tarray.cc

    r2888 r2915  
    424424/*!
    425425  \param rx,ry,rz,rt,ru : range of extraction along dimensions
    426   \sa Range
     426  \sa SOPHYA::Range
    427427 */
    428428template <class T>
     
    432432    throw RangeCheckError("TArray<T>::operator () (Range, ...) - Not Allocated Array ! ");
    433433  int_4 ndim = 0;
     434
     435  // Updating Range objects using actual array size
     436  rx.Update(SizeX());
     437  ry.Update(SizeY());
     438  rz.Update(SizeZ());
     439  if (NbDimensions() > 3)  rt.Update(Size(3));
     440  else rt.Update(0);
     441  if (NbDimensions() > 4)  ru.Update(Size(4));
     442  else  ru.Update(0);
     443
    434444  sa_size_t size[BASEARRAY_MAXNDIMS];
    435445  sa_size_t step[BASEARRAY_MAXNDIMS];
  • trunk/SophyaLib/TArray/tarray.h

    r2888 r2915  
    7777  TArray<T> SubArray(Range rx, Range ry, Range rz, Range rt, Range ru) const ;
    7878
    79   //! () operator for Sub arrays extraction
    80   /*! \sa SubArray */
     79  //! Extract the first 3D subarray specified by rx, ry, rz. (see SubArray() )
    8180  inline TArray<T> operator () (Range rx, Range ry, Range rz) const
    82                    { return  SubArray(rx, ry, rz, Range(0), Range(0)); }
     81                   { return  SubArray(rx, ry, rz, Range::first(), Range::first()); }
     82  //! Extract the first 4D subarray specified by rx, ry, rz. (see SubArray() )
    8383  inline TArray<T> operator () (Range rx, Range ry, Range rz, Range rt) const
    84                    { return  SubArray(rx, ry, rz, rt, Range(0)); }
     84                   { return  SubArray(rx, ry, rz, rt, Range::first()); }
     85  //! Extract the subarray specified by rx, ry, rz. (see SubArray() )
    8586  inline TArray<T> operator () (Range rx, Range ry, Range rz, Range rt, Range ru) const
    8687                   { return  SubArray(rx, ry, rz, rt, ru); }
  • trunk/SophyaLib/TArray/tmatrix.cc

    r2868 r2915  
    1 // $Id: tmatrix.cc,v 1.33 2006-01-03 14:17:46 ansari Exp $
     1// $Id: tmatrix.cc,v 1.34 2006-02-22 18:17:30 ansari Exp $
    22//                         C.Magneville          04/99
    33#include "sopnamsp.h"
     
    249249TMatrix<T> TMatrix<T>::SubMatrix(Range rline, Range rcol) const
    250250{
    251   Range rx, ry;
     251  Range rx=Range::first();
     252  Range ry=Range::first();
    252253  short mm = GetMemoryMapping();
    253254  if (mm == CMemoryMapping)  { rx = rcol;  ry = rline; }
    254255  else { ry = rcol;  rx = rline; }
    255   TMatrix sm(SubArray(rx, ry, Range(0), Range(0), Range(0)),true);
     256  TMatrix sm(SubArray(rx, ry, Range::first(), Range::first(), Range::first()), true);
    256257  sm.UpdateMemoryMapping(mm);
    257258  return(sm);
  • trunk/SophyaLib/TArray/tvector.cc

    r2868 r2915  
    1 // $Id: tvector.cc,v 1.20 2006-01-03 14:17:46 ansari Exp $
     1// $Id: tvector.cc,v 1.21 2006-02-22 18:17:30 ansari Exp $
    22//                         C.Magneville          04/99
    33#include "sopnamsp.h"
     
    188188TVector<T> TVector<T>::SubVector(Range relt) const
    189189{
    190   Range rr, cr;
     190  Range rr=Range::first();
     191  Range cr=Range::first();
    191192  if (GetVectorType() == ColumnVector )  rr = relt;
    192193  else cr = relt;
  • trunk/SophyaLib/TArray/utilarr.cc

    r2795 r2915  
    313313  \class SOPHYA::Range
    314314  \ingroup TArray
    315   Class to define a range of indexes
    316 */
    317 
    318 //! Constructor
    319 /*!
    320   Define a range of indexes
     315  Class to define a range of indices, to be used with TArra<T> TMatrix<T> TVector<T> ...
     316*/
     317
     318/*!
     319  Constructor defining defining the range of indices, starting from \b start to the last.
     320  \param start : start index (inclusive)
     321*/
     322Range::Range(sa_size_t start)
     323{
     324  start_ = start;
     325  end_ = Range::lastIndex();
     326  size_ = 0;
     327  step_ = 1;
     328}
     329
     330/*!
     331  Constructor defining defining the range of indices, from \b start to \b end
    321332  \param start : start index (inclusive)
    322333  \param end : end index (inclusive)
    323   \param size : size (number of elements, used if end \<= start)
    324   \param step : step (or stride)
    325 
    326   \warning If \b end \> \b start, \b size is computed automatically
    327   \warning If not \b size is fixed and \b end recomputed
     334*/
     335Range::Range(sa_size_t start, sa_size_t end)
     336{
     337  start_ = start;
     338  end_ = end;
     339  if (end >= start)   size_ = end-start+1;
     340  else size_ = 0;
     341  step_ = 1;
     342}
     343
     344/*!
     345  Constructor defining defining the range of indices, from \b start to \b end
     346  \param start : start index (inclusive)
     347  \param end : end index (inclusive)
     348  \param step : step (or stride) = index increment
     349*/
     350Range::Range(sa_size_t start, sa_size_t end, sa_size_t step)
     351{
     352  start_ = start;
     353  end_ = end;
     354  step_ = (step > 0) ? step : 1;
     355  if (step < 1) step = 1;
     356  if (end >= start)
     357    size_ = (end-start)/step_+1;
     358  else size_ = 0;
     359}
     360
     361/*!
     362  Define a range of indices
     363  \param start : start index (inclusive)
     364  \param end : end index (inclusive, used if size \<= 0 and end \>= start)
     365  \param size : size (number of elements, used if \>= 1 )
     366  \param step : step (or stride) = index increment
     367
     368  \warning If \b size \>= 1 , \b end index computed automatically.
     369  If \b size \< 1 and \b end < \b start , equivalent to \b end = Range()::lastIndex()
    328370 */
    329371Range::Range(sa_size_t start, sa_size_t end, sa_size_t size, sa_size_t step)
     
    331373  start_ = start;
    332374  step_ = (step > 0) ? step : 1;
    333   if (end > start) {  // Taille calcule automatiquement
    334     end_ = end;
    335     if (step_ > ((end_-start_)+1))  size_ = 1;
    336     else size_ = ((end-start)+1)/step_;
    337   }
    338   else {     // Taille fixee
     375  if (size > 0) {  // Nb d'elements fixe
    339376    size_ = size;
    340     end_ = start_+size_*step_;
    341   }
     377    if (end == Range::lastIndex())  start_ = end_ = end;
     378    else end_ = start_+size_*step_;   
     379  }
     380  else {
     381    if (end >= start) {  // Indice de fin fixe
     382      end_ = end;
     383      size_ = (end-start)/step_+1;
     384    }
     385    else {  // rien fixe
     386      size_ = 0;
     387      end_ = Range::lastIndex();
     388    }
     389  }
     390}
     391
     392/*
     393Range::Range(Range const& a)
     394{
     395  start_ = a.start_;
     396  end_ = a.end_;
     397  size_ = a.size_;
     398  step_ = a.step_;
     399}
     400*/
     401
     402/*!
     403  This method is called to recompute index ranges, specifying the original array size
     404  by the TArray<T> (or derived classes) sub array extraction methods
     405*/
     406void Range::Update(sa_size_t osz)
     407{
     408  if (end_ >= 0)  return;
     409  if (osz == 0) {
     410    start_ = end_ = 0;
     411    size_ = step_ = 1;
     412    return;
     413  }
     414  if (end_ == start_) {
     415    end_ = osz-1;
     416    if ((size_ > 0) && (size_ <= osz/step_))
     417      start_ = end_ - size_*step_;
     418    else {
     419      start_ = end_;
     420      size_ = 1;
     421    }
     422  }
     423  else {
     424    end_ = osz-1;
     425    size_ = (end_-start_)/step_+1;
     426  }
     427  return;
    342428}
    343429
  • trunk/SophyaLib/TArray/utilarr.h

    r2286 r2915  
    128128class Range {
    129129public:
    130   explicit Range(sa_size_t start=0, sa_size_t end=0, sa_size_t size=1, sa_size_t step=1);
     130  //! Index range start \<= index \<= last()
     131  Range(sa_size_t start);
     132  //! Index range start \<= index \<= end
     133  Range(sa_size_t start, sa_size_t end);
     134  //! Index range start \<= index \<= end with increment step
     135  Range(sa_size_t start, sa_size_t end, sa_size_t step);
     136  //! General Index range specification, using size or start/end and increment
     137  Range(sa_size_t start, sa_size_t end, sa_size_t size, sa_size_t step);
    131138  //! Return the start index
    132139  inline sa_size_t & Start()  {  return start_; }
     
    137144  //! Return the step
    138145  inline sa_size_t & Step()   {  return step_; }
     146  //! return a constant value defining the first element
     147  inline static sa_size_t firstIndex() { return 0; }
     148  //! return a constant value as a placeholder for the last valid index
     149  inline static sa_size_t lastIndex() { return -1; }
     150  //! return a Range object specifing all indices, from first to last
     151  inline static Range all()
     152  { return Range(Range::firstIndex() , Range::lastIndex()); }
     153  //! return a Range object specifing the first index
     154  inline static Range first()
     155  { return Range(Range::firstIndex() , Range::lastIndex(), 1, 1); }
     156  //! return a Range object specifing the last valid index
     157  inline static Range last()
     158  { return Range(Range::lastIndex() , Range::lastIndex(), 1, 1); }
     159
     160  //! For internal TArray module use.
     161  void Update(sa_size_t osz);
     162
    139163protected:
    140164  sa_size_t start_; //!< start index
Note: See TracChangeset for help on using the changeset viewer.