annotate gcc/testsuite/g++.dg/torture/pr37922.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do run }
kono
parents:
diff changeset
2 // { dg-options "-fpic" { target fpic } }
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 template <typename NumType>
kono
parents:
diff changeset
7 inline
kono
parents:
diff changeset
8 NumType
kono
parents:
diff changeset
9 absolute(NumType const& x)
kono
parents:
diff changeset
10 {
kono
parents:
diff changeset
11 if (x < NumType(0)) return -x;
kono
parents:
diff changeset
12 return x;
kono
parents:
diff changeset
13 }
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 class trivial_accessor
kono
parents:
diff changeset
16 {
kono
parents:
diff changeset
17 public:
kono
parents:
diff changeset
18 typedef size_t index_type;
kono
parents:
diff changeset
19 struct index_value_type {};
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 trivial_accessor() : size_(0) {}
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 trivial_accessor(size_t const& n) : size_(n) {}
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 size_t size_1d() const { return size_; }
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 protected:
kono
parents:
diff changeset
28 size_t size_;
kono
parents:
diff changeset
29 };
kono
parents:
diff changeset
30
kono
parents:
diff changeset
31 namespace N0
kono
parents:
diff changeset
32 {
kono
parents:
diff changeset
33 template <typename ElementType,
kono
parents:
diff changeset
34 typename AccessorType = trivial_accessor>
kono
parents:
diff changeset
35 class const_ref
kono
parents:
diff changeset
36 {
kono
parents:
diff changeset
37 public:
kono
parents:
diff changeset
38 typedef ElementType value_type;
kono
parents:
diff changeset
39 typedef size_t size_type;
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 typedef AccessorType accessor_type;
kono
parents:
diff changeset
42 typedef typename accessor_type::index_type index_type;
kono
parents:
diff changeset
43 typedef typename accessor_type::index_value_type index_value_type;
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 const_ref() {}
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 const_ref(const ElementType* begin, accessor_type const& accessor)
kono
parents:
diff changeset
48 : begin_(begin), accessor_(accessor)
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 init();
kono
parents:
diff changeset
51 }
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 const_ref(const ElementType* begin, index_value_type const& n0)
kono
parents:
diff changeset
54 : begin_(begin), accessor_(n0)
kono
parents:
diff changeset
55 {
kono
parents:
diff changeset
56 init();
kono
parents:
diff changeset
57 }
kono
parents:
diff changeset
58
kono
parents:
diff changeset
59 const_ref(const ElementType* begin, index_value_type const& n0,
kono
parents:
diff changeset
60 index_value_type const& n1)
kono
parents:
diff changeset
61 : begin_(begin), accessor_(n0, n1)
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 init();
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 const_ref(const ElementType* begin, index_value_type const& n0,
kono
parents:
diff changeset
67 index_value_type const& n1,
kono
parents:
diff changeset
68 index_value_type const& n2)
kono
parents:
diff changeset
69 : begin_(begin), accessor_(n0, n1, n2)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 init();
kono
parents:
diff changeset
72 }
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 accessor_type const& accessor() const { return accessor_; }
kono
parents:
diff changeset
75 size_type size() const { return size_; }
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 const ElementType* begin() const { return begin_; }
kono
parents:
diff changeset
78 const ElementType* end() const { return end_; }
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 ElementType const&
kono
parents:
diff changeset
81 operator[](size_type i) const { return begin_[i]; }
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 const_ref<ElementType>
kono
parents:
diff changeset
84 as_1d() const
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 return const_ref<ElementType>(begin_, size_);
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 protected:
kono
parents:
diff changeset
90 void
kono
parents:
diff changeset
91 init()
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 size_ = accessor_.size_1d();
kono
parents:
diff changeset
94 end_ = begin_ + size_;
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 const ElementType* begin_;
kono
parents:
diff changeset
98 accessor_type accessor_;
kono
parents:
diff changeset
99 size_type size_;
kono
parents:
diff changeset
100 const ElementType* end_;
kono
parents:
diff changeset
101 };
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 template <typename ElementType,
kono
parents:
diff changeset
105 typename AccessorType = trivial_accessor>
kono
parents:
diff changeset
106 class ref : public N0::const_ref<ElementType, AccessorType>
kono
parents:
diff changeset
107 {
kono
parents:
diff changeset
108 public:
kono
parents:
diff changeset
109 typedef ElementType value_type;
kono
parents:
diff changeset
110 typedef size_t size_type;
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 typedef N0::const_ref<ElementType, AccessorType> base_class;
kono
parents:
diff changeset
113 typedef AccessorType accessor_type;
kono
parents:
diff changeset
114 typedef typename accessor_type::index_type index_type;
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 ref() {}
kono
parents:
diff changeset
117
kono
parents:
diff changeset
118 ElementType*
kono
parents:
diff changeset
119 begin() const { return const_cast<ElementType*>(this->begin_); }
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 ElementType*
kono
parents:
diff changeset
122 end() const { return const_cast<ElementType*>(this->end_); }
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 ElementType&
kono
parents:
diff changeset
125 operator[](size_type i) const { return begin()[i]; }
kono
parents:
diff changeset
126 };
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 namespace N1 {
kono
parents:
diff changeset
129 template <typename ElementType, size_t N>
kono
parents:
diff changeset
130 class tiny_plain
kono
parents:
diff changeset
131 {
kono
parents:
diff changeset
132 public:
kono
parents:
diff changeset
133 typedef ElementType value_type;
kono
parents:
diff changeset
134 typedef size_t size_type;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 static const size_t fixed_size=N;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 ElementType elems[N];
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 tiny_plain() {}
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 static size_type size() { return N; }
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 ElementType* begin() { return elems; }
kono
parents:
diff changeset
145 const ElementType* begin() const { return elems; }
kono
parents:
diff changeset
146 ElementType* end() { return elems+N; }
kono
parents:
diff changeset
147 const ElementType* end() const { return elems+N; }
kono
parents:
diff changeset
148 ElementType& operator[](size_type i) { return elems[i]; }
kono
parents:
diff changeset
149 ElementType const& operator[](size_type i) const { return elems[i]; }
kono
parents:
diff changeset
150 };
kono
parents:
diff changeset
151
kono
parents:
diff changeset
152 template <typename ElementType, size_t N>
kono
parents:
diff changeset
153 class tiny : public tiny_plain<ElementType, N>
kono
parents:
diff changeset
154 {
kono
parents:
diff changeset
155 public:
kono
parents:
diff changeset
156 typedef ElementType value_type;
kono
parents:
diff changeset
157 typedef size_t size_type;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 typedef tiny_plain<ElementType, N> base_class;
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 tiny() {}
kono
parents:
diff changeset
162 };
kono
parents:
diff changeset
163 }
kono
parents:
diff changeset
164
kono
parents:
diff changeset
165 template <typename NumType>
kono
parents:
diff changeset
166 class mat3 : public N1::tiny_plain<NumType, 9>
kono
parents:
diff changeset
167 {
kono
parents:
diff changeset
168 public:
kono
parents:
diff changeset
169 typedef typename N1::tiny_plain<NumType, 9> base_type;
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 mat3() {}
kono
parents:
diff changeset
172 mat3(NumType const& e00, NumType const& e01, NumType const& e02,
kono
parents:
diff changeset
173 NumType const& e10, NumType const& e11, NumType const& e12,
kono
parents:
diff changeset
174 NumType const& e20, NumType const& e21, NumType const& e22)
kono
parents:
diff changeset
175 : base_type(e00, e01, e02, e10, e11, e12, e20, e21, e22)
kono
parents:
diff changeset
176 {}
kono
parents:
diff changeset
177 mat3(base_type const& a)
kono
parents:
diff changeset
178 : base_type(a)
kono
parents:
diff changeset
179 {}
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 NumType const&
kono
parents:
diff changeset
182 operator()(size_t r, size_t c) const
kono
parents:
diff changeset
183 {
kono
parents:
diff changeset
184 return this->elems[r * 3 + c];
kono
parents:
diff changeset
185 }
kono
parents:
diff changeset
186 NumType&
kono
parents:
diff changeset
187 operator()(size_t r, size_t c)
kono
parents:
diff changeset
188 {
kono
parents:
diff changeset
189 return this->elems[r * 3 + c];
kono
parents:
diff changeset
190 }
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 NumType
kono
parents:
diff changeset
193 trace() const
kono
parents:
diff changeset
194 {
kono
parents:
diff changeset
195 mat3 const& m = *this;
kono
parents:
diff changeset
196 return m[0] + m[4] + m[8];
kono
parents:
diff changeset
197 }
kono
parents:
diff changeset
198
kono
parents:
diff changeset
199 NumType
kono
parents:
diff changeset
200 determinant() const
kono
parents:
diff changeset
201 {
kono
parents:
diff changeset
202 mat3 const& m = *this;
kono
parents:
diff changeset
203 return m[0] * (m[4] * m[8] - m[5] * m[7])
kono
parents:
diff changeset
204 - m[1] * (m[3] * m[8] - m[5] * m[6])
kono
parents:
diff changeset
205 + m[2] * (m[3] * m[7] - m[4] * m[6]);
kono
parents:
diff changeset
206 }
kono
parents:
diff changeset
207 };
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 template <typename NumType>
kono
parents:
diff changeset
210 inline
kono
parents:
diff changeset
211 mat3<NumType>
kono
parents:
diff changeset
212 operator-(mat3<NumType> const& v)
kono
parents:
diff changeset
213 {
kono
parents:
diff changeset
214 mat3<NumType> result;
kono
parents:
diff changeset
215 for(size_t i=0;i<9;i++) {
kono
parents:
diff changeset
216 result[i] = -v[i];
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218 return result;
kono
parents:
diff changeset
219 }
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 class mat_grid : public N1::tiny<size_t, 2>
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 public:
kono
parents:
diff changeset
224 typedef N1::tiny<size_t, 2> index_type;
kono
parents:
diff changeset
225 typedef index_type::value_type index_value_type;
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 mat_grid() { this->elems[0]=0; this->elems[1]=0; }
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 mat_grid(index_type const& n) : index_type(n) {}
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 mat_grid(index_value_type const& n0, index_value_type const& n1)
kono
parents:
diff changeset
232 { this->elems[0]=n0; this->elems[1]=n1; }
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 size_t size_1d() const { return elems[0] * elems[1]; }
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 size_t
kono
parents:
diff changeset
237 operator()(index_value_type const& r, index_value_type const& c) const
kono
parents:
diff changeset
238 {
kono
parents:
diff changeset
239 return r * elems[1] + c;
kono
parents:
diff changeset
240 }
kono
parents:
diff changeset
241 };
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 template <typename NumType, typename AccessorType = mat_grid>
kono
parents:
diff changeset
244 class mat_const_ref : public N0::const_ref<NumType, AccessorType>
kono
parents:
diff changeset
245 {
kono
parents:
diff changeset
246 public:
kono
parents:
diff changeset
247 typedef AccessorType accessor_type;
kono
parents:
diff changeset
248 typedef typename N0::const_ref<NumType, AccessorType> base_type;
kono
parents:
diff changeset
249 typedef typename accessor_type::index_value_type index_value_type;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 mat_const_ref() {}
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 mat_const_ref(const NumType* begin, accessor_type const& grid)
kono
parents:
diff changeset
254 : base_type(begin, grid)
kono
parents:
diff changeset
255 {}
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 mat_const_ref(const NumType* begin, index_value_type const& n_rows,
kono
parents:
diff changeset
258 index_value_type const& n_columns)
kono
parents:
diff changeset
259 : base_type(begin, accessor_type(n_rows, n_columns))
kono
parents:
diff changeset
260 {}
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 accessor_type
kono
parents:
diff changeset
263 grid() const { return this->accessor(); }
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 index_value_type const&
kono
parents:
diff changeset
266 n_rows() const { return this->accessor()[0]; }
kono
parents:
diff changeset
267
kono
parents:
diff changeset
268 index_value_type const&
kono
parents:
diff changeset
269 n_columns() const { return this->accessor()[1]; }
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 NumType const&
kono
parents:
diff changeset
272 operator()(index_value_type const& r, index_value_type const& c) const
kono
parents:
diff changeset
273 {
kono
parents:
diff changeset
274 return this->begin()[this->accessor()(r, c)];
kono
parents:
diff changeset
275 }
kono
parents:
diff changeset
276 };
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 template <typename NumType, typename AccessorType = mat_grid>
kono
parents:
diff changeset
279 class mat_ref : public mat_const_ref<NumType, AccessorType>
kono
parents:
diff changeset
280 {
kono
parents:
diff changeset
281 public:
kono
parents:
diff changeset
282 typedef AccessorType accessor_type;
kono
parents:
diff changeset
283 typedef mat_const_ref<NumType, AccessorType> base_type;
kono
parents:
diff changeset
284 typedef typename accessor_type::index_value_type index_value_type;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 mat_ref() {}
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 mat_ref(NumType* begin, accessor_type const& grid)
kono
parents:
diff changeset
289 : base_type(begin, grid)
kono
parents:
diff changeset
290 {}
kono
parents:
diff changeset
291
kono
parents:
diff changeset
292 mat_ref(NumType* begin, index_value_type n_rows,
kono
parents:
diff changeset
293 index_value_type n_columns)
kono
parents:
diff changeset
294 : base_type(begin, accessor_type(n_rows, n_columns))
kono
parents:
diff changeset
295 {}
kono
parents:
diff changeset
296
kono
parents:
diff changeset
297 NumType*
kono
parents:
diff changeset
298 begin() const { return const_cast<NumType*>(this->begin_); }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 NumType*
kono
parents:
diff changeset
301 end() const { return const_cast<NumType*>(this->end_); }
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 NumType&
kono
parents:
diff changeset
304 operator[](index_value_type const& i) const { return begin()[i]; }
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 NumType&
kono
parents:
diff changeset
307 operator()(index_value_type const& r, index_value_type const& c) const
kono
parents:
diff changeset
308 {
kono
parents:
diff changeset
309 return this->begin()[this->accessor()(r, c)];
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311 };
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 template <typename AnyType>
kono
parents:
diff changeset
314 inline void
kono
parents:
diff changeset
315 swap(AnyType* a, AnyType* b, size_t n)
kono
parents:
diff changeset
316 {
kono
parents:
diff changeset
317 for(size_t i=0;i<n;i++) {
kono
parents:
diff changeset
318 AnyType t = a[i]; a[i] = b[i]; b[i] = t;
kono
parents:
diff changeset
319 }
kono
parents:
diff changeset
320 }
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 template <typename IntType>
kono
parents:
diff changeset
323 size_t
kono
parents:
diff changeset
324 form_t(mat_ref<IntType>& m,
kono
parents:
diff changeset
325 mat_ref<IntType> const& t)
kono
parents:
diff changeset
326 {
kono
parents:
diff changeset
327 typedef size_t size_t;
kono
parents:
diff changeset
328 size_t mr = m.n_rows();
kono
parents:
diff changeset
329 size_t mc = m.n_columns();
kono
parents:
diff changeset
330 size_t tc = t.n_columns();
kono
parents:
diff changeset
331 if (tc) {
kono
parents:
diff changeset
332 }
kono
parents:
diff changeset
333 size_t i, j;
kono
parents:
diff changeset
334 for (i = j = 0; i < mr && j < mc;) {
kono
parents:
diff changeset
335 size_t k = i; while (k < mr && m(k,j) == 0) k++;
kono
parents:
diff changeset
336 if (k == mr)
kono
parents:
diff changeset
337 j++;
kono
parents:
diff changeset
338 else {
kono
parents:
diff changeset
339 if (i != k) {
kono
parents:
diff changeset
340 swap(&m(i,0), &m(k,0), mc);
kono
parents:
diff changeset
341 if (tc) swap(&t(i,0), &t(k,0), tc);
kono
parents:
diff changeset
342 }
kono
parents:
diff changeset
343 for (k++; k < mr; k++) {
kono
parents:
diff changeset
344 IntType a = absolute(m(k, j));
kono
parents:
diff changeset
345 if (a != 0 && a < absolute(m(i,j))) {
kono
parents:
diff changeset
346 swap(&m(i,0), &m(k,0), mc);
kono
parents:
diff changeset
347 if (tc) swap(&t(i,0), &t(k,0), tc);
kono
parents:
diff changeset
348 }
kono
parents:
diff changeset
349 }
kono
parents:
diff changeset
350 if (m(i,j) < 0) {
kono
parents:
diff changeset
351 for(size_t ic=0;ic<mc;ic++) m(i,ic) *= -1;
kono
parents:
diff changeset
352 if (tc) for(size_t ic=0;ic<tc;ic++) t(i,ic) *= -1;
kono
parents:
diff changeset
353 }
kono
parents:
diff changeset
354 bool cleared = true;
kono
parents:
diff changeset
355 for (k = i+1; k < mr; k++) {
kono
parents:
diff changeset
356 IntType a = m(k,j) / m(i,j);
kono
parents:
diff changeset
357 if (a != 0) {
kono
parents:
diff changeset
358 for(size_t ic=0;ic<mc;ic++) m(k,ic) -= a * m(i,ic);
kono
parents:
diff changeset
359 if (tc) for(size_t ic=0;ic<tc;ic++) t(k,ic) -= a * t(i,ic);
kono
parents:
diff changeset
360 }
kono
parents:
diff changeset
361 if (m(k,j) != 0) cleared = false;
kono
parents:
diff changeset
362 }
kono
parents:
diff changeset
363 if (cleared) { i++; j++; }
kono
parents:
diff changeset
364 }
kono
parents:
diff changeset
365 }
kono
parents:
diff changeset
366 m = mat_ref<IntType>(m.begin(), i, mc);
kono
parents:
diff changeset
367 return i;
kono
parents:
diff changeset
368 }
kono
parents:
diff changeset
369
kono
parents:
diff changeset
370 template <typename IntType>
kono
parents:
diff changeset
371 size_t
kono
parents:
diff changeset
372 form(mat_ref<IntType>& m)
kono
parents:
diff changeset
373 {
kono
parents:
diff changeset
374 mat_ref<IntType> t(0,0,0);
kono
parents:
diff changeset
375 return form_t(m, t);
kono
parents:
diff changeset
376 }
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 typedef mat3<int> sg_mat3;
kono
parents:
diff changeset
379
kono
parents:
diff changeset
380 class rot_mx
kono
parents:
diff changeset
381 {
kono
parents:
diff changeset
382 public:
kono
parents:
diff changeset
383 explicit
kono
parents:
diff changeset
384 rot_mx(sg_mat3 const& m, int denominator=1)
kono
parents:
diff changeset
385 : num_(m), den_(denominator)
kono
parents:
diff changeset
386 {}
kono
parents:
diff changeset
387
kono
parents:
diff changeset
388 sg_mat3 const&
kono
parents:
diff changeset
389 num() const { return num_; }
kono
parents:
diff changeset
390 sg_mat3&
kono
parents:
diff changeset
391 num() { return num_; }
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 int const&
kono
parents:
diff changeset
394 operator[](size_t i) const { return num_[i]; }
kono
parents:
diff changeset
395 int&
kono
parents:
diff changeset
396 operator[](size_t i) { return num_[i]; }
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 int
kono
parents:
diff changeset
399 const& operator()(int r, int c) const { return num_(r, c); }
kono
parents:
diff changeset
400 int&
kono
parents:
diff changeset
401 operator()(int r, int c) { return num_(r, c); }
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 int const&
kono
parents:
diff changeset
404 den() const { return den_; }
kono
parents:
diff changeset
405 int&
kono
parents:
diff changeset
406 den() { return den_; }
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 rot_mx
kono
parents:
diff changeset
409 minus_unit_mx() const
kono
parents:
diff changeset
410 {
kono
parents:
diff changeset
411 rot_mx result(*this);
kono
parents:
diff changeset
412 for (size_t i=0;i<9;i+=4) result[i] -= den_;
kono
parents:
diff changeset
413 return result;
kono
parents:
diff changeset
414 }
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 rot_mx
kono
parents:
diff changeset
417 operator-() const { return rot_mx(-num_, den_); }
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 int
kono
parents:
diff changeset
420 type() const;
kono
parents:
diff changeset
421
kono
parents:
diff changeset
422 int
kono
parents:
diff changeset
423 order(int type=0) const;
kono
parents:
diff changeset
424
kono
parents:
diff changeset
425 private:
kono
parents:
diff changeset
426 sg_mat3 num_;
kono
parents:
diff changeset
427 int den_;
kono
parents:
diff changeset
428 };
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 class rot_mx_info
kono
parents:
diff changeset
431 {
kono
parents:
diff changeset
432 public:
kono
parents:
diff changeset
433 rot_mx_info(rot_mx const& r);
kono
parents:
diff changeset
434
kono
parents:
diff changeset
435 int type() const { return type_; }
kono
parents:
diff changeset
436
kono
parents:
diff changeset
437 private:
kono
parents:
diff changeset
438 int type_;
kono
parents:
diff changeset
439 };
kono
parents:
diff changeset
440
kono
parents:
diff changeset
441 int rot_mx::type() const
kono
parents:
diff changeset
442 {
kono
parents:
diff changeset
443 int det = num_.determinant();
kono
parents:
diff changeset
444 if (det == -1 || det == 1) {
kono
parents:
diff changeset
445 switch (num_.trace()) {
kono
parents:
diff changeset
446 case -3: return -1;
kono
parents:
diff changeset
447 case -2: return -6;
kono
parents:
diff changeset
448 case -1: if (det == -1) return -4;
kono
parents:
diff changeset
449 else return 2;
kono
parents:
diff changeset
450 case 0: if (det == -1) return -3;
kono
parents:
diff changeset
451 else return 3;
kono
parents:
diff changeset
452 case 1: if (det == -1) return -2;
kono
parents:
diff changeset
453 else return 4;
kono
parents:
diff changeset
454 case 2: return 6;
kono
parents:
diff changeset
455 case 3: return 1;
kono
parents:
diff changeset
456 }
kono
parents:
diff changeset
457 }
kono
parents:
diff changeset
458 return 0;
kono
parents:
diff changeset
459 }
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 int rot_mx::order(int type) const
kono
parents:
diff changeset
462 {
kono
parents:
diff changeset
463 if (type == 0) type = rot_mx::type();
kono
parents:
diff changeset
464 if (type > 0) return type;
kono
parents:
diff changeset
465 if (type % 2) return -type * 2;
kono
parents:
diff changeset
466 return -type;
kono
parents:
diff changeset
467 }
kono
parents:
diff changeset
468
kono
parents:
diff changeset
469 rot_mx_info::rot_mx_info(rot_mx const& r)
kono
parents:
diff changeset
470 : type_(r.type())
kono
parents:
diff changeset
471 {
kono
parents:
diff changeset
472 if (type_ == 0) {
kono
parents:
diff changeset
473 return;
kono
parents:
diff changeset
474 }
kono
parents:
diff changeset
475 rot_mx proper_r = r;
kono
parents:
diff changeset
476 int proper_order = type_;
kono
parents:
diff changeset
477 // THE PROBLEM IS AROUND HERE
kono
parents:
diff changeset
478 if (proper_order < 0) {
kono
parents:
diff changeset
479 proper_order *= -1;
kono
parents:
diff changeset
480 proper_r = -proper_r; // THIS FAILS ...
kono
parents:
diff changeset
481 }
kono
parents:
diff changeset
482 if (proper_order > 1) {
kono
parents:
diff changeset
483 rot_mx rmi = proper_r.minus_unit_mx(); // ... THEREFORE WRONG HERE
kono
parents:
diff changeset
484 mat_ref<int> re_mx(rmi.num().begin(), 3, 3);
kono
parents:
diff changeset
485 if (form(re_mx) != 2) {
kono
parents:
diff changeset
486 type_ = 0;
kono
parents:
diff changeset
487 }
kono
parents:
diff changeset
488 }
kono
parents:
diff changeset
489 }
kono
parents:
diff changeset
490
kono
parents:
diff changeset
491 int main()
kono
parents:
diff changeset
492 {
kono
parents:
diff changeset
493 N1::tiny<int, 9> e;
kono
parents:
diff changeset
494 e[0] = 1; e[1] = 0; e[2] = 0;
kono
parents:
diff changeset
495 e[3] = 0; e[4] = -1; e[5] = 0;
kono
parents:
diff changeset
496 e[6] = 0; e[7] = 0; e[8] = 1;
kono
parents:
diff changeset
497 rot_mx r(e);
kono
parents:
diff changeset
498 rot_mx_info ri(r);
kono
parents:
diff changeset
499 if (ri.type() != -2)
kono
parents:
diff changeset
500 __builtin_abort ();
kono
parents:
diff changeset
501 return 0;
kono
parents:
diff changeset
502 }