stridedstepper.cc 3.3 KB
Newer Older
1
2
3
4
5
/*! \file stridedstepper.cc
 * \brief definition of strided stepper functions
 * 
 * ----------------------------------------------------------------------------
 * 
6
 * $Id$
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 * \author Thomas Forbriger
 * \since 08/12/2002
 * 
 * definition of strided stepper functions
 *
 * ----
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 * ----
 * 
 * Copyright (c) 2002 by Thomas Forbriger (IMG Frankfurt) 
 * 
 * REVISIONS and CHANGES 
 *  - 08/12/2002   V1.0   copied from libcontxx
 *  - 18/12/2002   V1.1   (thof)
 *                        - reorganized the whole thing
 *                        - removed template parameters
 *                        - removed inline template recursion class
 *                        - use carry arithmetic
 *  - 19/12/2002   V1.2   (thof)
 *                        - introduced Mvalid
 * 
 * ============================================================================
 */

#define AFF_STRIDEDSTEPPER_CC_VERSION \
  "AFF_STRIDEDSTEPPER_DEF_H   V1.2"
#define AFF_STRIDEDSTEPPER_CC_CVSID \
46
  "$Id$"
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

#include<aff/lib/stridedstepper.h>

namespace aff {

namespace util {

  //! initialize
  StridedStepper::StridedStepper(const Strided& strided):
    Mshape(strided), Mcurrent(strided.first_offset()),
    Mindex(strided.first()), Mcarry(0), Mvalid(true),
    Mfirst_offset(strided.first_offset()),
    Mlast_offset(strided.last_offset())
    { 
      // calculate Mcarry
      for (Tsubscript i=0; i<(Tshape::Mmax_dimen); i++)
      { Mcarry[i]=strided.size(i)*strided.stride(i); }
    }

  /*----------------------------------------------------------------------*/

  //! next position
  StridedStepper& StridedStepper::incr()
    {
      if (!this->more()) Mvalid=false;
      Tsubscript i=0;
      while (i<Tshape::Mmax_dimen)
      {
        ++Mindex[i];
        Mcurrent+=Mshape.stride(i);
        if (Mindex[i]>Mshape.last(i)) 
        {
          Mindex[i]=Mshape.first(i);
          Mcurrent-=Mcarry[i];
          ++i;
        }
        else
        {
          i=Tshape::Mmax_dimen;
        }
      }
      return(*this);
    }

  /*----------------------------------------------------------------------*/

  //! previous position
  StridedStepper& StridedStepper::decr()
    {
      if (!this->less()) Mvalid=false;
      Tsubscript i=0;
      while (i<Tshape::Mmax_dimen)
      {
        --Mindex[i];
        Mcurrent-=Mshape.stride(i);
        if (Mindex[i]<Mshape.first(i)) 
        {
          Mindex[i]=Mshape.last(i);
          Mcurrent+=Mcarry[i];
          ++i;
        }
        else
        {
          i=Tshape::Mmax_dimen;
        }
      }
      return(*this);
    }

} // namespace util

} // namespace aff

/* ----- END OF stridedstepper.cc ----- */