source: git/factory/fac_iterfor.cc @ d675c7

spielwiese
Last change on this file since d675c7 was d675c7, checked in by Rüdiger Stobbe <stobbe@…>, 27 years ago
"IteratedFor now handles the cases in which the mainvariable is not of level 1. " git-svn-id: file:///usr/local/Singular/svn/trunk@38 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 2.1 KB
Line 
1// emacs edit mode for this file is -*- C++ -*-
2// $Id: fac_iterfor.cc,v 1.1 1996-07-08 08:18:49 stobbe Exp $
3
4/*
5$Log: not supported by cvs2svn $
6Revision 1.0  1996/05/17 10:59:45  stobbe
7Initial revision
8
9*/
10
11#include "assert.h"
12#include "cf_defs.h"
13#include "fac_iterfor.h"
14
15void
16IteratedFor::fill ( int from, int max )
17{
18    while ( from < N ) {
19        imax[from] = max;
20        index[from] = 0;
21        from++;
22    }
23    index[N] = max;
24}
25
26IteratedFor::IteratedFor( int from, int to, int max ) : MAX( max ), FROM( from ), TO( to ), N( TO-FROM ), last( false )
27{
28    ASSERT( n >= 0 && max >= 0, "illegal iterated for" );
29    index = new int[N+1];
30    imax = new int[N+1];
31    fill( 0, max );
32}
33
34IteratedFor::IteratedFor( const IteratedFor & I ) : MAX( I.MAX ), FROM( I.FROM ), TO( I.TO ), N( I.N ), last( I.last )
35{
36    index = new int[N+1];
37    imax = new int[N+1];
38    for ( int i = 0; i <= N; i++ ) {
39        index[i] = I.index[i];
40        imax[i] = I.imax[i];
41    }
42}
43
44IteratedFor::~IteratedFor()
45{
46    delete [] index;
47    delete [] imax;
48}
49
50IteratedFor&
51IteratedFor::operator= ( const IteratedFor & I )
52{
53    if ( this != &I ) {
54        if ( N != I.N ) {
55            N = I.N;
56            delete [] index;
57            delete [] imax;
58            index = new int[N+1];
59            imax = new int[N+1];
60        }
61        FROM = I.FROM;
62        TO = I.TO;
63        MAX = I.MAX;
64        last = I.last;
65        for ( int i = 0; i<= N; i++ ) {
66            index[i] = I.index[i];
67            imax[i] = I.imax[i];
68        }
69    }
70    return *this;
71}
72
73void
74IteratedFor::nextiteration()
75{
76    ASSERT( ! last, "no more iterations" );
77    if ( index[0] == MAX )
78        last = true;
79    else {
80        if ( index[N-1] != imax[N-1] ) {
81            index[N-1]++;
82            index[N]--;
83        }
84        else {
85            int i = N-1, m = index[N];
86            while ( i > 0 && index[i] == imax[i] ) {
87                m += imax[i];
88                i--;
89            }
90            index[i]++; m--;
91            fill( i+1, m );
92        }
93    }
94}
95
96int
97IteratedFor::operator[] ( int i ) const
98{
99    ASSERT( i >= FROM && i <= TO, "illegal index" );
100    return index[i-FROM];
101}
102
103ostream& operator<< ( ostream& os, const IteratedFor & I )
104{
105    os << "( " << I[I.from()];
106    for ( int i = I.from()+1; i <= I.to(); i++ )
107        os << ", " << I[i];
108    os << " )";
109    return os;
110}
Note: See TracBrowser for help on using the repository browser.