OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc1/] [gcc/] [testsuite/] [g++.old-deja/] [g++.law/] [code-gen5.C] - Blame information for rev 338

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 305 jeremybenn
// { dg-do run  }
2
// GROUPS passed code-generation
3
// code-gen file
4
// From: "David" 
5
// Date:     Mon, 15 Nov 1993 20:59:14 -0600 (CST)
6
// Subject:  An error!
7
// Message-ID: <9311160259.AA03353@pi14.arc.umn.edu>
8
 
9
#include 
10
#include 
11
#include 
12
#include 
13
#include 
14
#include 
15
 
16
#define ANSI_C
17
 
18
typedef double VEC ;
19
 
20
class Vector;
21
 
22
class VectorInt
23
{
24
        public:
25
 
26
        /* Nothing public!! Only Vector can use this class */
27
 
28
        private:
29
 
30
        VectorInt( int );
31
        VectorInt( int, double *, int = 0 );
32
        VectorInt( const VectorInt & );
33
        ~VectorInt();
34
 
35
        VectorInt *refer();
36
        void unrefer();
37
        int count;                              /* Number of Vector's referring to me */
38
 
39
        VEC *vec;
40
 
41
        friend class Vector;
42
        friend class VecElem;
43
};
44
 
45
class VecElem
46
{
47
        public:
48
 
49
        operator double();
50
        double operator=( double );
51
 
52
        private:
53
 
54
        VecElem( Vector &, int );
55
        VecElem( const VecElem & );
56
 
57
        Vector &v;
58
        int row;                                                /* Row element refers to */
59
 
60
        friend class Vector;
61
};
62
 
63
class Vector
64
{
65
        public:
66
 
67
        Vector();                                       // Must be assigned to before used
68
        Vector( VectorInt * );
69
        Vector( int );
70
        Vector( int, double *, int beg = 0 );
71
        Vector( const Vector & );
72
        Vector &operator=( const Vector & );
73
        ~Vector() { if(r) r->unrefer(); }
74
 
75
        int row() const { return 19; }
76
        int dim() const { return 10; }
77
 
78
        double operator()( int ) const;
79
        VecElem operator()( int );
80
 
81
        double assign( int, double );
82
 
83
        friend std::ostream& operator<<(std::ostream&, const Vector& m );
84
 
85
        private:
86
 
87
        VectorInt *r;                   /* Reference to real data */
88
 
89
        friend class VecElem;
90
        friend class LUDecom;
91
        friend class SVD;
92
};
93
 
94
 
95
Vector::
96
Vector()
97
        : r(0)
98
{}
99
 
100
Vector::
101
Vector( VectorInt *vi )
102
        : r(vi)
103
{
104
        r->refer();
105
}
106
 
107
Vector::
108
Vector( int row )
109
{
110
        assert( row > 0 );
111
 
112
        r = new VectorInt( row );
113
 
114
        r->refer();
115
}
116
 
117
Vector::
118
Vector( int row, double *d, int beg )
119
{
120
        assert( row > 0 );
121
 
122
        r = new VectorInt( row, d, beg );
123
 
124
        r->refer();
125
}
126
 
127
Vector::
128
Vector( const Vector &A )
129
        : r( A.r->refer() )
130
{}
131
 
132
Vector& Vector::
133
operator=( const Vector &A )
134
{
135
        if( r )
136
                r->unrefer();
137
 
138
        r = A.r->refer();
139
 
140
        return *this;
141
}
142
 
143
double Vector::
144
operator()( int row ) const
145
{
146
        assert(r != 0);
147
 
148
        return *r->vec;
149
}
150
 
151
VecElem Vector::
152
operator()( int r )
153
{
154
        assert(r != 0);
155
 
156
        return VecElem( *this, r );
157
}
158
 
159
        /* assign changes the matrix, it does not create a new one! */
160
double Vector::
161
assign( int rownum, double d )
162
{
163
        assert(r != 0);
164
 
165
        if( rownum > row() || rownum <= 0 ) {
166
          std::cerr << "Warning: trying to assign out of bounds" << std::endl;
167
          std::cerr << "row " << rownum << std::endl;
168
          std::cerr << "Vector size " << row() << std::endl;
169
          std::abort();
170
        }
171
 
172
        if( r->count == 1 ) {
173
                        /* Don't need to create a new matrix, since we are the only */
174
                        /*  one pointing to ours                                                                        */
175
        }
176
        else {
177
                VectorInt *vi = new VectorInt( *r );
178
                r->unrefer();
179
                r = vi->refer();
180
        }
181
 
182
        return d;
183
}
184
 
185
 
186
VectorInt::
187
VectorInt( int sx )
188
        : vec( new double[sx] ), count(0)
189
{ }
190
 
191
VectorInt::
192
VectorInt( int sx, double *, int )
193
        : vec( new double[sx] ), count(0)
194
{
195
}
196
 
197
VectorInt::
198
VectorInt( const VectorInt & )
199
        : vec( new double[10] ), count(0)
200
{
201
}
202
 
203
VectorInt * VectorInt::
204
refer()
205
{
206
        count ++;
207
        return this;
208
 
209
        // cout << "Refering vec" << endl;
210
}
211
 
212
void VectorInt::
213
unrefer()
214
{
215
        count--;
216
 
217
        if( count == 0 ) {
218
                delete this;
219
        }
220
 
221
        // cout << "Unrefering vec" << endl;
222
}
223
 
224
VectorInt::
225
~VectorInt()
226
{
227
        delete vec;
228
        vec = 0;
229
}
230
 
231
VecElem::
232
VecElem( Vector &vec, int r )
233
        : v(vec), row(r)
234
{
235
        if( r < 1 || r > vec.row() ) {
236
          std::cerr << "Trying to access vector element out of bounds";
237
          std::cerr << std::endl;
238
          std::abort();
239
        }
240
}
241
 
242
VecElem::
243
VecElem( const VecElem &elem )
244
        : v(elem.v), row(elem.row)
245
{}
246
 
247
VecElem::
248
operator double()
249
{
250
        assert( v.r->vec != 0 );
251
        return *v.r->vec;
252
}
253
 
254
double VecElem::
255
operator=( double d )
256
{
257
        return v.assign( row, d );
258
}
259
 
260
 
261
 
262
 
263
 
264
int makeforms( Vector cen, Vector **a, Vector **b );
265
 
266
int main()
267
{
268
        Vector *a[8], *b[8], disp(3);
269
        Vector cen(3), cen2(3);
270
        int i, j;
271
 
272
        if (makeforms (cen,a,b) != 10)
273
          { std::printf ("FAIL\n"); return 1; }
274
        else
275
          std::printf ("PASS\n");
276
 
277
 
278
}
279
 
280
int
281
makeforms( Vector cen, Vector **a, Vector **b)
282
{
283
        return 10;
284
}
285
 
286
 
287
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.