Chris@16
|
1 // boost octonion.hpp header file
|
Chris@16
|
2
|
Chris@16
|
3 // (C) Copyright Hubert Holin 2001.
|
Chris@16
|
4 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
5 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
6 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7
|
Chris@16
|
8 // See http://www.boost.org for updates, documentation, and revision history.
|
Chris@16
|
9
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_OCTONION_HPP
|
Chris@16
|
12 #define BOOST_OCTONION_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <boost/math/quaternion.hpp>
|
Chris@16
|
15
|
Chris@16
|
16
|
Chris@16
|
17 namespace boost
|
Chris@16
|
18 {
|
Chris@16
|
19 namespace math
|
Chris@16
|
20 {
|
Chris@16
|
21
|
Chris@16
|
22 #define BOOST_OCTONION_ACCESSOR_GENERATOR(type) \
|
Chris@16
|
23 type real() const \
|
Chris@16
|
24 { \
|
Chris@16
|
25 return(a); \
|
Chris@16
|
26 } \
|
Chris@16
|
27 \
|
Chris@16
|
28 octonion<type> unreal() const \
|
Chris@16
|
29 { \
|
Chris@16
|
30 return( octonion<type>(static_cast<type>(0),b,c,d,e,f,g,h)); \
|
Chris@16
|
31 } \
|
Chris@16
|
32 \
|
Chris@16
|
33 type R_component_1() const \
|
Chris@16
|
34 { \
|
Chris@16
|
35 return(a); \
|
Chris@16
|
36 } \
|
Chris@16
|
37 \
|
Chris@16
|
38 type R_component_2() const \
|
Chris@16
|
39 { \
|
Chris@16
|
40 return(b); \
|
Chris@16
|
41 } \
|
Chris@16
|
42 \
|
Chris@16
|
43 type R_component_3() const \
|
Chris@16
|
44 { \
|
Chris@16
|
45 return(c); \
|
Chris@16
|
46 } \
|
Chris@16
|
47 \
|
Chris@16
|
48 type R_component_4() const \
|
Chris@16
|
49 { \
|
Chris@16
|
50 return(d); \
|
Chris@16
|
51 } \
|
Chris@16
|
52 \
|
Chris@16
|
53 type R_component_5() const \
|
Chris@16
|
54 { \
|
Chris@16
|
55 return(e); \
|
Chris@16
|
56 } \
|
Chris@16
|
57 \
|
Chris@16
|
58 type R_component_6() const \
|
Chris@16
|
59 { \
|
Chris@16
|
60 return(f); \
|
Chris@16
|
61 } \
|
Chris@16
|
62 \
|
Chris@16
|
63 type R_component_7() const \
|
Chris@16
|
64 { \
|
Chris@16
|
65 return(g); \
|
Chris@16
|
66 } \
|
Chris@16
|
67 \
|
Chris@16
|
68 type R_component_8() const \
|
Chris@16
|
69 { \
|
Chris@16
|
70 return(h); \
|
Chris@16
|
71 } \
|
Chris@16
|
72 \
|
Chris@16
|
73 ::std::complex<type> C_component_1() const \
|
Chris@16
|
74 { \
|
Chris@16
|
75 return(::std::complex<type>(a,b)); \
|
Chris@16
|
76 } \
|
Chris@16
|
77 \
|
Chris@16
|
78 ::std::complex<type> C_component_2() const \
|
Chris@16
|
79 { \
|
Chris@16
|
80 return(::std::complex<type>(c,d)); \
|
Chris@16
|
81 } \
|
Chris@16
|
82 \
|
Chris@16
|
83 ::std::complex<type> C_component_3() const \
|
Chris@16
|
84 { \
|
Chris@16
|
85 return(::std::complex<type>(e,f)); \
|
Chris@16
|
86 } \
|
Chris@16
|
87 \
|
Chris@16
|
88 ::std::complex<type> C_component_4() const \
|
Chris@16
|
89 { \
|
Chris@16
|
90 return(::std::complex<type>(g,h)); \
|
Chris@16
|
91 } \
|
Chris@16
|
92 \
|
Chris@16
|
93 ::boost::math::quaternion<type> H_component_1() const \
|
Chris@16
|
94 { \
|
Chris@16
|
95 return(::boost::math::quaternion<type>(a,b,c,d)); \
|
Chris@16
|
96 } \
|
Chris@16
|
97 \
|
Chris@16
|
98 ::boost::math::quaternion<type> H_component_2() const \
|
Chris@16
|
99 { \
|
Chris@16
|
100 return(::boost::math::quaternion<type>(e,f,g,h)); \
|
Chris@16
|
101 }
|
Chris@16
|
102
|
Chris@16
|
103
|
Chris@16
|
104 #define BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(type) \
|
Chris@16
|
105 template<typename X> \
|
Chris@16
|
106 octonion<type> & operator = (octonion<X> const & a_affecter) \
|
Chris@16
|
107 { \
|
Chris@16
|
108 a = static_cast<type>(a_affecter.R_component_1()); \
|
Chris@16
|
109 b = static_cast<type>(a_affecter.R_component_2()); \
|
Chris@16
|
110 c = static_cast<type>(a_affecter.R_component_3()); \
|
Chris@16
|
111 d = static_cast<type>(a_affecter.R_component_4()); \
|
Chris@16
|
112 e = static_cast<type>(a_affecter.R_component_5()); \
|
Chris@16
|
113 f = static_cast<type>(a_affecter.R_component_6()); \
|
Chris@16
|
114 g = static_cast<type>(a_affecter.R_component_7()); \
|
Chris@16
|
115 h = static_cast<type>(a_affecter.R_component_8()); \
|
Chris@16
|
116 \
|
Chris@16
|
117 return(*this); \
|
Chris@16
|
118 } \
|
Chris@16
|
119 \
|
Chris@16
|
120 octonion<type> & operator = (octonion<type> const & a_affecter) \
|
Chris@16
|
121 { \
|
Chris@16
|
122 a = a_affecter.a; \
|
Chris@16
|
123 b = a_affecter.b; \
|
Chris@16
|
124 c = a_affecter.c; \
|
Chris@16
|
125 d = a_affecter.d; \
|
Chris@16
|
126 e = a_affecter.e; \
|
Chris@16
|
127 f = a_affecter.f; \
|
Chris@16
|
128 g = a_affecter.g; \
|
Chris@16
|
129 h = a_affecter.h; \
|
Chris@16
|
130 \
|
Chris@16
|
131 return(*this); \
|
Chris@16
|
132 } \
|
Chris@16
|
133 \
|
Chris@16
|
134 octonion<type> & operator = (type const & a_affecter) \
|
Chris@16
|
135 { \
|
Chris@16
|
136 a = a_affecter; \
|
Chris@16
|
137 \
|
Chris@16
|
138 b = c = d = e = f= g = h = static_cast<type>(0); \
|
Chris@16
|
139 \
|
Chris@16
|
140 return(*this); \
|
Chris@16
|
141 } \
|
Chris@16
|
142 \
|
Chris@16
|
143 octonion<type> & operator = (::std::complex<type> const & a_affecter) \
|
Chris@16
|
144 { \
|
Chris@16
|
145 a = a_affecter.real(); \
|
Chris@16
|
146 b = a_affecter.imag(); \
|
Chris@16
|
147 \
|
Chris@16
|
148 c = d = e = f = g = h = static_cast<type>(0); \
|
Chris@16
|
149 \
|
Chris@16
|
150 return(*this); \
|
Chris@16
|
151 } \
|
Chris@16
|
152 \
|
Chris@16
|
153 octonion<type> & operator = (::boost::math::quaternion<type> const & a_affecter) \
|
Chris@16
|
154 { \
|
Chris@16
|
155 a = a_affecter.R_component_1(); \
|
Chris@16
|
156 b = a_affecter.R_component_2(); \
|
Chris@16
|
157 c = a_affecter.R_component_3(); \
|
Chris@16
|
158 d = a_affecter.R_component_4(); \
|
Chris@16
|
159 \
|
Chris@16
|
160 e = f = g = h = static_cast<type>(0); \
|
Chris@16
|
161 \
|
Chris@16
|
162 return(*this); \
|
Chris@16
|
163 }
|
Chris@16
|
164
|
Chris@16
|
165
|
Chris@16
|
166 #define BOOST_OCTONION_MEMBER_DATA_GENERATOR(type) \
|
Chris@16
|
167 type a; \
|
Chris@16
|
168 type b; \
|
Chris@16
|
169 type c; \
|
Chris@16
|
170 type d; \
|
Chris@16
|
171 type e; \
|
Chris@16
|
172 type f; \
|
Chris@16
|
173 type g; \
|
Chris@16
|
174 type h; \
|
Chris@16
|
175
|
Chris@16
|
176
|
Chris@16
|
177 template<typename T>
|
Chris@16
|
178 class octonion
|
Chris@16
|
179 {
|
Chris@16
|
180 public:
|
Chris@16
|
181
|
Chris@16
|
182 typedef T value_type;
|
Chris@16
|
183
|
Chris@16
|
184 // constructor for O seen as R^8
|
Chris@16
|
185 // (also default constructor)
|
Chris@16
|
186
|
Chris@16
|
187 explicit octonion( T const & requested_a = T(),
|
Chris@16
|
188 T const & requested_b = T(),
|
Chris@16
|
189 T const & requested_c = T(),
|
Chris@16
|
190 T const & requested_d = T(),
|
Chris@16
|
191 T const & requested_e = T(),
|
Chris@16
|
192 T const & requested_f = T(),
|
Chris@16
|
193 T const & requested_g = T(),
|
Chris@16
|
194 T const & requested_h = T())
|
Chris@16
|
195 : a(requested_a),
|
Chris@16
|
196 b(requested_b),
|
Chris@16
|
197 c(requested_c),
|
Chris@16
|
198 d(requested_d),
|
Chris@16
|
199 e(requested_e),
|
Chris@16
|
200 f(requested_f),
|
Chris@16
|
201 g(requested_g),
|
Chris@16
|
202 h(requested_h)
|
Chris@16
|
203 {
|
Chris@16
|
204 // nothing to do!
|
Chris@16
|
205 }
|
Chris@16
|
206
|
Chris@16
|
207
|
Chris@16
|
208 // constructor for H seen as C^4
|
Chris@16
|
209
|
Chris@16
|
210 explicit octonion( ::std::complex<T> const & z0,
|
Chris@16
|
211 ::std::complex<T> const & z1 = ::std::complex<T>(),
|
Chris@16
|
212 ::std::complex<T> const & z2 = ::std::complex<T>(),
|
Chris@16
|
213 ::std::complex<T> const & z3 = ::std::complex<T>())
|
Chris@16
|
214 : a(z0.real()),
|
Chris@16
|
215 b(z0.imag()),
|
Chris@16
|
216 c(z1.real()),
|
Chris@16
|
217 d(z1.imag()),
|
Chris@16
|
218 e(z2.real()),
|
Chris@16
|
219 f(z2.imag()),
|
Chris@16
|
220 g(z3.real()),
|
Chris@16
|
221 h(z3.imag())
|
Chris@16
|
222 {
|
Chris@16
|
223 // nothing to do!
|
Chris@16
|
224 }
|
Chris@16
|
225
|
Chris@16
|
226
|
Chris@16
|
227 // constructor for O seen as H^2
|
Chris@16
|
228
|
Chris@16
|
229 explicit octonion( ::boost::math::quaternion<T> const & q0,
|
Chris@16
|
230 ::boost::math::quaternion<T> const & q1 = ::boost::math::quaternion<T>())
|
Chris@16
|
231 : a(q0.R_component_1()),
|
Chris@16
|
232 b(q0.R_component_2()),
|
Chris@16
|
233 c(q0.R_component_3()),
|
Chris@16
|
234 d(q0.R_component_4()),
|
Chris@16
|
235 e(q1.R_component_1()),
|
Chris@16
|
236 f(q1.R_component_2()),
|
Chris@16
|
237 g(q1.R_component_3()),
|
Chris@16
|
238 h(q1.R_component_4())
|
Chris@16
|
239 {
|
Chris@16
|
240 // nothing to do!
|
Chris@16
|
241 }
|
Chris@16
|
242
|
Chris@16
|
243
|
Chris@16
|
244 // UNtemplated copy constructor
|
Chris@16
|
245 // (this is taken care of by the compiler itself)
|
Chris@16
|
246
|
Chris@16
|
247
|
Chris@16
|
248 // templated copy constructor
|
Chris@16
|
249
|
Chris@16
|
250 template<typename X>
|
Chris@16
|
251 explicit octonion(octonion<X> const & a_recopier)
|
Chris@16
|
252 : a(static_cast<T>(a_recopier.R_component_1())),
|
Chris@16
|
253 b(static_cast<T>(a_recopier.R_component_2())),
|
Chris@16
|
254 c(static_cast<T>(a_recopier.R_component_3())),
|
Chris@16
|
255 d(static_cast<T>(a_recopier.R_component_4())),
|
Chris@16
|
256 e(static_cast<T>(a_recopier.R_component_5())),
|
Chris@16
|
257 f(static_cast<T>(a_recopier.R_component_6())),
|
Chris@16
|
258 g(static_cast<T>(a_recopier.R_component_7())),
|
Chris@16
|
259 h(static_cast<T>(a_recopier.R_component_8()))
|
Chris@16
|
260 {
|
Chris@16
|
261 // nothing to do!
|
Chris@16
|
262 }
|
Chris@16
|
263
|
Chris@16
|
264
|
Chris@16
|
265 // destructor
|
Chris@16
|
266 // (this is taken care of by the compiler itself)
|
Chris@16
|
267
|
Chris@16
|
268
|
Chris@16
|
269 // accessors
|
Chris@16
|
270 //
|
Chris@16
|
271 // Note: Like complex number, octonions do have a meaningful notion of "real part",
|
Chris@16
|
272 // but unlike them there is no meaningful notion of "imaginary part".
|
Chris@16
|
273 // Instead there is an "unreal part" which itself is an octonion, and usually
|
Chris@16
|
274 // nothing simpler (as opposed to the complex number case).
|
Chris@16
|
275 // However, for practicallity, there are accessors for the other components
|
Chris@16
|
276 // (these are necessary for the templated copy constructor, for instance).
|
Chris@16
|
277
|
Chris@16
|
278 BOOST_OCTONION_ACCESSOR_GENERATOR(T)
|
Chris@16
|
279
|
Chris@16
|
280 // assignment operators
|
Chris@16
|
281
|
Chris@16
|
282 BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(T)
|
Chris@16
|
283
|
Chris@16
|
284 // other assignment-related operators
|
Chris@16
|
285 //
|
Chris@16
|
286 // NOTE: Octonion multiplication is *NOT* commutative;
|
Chris@16
|
287 // symbolically, "q *= rhs;" means "q = q * rhs;"
|
Chris@16
|
288 // and "q /= rhs;" means "q = q * inverse_of(rhs);";
|
Chris@16
|
289 // octonion multiplication is also *NOT* associative
|
Chris@16
|
290
|
Chris@16
|
291 octonion<T> & operator += (T const & rhs)
|
Chris@16
|
292 {
|
Chris@16
|
293 T at = a + rhs; // exception guard
|
Chris@16
|
294
|
Chris@16
|
295 a = at;
|
Chris@16
|
296
|
Chris@16
|
297 return(*this);
|
Chris@16
|
298 }
|
Chris@16
|
299
|
Chris@16
|
300
|
Chris@16
|
301 octonion<T> & operator += (::std::complex<T> const & rhs)
|
Chris@16
|
302 {
|
Chris@16
|
303 T at = a + rhs.real(); // exception guard
|
Chris@16
|
304 T bt = b + rhs.imag(); // exception guard
|
Chris@16
|
305
|
Chris@16
|
306 a = at;
|
Chris@16
|
307 b = bt;
|
Chris@16
|
308
|
Chris@16
|
309 return(*this);
|
Chris@16
|
310 }
|
Chris@16
|
311
|
Chris@16
|
312
|
Chris@16
|
313 octonion<T> & operator += (::boost::math::quaternion<T> const & rhs)
|
Chris@16
|
314 {
|
Chris@16
|
315 T at = a + rhs.R_component_1(); // exception guard
|
Chris@16
|
316 T bt = b + rhs.R_component_2(); // exception guard
|
Chris@16
|
317 T ct = c + rhs.R_component_3(); // exception guard
|
Chris@16
|
318 T dt = d + rhs.R_component_4(); // exception guard
|
Chris@16
|
319
|
Chris@16
|
320 a = at;
|
Chris@16
|
321 b = bt;
|
Chris@16
|
322 c = ct;
|
Chris@16
|
323 d = dt;
|
Chris@16
|
324
|
Chris@16
|
325 return(*this);
|
Chris@16
|
326 }
|
Chris@16
|
327
|
Chris@16
|
328
|
Chris@16
|
329 template<typename X>
|
Chris@16
|
330 octonion<T> & operator += (octonion<X> const & rhs)
|
Chris@16
|
331 {
|
Chris@16
|
332 T at = a + static_cast<T>(rhs.R_component_1()); // exception guard
|
Chris@16
|
333 T bt = b + static_cast<T>(rhs.R_component_2()); // exception guard
|
Chris@16
|
334 T ct = c + static_cast<T>(rhs.R_component_3()); // exception guard
|
Chris@16
|
335 T dt = d + static_cast<T>(rhs.R_component_4()); // exception guard
|
Chris@16
|
336 T et = e + static_cast<T>(rhs.R_component_5()); // exception guard
|
Chris@16
|
337 T ft = f + static_cast<T>(rhs.R_component_6()); // exception guard
|
Chris@16
|
338 T gt = g + static_cast<T>(rhs.R_component_7()); // exception guard
|
Chris@16
|
339 T ht = h + static_cast<T>(rhs.R_component_8()); // exception guard
|
Chris@16
|
340
|
Chris@16
|
341 a = at;
|
Chris@16
|
342 b = bt;
|
Chris@16
|
343 c = ct;
|
Chris@16
|
344 d = dt;
|
Chris@16
|
345 e = et;
|
Chris@16
|
346 f = ft;
|
Chris@16
|
347 g = gt;
|
Chris@16
|
348 h = ht;
|
Chris@16
|
349
|
Chris@16
|
350 return(*this);
|
Chris@16
|
351 }
|
Chris@16
|
352
|
Chris@16
|
353
|
Chris@16
|
354
|
Chris@16
|
355 octonion<T> & operator -= (T const & rhs)
|
Chris@16
|
356 {
|
Chris@16
|
357 T at = a - rhs; // exception guard
|
Chris@16
|
358
|
Chris@16
|
359 a = at;
|
Chris@16
|
360
|
Chris@16
|
361 return(*this);
|
Chris@16
|
362 }
|
Chris@16
|
363
|
Chris@16
|
364
|
Chris@16
|
365 octonion<T> & operator -= (::std::complex<T> const & rhs)
|
Chris@16
|
366 {
|
Chris@16
|
367 T at = a - rhs.real(); // exception guard
|
Chris@16
|
368 T bt = b - rhs.imag(); // exception guard
|
Chris@16
|
369
|
Chris@16
|
370 a = at;
|
Chris@16
|
371 b = bt;
|
Chris@16
|
372
|
Chris@16
|
373 return(*this);
|
Chris@16
|
374 }
|
Chris@16
|
375
|
Chris@16
|
376
|
Chris@16
|
377 octonion<T> & operator -= (::boost::math::quaternion<T> const & rhs)
|
Chris@16
|
378 {
|
Chris@16
|
379 T at = a - rhs.R_component_1(); // exception guard
|
Chris@16
|
380 T bt = b - rhs.R_component_2(); // exception guard
|
Chris@16
|
381 T ct = c - rhs.R_component_3(); // exception guard
|
Chris@16
|
382 T dt = d - rhs.R_component_4(); // exception guard
|
Chris@16
|
383
|
Chris@16
|
384 a = at;
|
Chris@16
|
385 b = bt;
|
Chris@16
|
386 c = ct;
|
Chris@16
|
387 d = dt;
|
Chris@16
|
388
|
Chris@16
|
389 return(*this);
|
Chris@16
|
390 }
|
Chris@16
|
391
|
Chris@16
|
392
|
Chris@16
|
393 template<typename X>
|
Chris@16
|
394 octonion<T> & operator -= (octonion<X> const & rhs)
|
Chris@16
|
395 {
|
Chris@16
|
396 T at = a - static_cast<T>(rhs.R_component_1()); // exception guard
|
Chris@16
|
397 T bt = b - static_cast<T>(rhs.R_component_2()); // exception guard
|
Chris@16
|
398 T ct = c - static_cast<T>(rhs.R_component_3()); // exception guard
|
Chris@16
|
399 T dt = d - static_cast<T>(rhs.R_component_4()); // exception guard
|
Chris@16
|
400 T et = e - static_cast<T>(rhs.R_component_5()); // exception guard
|
Chris@16
|
401 T ft = f - static_cast<T>(rhs.R_component_6()); // exception guard
|
Chris@16
|
402 T gt = g - static_cast<T>(rhs.R_component_7()); // exception guard
|
Chris@16
|
403 T ht = h - static_cast<T>(rhs.R_component_8()); // exception guard
|
Chris@16
|
404
|
Chris@16
|
405 a = at;
|
Chris@16
|
406 b = bt;
|
Chris@16
|
407 c = ct;
|
Chris@16
|
408 d = dt;
|
Chris@16
|
409 e = et;
|
Chris@16
|
410 f = ft;
|
Chris@16
|
411 g = gt;
|
Chris@16
|
412 h = ht;
|
Chris@16
|
413
|
Chris@16
|
414 return(*this);
|
Chris@16
|
415 }
|
Chris@16
|
416
|
Chris@16
|
417
|
Chris@16
|
418 octonion<T> & operator *= (T const & rhs)
|
Chris@16
|
419 {
|
Chris@16
|
420 T at = a * rhs; // exception guard
|
Chris@16
|
421 T bt = b * rhs; // exception guard
|
Chris@16
|
422 T ct = c * rhs; // exception guard
|
Chris@16
|
423 T dt = d * rhs; // exception guard
|
Chris@16
|
424 T et = e * rhs; // exception guard
|
Chris@16
|
425 T ft = f * rhs; // exception guard
|
Chris@16
|
426 T gt = g * rhs; // exception guard
|
Chris@16
|
427 T ht = h * rhs; // exception guard
|
Chris@16
|
428
|
Chris@16
|
429 a = at;
|
Chris@16
|
430 b = bt;
|
Chris@16
|
431 c = ct;
|
Chris@16
|
432 d = dt;
|
Chris@16
|
433 e = et;
|
Chris@16
|
434 f = ft;
|
Chris@16
|
435 g = gt;
|
Chris@16
|
436 h = ht;
|
Chris@16
|
437
|
Chris@16
|
438 return(*this);
|
Chris@16
|
439 }
|
Chris@16
|
440
|
Chris@16
|
441
|
Chris@16
|
442 octonion<T> & operator *= (::std::complex<T> const & rhs)
|
Chris@16
|
443 {
|
Chris@16
|
444 T ar = rhs.real();
|
Chris@16
|
445 T br = rhs.imag();
|
Chris@16
|
446
|
Chris@16
|
447 T at = +a*ar-b*br;
|
Chris@16
|
448 T bt = +a*br+b*ar;
|
Chris@16
|
449 T ct = +c*ar+d*br;
|
Chris@16
|
450 T dt = -c*br+d*ar;
|
Chris@16
|
451 T et = +e*ar+f*br;
|
Chris@16
|
452 T ft = -e*br+f*ar;
|
Chris@16
|
453 T gt = +g*ar-h*br;
|
Chris@16
|
454 T ht = +g*br+h*ar;
|
Chris@16
|
455
|
Chris@16
|
456 a = at;
|
Chris@16
|
457 b = bt;
|
Chris@16
|
458 c = ct;
|
Chris@16
|
459 d = dt;
|
Chris@16
|
460 e = et;
|
Chris@16
|
461 f = ft;
|
Chris@16
|
462 g = gt;
|
Chris@16
|
463 h = ht;
|
Chris@16
|
464
|
Chris@16
|
465 return(*this);
|
Chris@16
|
466 }
|
Chris@16
|
467
|
Chris@16
|
468
|
Chris@16
|
469 octonion<T> & operator *= (::boost::math::quaternion<T> const & rhs)
|
Chris@16
|
470 {
|
Chris@16
|
471 T ar = rhs.R_component_1();
|
Chris@16
|
472 T br = rhs.R_component_2();
|
Chris@16
|
473 T cr = rhs.R_component_2();
|
Chris@16
|
474 T dr = rhs.R_component_2();
|
Chris@16
|
475
|
Chris@16
|
476 T at = +a*ar-b*br-c*cr-d*dr;
|
Chris@16
|
477 T bt = +a*br+b*ar+c*dr-d*cr;
|
Chris@16
|
478 T ct = +a*cr-b*dr+c*ar+d*br;
|
Chris@16
|
479 T dt = +a*dr+b*cr-c*br+d*ar;
|
Chris@16
|
480 T et = +e*ar+f*br+g*cr+h*dr;
|
Chris@16
|
481 T ft = -e*br+f*ar-g*dr+h*cr;
|
Chris@16
|
482 T gt = -e*cr+f*dr+g*ar-h*br;
|
Chris@16
|
483 T ht = -e*dr-f*cr+g*br+h*ar;
|
Chris@16
|
484
|
Chris@16
|
485 a = at;
|
Chris@16
|
486 b = bt;
|
Chris@16
|
487 c = ct;
|
Chris@16
|
488 d = dt;
|
Chris@16
|
489 e = et;
|
Chris@16
|
490 f = ft;
|
Chris@16
|
491 g = gt;
|
Chris@16
|
492 h = ht;
|
Chris@16
|
493
|
Chris@16
|
494 return(*this);
|
Chris@16
|
495 }
|
Chris@16
|
496
|
Chris@16
|
497
|
Chris@16
|
498 template<typename X>
|
Chris@16
|
499 octonion<T> & operator *= (octonion<X> const & rhs)
|
Chris@16
|
500 {
|
Chris@16
|
501 T ar = static_cast<T>(rhs.R_component_1());
|
Chris@16
|
502 T br = static_cast<T>(rhs.R_component_2());
|
Chris@16
|
503 T cr = static_cast<T>(rhs.R_component_3());
|
Chris@16
|
504 T dr = static_cast<T>(rhs.R_component_4());
|
Chris@16
|
505 T er = static_cast<T>(rhs.R_component_5());
|
Chris@16
|
506 T fr = static_cast<T>(rhs.R_component_6());
|
Chris@16
|
507 T gr = static_cast<T>(rhs.R_component_7());
|
Chris@16
|
508 T hr = static_cast<T>(rhs.R_component_8());
|
Chris@16
|
509
|
Chris@16
|
510 T at = +a*ar-b*br-c*cr-d*dr-e*er-f*fr-g*gr-h*hr;
|
Chris@16
|
511 T bt = +a*br+b*ar+c*dr-d*cr+e*fr-f*er-g*hr+h*gr;
|
Chris@16
|
512 T ct = +a*cr-b*dr+c*ar+d*br+e*gr+f*hr-g*er-h*fr;
|
Chris@16
|
513 T dt = +a*dr+b*cr-c*br+d*ar+e*hr-f*gr+g*fr-h*er;
|
Chris@16
|
514 T et = +a*er-b*fr-c*gr-d*hr+e*ar+f*br+g*cr+h*dr;
|
Chris@16
|
515 T ft = +a*fr+b*er-c*hr+d*gr-e*br+f*ar-g*dr+h*cr;
|
Chris@16
|
516 T gt = +a*gr+b*hr+c*er-d*fr-e*cr+f*dr+g*ar-h*br;
|
Chris@16
|
517 T ht = +a*hr-b*gr+c*fr+d*er-e*dr-f*cr+g*br+h*ar;
|
Chris@16
|
518
|
Chris@16
|
519 a = at;
|
Chris@16
|
520 b = bt;
|
Chris@16
|
521 c = ct;
|
Chris@16
|
522 d = dt;
|
Chris@16
|
523 e = et;
|
Chris@16
|
524 f = ft;
|
Chris@16
|
525 g = gt;
|
Chris@16
|
526 h = ht;
|
Chris@16
|
527
|
Chris@16
|
528 return(*this);
|
Chris@16
|
529 }
|
Chris@16
|
530
|
Chris@16
|
531
|
Chris@16
|
532 octonion<T> & operator /= (T const & rhs)
|
Chris@16
|
533 {
|
Chris@16
|
534 T at = a / rhs; // exception guard
|
Chris@16
|
535 T bt = b / rhs; // exception guard
|
Chris@16
|
536 T ct = c / rhs; // exception guard
|
Chris@16
|
537 T dt = d / rhs; // exception guard
|
Chris@16
|
538 T et = e / rhs; // exception guard
|
Chris@16
|
539 T ft = f / rhs; // exception guard
|
Chris@16
|
540 T gt = g / rhs; // exception guard
|
Chris@16
|
541 T ht = h / rhs; // exception guard
|
Chris@16
|
542
|
Chris@16
|
543 a = at;
|
Chris@16
|
544 b = bt;
|
Chris@16
|
545 c = ct;
|
Chris@16
|
546 d = dt;
|
Chris@16
|
547 e = et;
|
Chris@16
|
548 f = ft;
|
Chris@16
|
549 g = gt;
|
Chris@16
|
550 h = ht;
|
Chris@16
|
551
|
Chris@16
|
552 return(*this);
|
Chris@16
|
553 }
|
Chris@16
|
554
|
Chris@16
|
555
|
Chris@16
|
556 octonion<T> & operator /= (::std::complex<T> const & rhs)
|
Chris@16
|
557 {
|
Chris@16
|
558 T ar = rhs.real();
|
Chris@16
|
559 T br = rhs.imag();
|
Chris@16
|
560
|
Chris@16
|
561 T denominator = ar*ar+br*br;
|
Chris@16
|
562
|
Chris@16
|
563 T at = (+a*ar-b*br)/denominator;
|
Chris@16
|
564 T bt = (-a*br+b*ar)/denominator;
|
Chris@16
|
565 T ct = (+c*ar-d*br)/denominator;
|
Chris@16
|
566 T dt = (+c*br+d*ar)/denominator;
|
Chris@16
|
567 T et = (+e*ar-f*br)/denominator;
|
Chris@16
|
568 T ft = (+e*br+f*ar)/denominator;
|
Chris@16
|
569 T gt = (+g*ar+h*br)/denominator;
|
Chris@16
|
570 T ht = (+g*br+h*ar)/denominator;
|
Chris@16
|
571
|
Chris@16
|
572 a = at;
|
Chris@16
|
573 b = bt;
|
Chris@16
|
574 c = ct;
|
Chris@16
|
575 d = dt;
|
Chris@16
|
576 e = et;
|
Chris@16
|
577 f = ft;
|
Chris@16
|
578 g = gt;
|
Chris@16
|
579 h = ht;
|
Chris@16
|
580
|
Chris@16
|
581 return(*this);
|
Chris@16
|
582 }
|
Chris@16
|
583
|
Chris@16
|
584
|
Chris@16
|
585 octonion<T> & operator /= (::boost::math::quaternion<T> const & rhs)
|
Chris@16
|
586 {
|
Chris@16
|
587 T ar = rhs.R_component_1();
|
Chris@16
|
588 T br = rhs.R_component_2();
|
Chris@16
|
589 T cr = rhs.R_component_2();
|
Chris@16
|
590 T dr = rhs.R_component_2();
|
Chris@16
|
591
|
Chris@16
|
592 T denominator = ar*ar+br*br+cr*cr+dr*dr;
|
Chris@16
|
593
|
Chris@16
|
594 T at = (+a*ar+b*br+c*cr+d*dr)/denominator;
|
Chris@16
|
595 T bt = (-a*br+b*ar-c*dr+d*cr)/denominator;
|
Chris@16
|
596 T ct = (-a*cr+b*dr+c*ar-d*br)/denominator;
|
Chris@16
|
597 T dt = (-a*dr-b*cr+c*br+d*ar)/denominator;
|
Chris@16
|
598 T et = (+e*ar-f*br-g*cr-h*dr)/denominator;
|
Chris@16
|
599 T ft = (+e*br+f*ar+g*dr-h*cr)/denominator;
|
Chris@16
|
600 T gt = (+e*cr-f*dr+g*ar+h*br)/denominator;
|
Chris@16
|
601 T ht = (+e*dr+f*cr-g*br+h*ar)/denominator;
|
Chris@16
|
602
|
Chris@16
|
603 a = at;
|
Chris@16
|
604 b = bt;
|
Chris@16
|
605 c = ct;
|
Chris@16
|
606 d = dt;
|
Chris@16
|
607 e = et;
|
Chris@16
|
608 f = ft;
|
Chris@16
|
609 g = gt;
|
Chris@16
|
610 h = ht;
|
Chris@16
|
611
|
Chris@16
|
612 return(*this);
|
Chris@16
|
613 }
|
Chris@16
|
614
|
Chris@16
|
615
|
Chris@16
|
616 template<typename X>
|
Chris@16
|
617 octonion<T> & operator /= (octonion<X> const & rhs)
|
Chris@16
|
618 {
|
Chris@16
|
619 T ar = static_cast<T>(rhs.R_component_1());
|
Chris@16
|
620 T br = static_cast<T>(rhs.R_component_2());
|
Chris@16
|
621 T cr = static_cast<T>(rhs.R_component_3());
|
Chris@16
|
622 T dr = static_cast<T>(rhs.R_component_4());
|
Chris@16
|
623 T er = static_cast<T>(rhs.R_component_5());
|
Chris@16
|
624 T fr = static_cast<T>(rhs.R_component_6());
|
Chris@16
|
625 T gr = static_cast<T>(rhs.R_component_7());
|
Chris@16
|
626 T hr = static_cast<T>(rhs.R_component_8());
|
Chris@16
|
627
|
Chris@16
|
628 T denominator = ar*ar+br*br+cr*cr+dr*dr+er*er+fr*fr+gr*gr+hr*hr;
|
Chris@16
|
629
|
Chris@16
|
630 T at = (+a*ar+b*br+c*cr+d*dr+e*er+f*fr+g*gr+h*hr)/denominator;
|
Chris@16
|
631 T bt = (-a*br+b*ar-c*dr+d*cr-e*fr+f*er+g*hr-h*gr)/denominator;
|
Chris@16
|
632 T ct = (-a*cr+b*dr+c*ar-d*br-e*gr-f*hr+g*er+h*fr)/denominator;
|
Chris@16
|
633 T dt = (-a*dr-b*cr+c*br+d*ar-e*hr+f*gr-g*fr+h*er)/denominator;
|
Chris@16
|
634 T et = (-a*er+b*fr+c*gr+d*hr+e*ar-f*br-g*cr-h*dr)/denominator;
|
Chris@16
|
635 T ft = (-a*fr-b*er+c*hr-d*gr+e*br+f*ar+g*dr-h*cr)/denominator;
|
Chris@16
|
636 T gt = (-a*gr-b*hr-c*er+d*fr+e*cr-f*dr+g*ar+h*br)/denominator;
|
Chris@16
|
637 T ht = (-a*hr+b*gr-c*fr-d*er+e*dr+f*cr-g*br+h*ar)/denominator;
|
Chris@16
|
638
|
Chris@16
|
639 a = at;
|
Chris@16
|
640 b = bt;
|
Chris@16
|
641 c = ct;
|
Chris@16
|
642 d = dt;
|
Chris@16
|
643 e = et;
|
Chris@16
|
644 f = ft;
|
Chris@16
|
645 g = gt;
|
Chris@16
|
646 h = ht;
|
Chris@16
|
647
|
Chris@16
|
648 return(*this);
|
Chris@16
|
649 }
|
Chris@16
|
650
|
Chris@16
|
651
|
Chris@16
|
652 protected:
|
Chris@16
|
653
|
Chris@16
|
654 BOOST_OCTONION_MEMBER_DATA_GENERATOR(T)
|
Chris@16
|
655
|
Chris@16
|
656
|
Chris@16
|
657 private:
|
Chris@16
|
658
|
Chris@16
|
659 };
|
Chris@16
|
660
|
Chris@16
|
661
|
Chris@16
|
662 // declaration of octonion specialization
|
Chris@16
|
663
|
Chris@16
|
664 template<> class octonion<float>;
|
Chris@16
|
665 template<> class octonion<double>;
|
Chris@16
|
666 template<> class octonion<long double>;
|
Chris@16
|
667
|
Chris@16
|
668
|
Chris@16
|
669 // helper templates for converting copy constructors (declaration)
|
Chris@16
|
670
|
Chris@16
|
671 namespace detail
|
Chris@16
|
672 {
|
Chris@16
|
673
|
Chris@16
|
674 template< typename T,
|
Chris@16
|
675 typename U
|
Chris@16
|
676 >
|
Chris@16
|
677 octonion<T> octonion_type_converter(octonion<U> const & rhs);
|
Chris@16
|
678 }
|
Chris@16
|
679
|
Chris@16
|
680
|
Chris@16
|
681 // implementation of octonion specialization
|
Chris@16
|
682
|
Chris@16
|
683
|
Chris@16
|
684 #define BOOST_OCTONION_CONSTRUCTOR_GENERATOR(type) \
|
Chris@16
|
685 explicit octonion( type const & requested_a = static_cast<type>(0), \
|
Chris@16
|
686 type const & requested_b = static_cast<type>(0), \
|
Chris@16
|
687 type const & requested_c = static_cast<type>(0), \
|
Chris@16
|
688 type const & requested_d = static_cast<type>(0), \
|
Chris@16
|
689 type const & requested_e = static_cast<type>(0), \
|
Chris@16
|
690 type const & requested_f = static_cast<type>(0), \
|
Chris@16
|
691 type const & requested_g = static_cast<type>(0), \
|
Chris@16
|
692 type const & requested_h = static_cast<type>(0)) \
|
Chris@16
|
693 : a(requested_a), \
|
Chris@16
|
694 b(requested_b), \
|
Chris@16
|
695 c(requested_c), \
|
Chris@16
|
696 d(requested_d), \
|
Chris@16
|
697 e(requested_e), \
|
Chris@16
|
698 f(requested_f), \
|
Chris@16
|
699 g(requested_g), \
|
Chris@16
|
700 h(requested_h) \
|
Chris@16
|
701 { \
|
Chris@16
|
702 } \
|
Chris@16
|
703 \
|
Chris@16
|
704 explicit octonion( ::std::complex<type> const & z0, \
|
Chris@16
|
705 ::std::complex<type> const & z1 = ::std::complex<type>(), \
|
Chris@16
|
706 ::std::complex<type> const & z2 = ::std::complex<type>(), \
|
Chris@16
|
707 ::std::complex<type> const & z3 = ::std::complex<type>()) \
|
Chris@16
|
708 : a(z0.real()), \
|
Chris@16
|
709 b(z0.imag()), \
|
Chris@16
|
710 c(z1.real()), \
|
Chris@16
|
711 d(z1.imag()), \
|
Chris@16
|
712 e(z2.real()), \
|
Chris@16
|
713 f(z2.imag()), \
|
Chris@16
|
714 g(z3.real()), \
|
Chris@16
|
715 h(z3.imag()) \
|
Chris@16
|
716 { \
|
Chris@16
|
717 } \
|
Chris@16
|
718 \
|
Chris@16
|
719 explicit octonion( ::boost::math::quaternion<type> const & q0, \
|
Chris@16
|
720 ::boost::math::quaternion<type> const & q1 = ::boost::math::quaternion<type>()) \
|
Chris@16
|
721 : a(q0.R_component_1()), \
|
Chris@16
|
722 b(q0.R_component_2()), \
|
Chris@16
|
723 c(q0.R_component_3()), \
|
Chris@16
|
724 d(q0.R_component_4()), \
|
Chris@16
|
725 e(q1.R_component_1()), \
|
Chris@16
|
726 f(q1.R_component_2()), \
|
Chris@16
|
727 g(q1.R_component_3()), \
|
Chris@16
|
728 h(q1.R_component_4()) \
|
Chris@16
|
729 { \
|
Chris@16
|
730 }
|
Chris@16
|
731
|
Chris@16
|
732
|
Chris@16
|
733 #define BOOST_OCTONION_MEMBER_ADD_GENERATOR_1(type) \
|
Chris@16
|
734 octonion<type> & operator += (type const & rhs) \
|
Chris@16
|
735 { \
|
Chris@16
|
736 a += rhs; \
|
Chris@16
|
737 \
|
Chris@16
|
738 return(*this); \
|
Chris@16
|
739 }
|
Chris@16
|
740
|
Chris@16
|
741 #define BOOST_OCTONION_MEMBER_ADD_GENERATOR_2(type) \
|
Chris@16
|
742 octonion<type> & operator += (::std::complex<type> const & rhs) \
|
Chris@16
|
743 { \
|
Chris@16
|
744 a += rhs.real(); \
|
Chris@16
|
745 b += rhs.imag(); \
|
Chris@16
|
746 \
|
Chris@16
|
747 return(*this); \
|
Chris@16
|
748 }
|
Chris@16
|
749
|
Chris@16
|
750 #define BOOST_OCTONION_MEMBER_ADD_GENERATOR_3(type) \
|
Chris@16
|
751 octonion<type> & operator += (::boost::math::quaternion<type> const & rhs) \
|
Chris@16
|
752 { \
|
Chris@16
|
753 a += rhs.R_component_1(); \
|
Chris@16
|
754 b += rhs.R_component_2(); \
|
Chris@16
|
755 c += rhs.R_component_3(); \
|
Chris@16
|
756 d += rhs.R_component_4(); \
|
Chris@16
|
757 \
|
Chris@16
|
758 return(*this); \
|
Chris@16
|
759 }
|
Chris@16
|
760
|
Chris@16
|
761 #define BOOST_OCTONION_MEMBER_ADD_GENERATOR_4(type) \
|
Chris@16
|
762 template<typename X> \
|
Chris@16
|
763 octonion<type> & operator += (octonion<X> const & rhs) \
|
Chris@16
|
764 { \
|
Chris@16
|
765 a += static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
766 b += static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
767 c += static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
768 d += static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
769 e += static_cast<type>(rhs.R_component_5()); \
|
Chris@16
|
770 f += static_cast<type>(rhs.R_component_6()); \
|
Chris@16
|
771 g += static_cast<type>(rhs.R_component_7()); \
|
Chris@16
|
772 h += static_cast<type>(rhs.R_component_8()); \
|
Chris@16
|
773 \
|
Chris@16
|
774 return(*this); \
|
Chris@16
|
775 }
|
Chris@16
|
776
|
Chris@16
|
777 #define BOOST_OCTONION_MEMBER_SUB_GENERATOR_1(type) \
|
Chris@16
|
778 octonion<type> & operator -= (type const & rhs) \
|
Chris@16
|
779 { \
|
Chris@16
|
780 a -= rhs; \
|
Chris@16
|
781 \
|
Chris@16
|
782 return(*this); \
|
Chris@16
|
783 }
|
Chris@16
|
784
|
Chris@16
|
785 #define BOOST_OCTONION_MEMBER_SUB_GENERATOR_2(type) \
|
Chris@16
|
786 octonion<type> & operator -= (::std::complex<type> const & rhs) \
|
Chris@16
|
787 { \
|
Chris@16
|
788 a -= rhs.real(); \
|
Chris@16
|
789 b -= rhs.imag(); \
|
Chris@16
|
790 \
|
Chris@16
|
791 return(*this); \
|
Chris@16
|
792 }
|
Chris@16
|
793
|
Chris@16
|
794 #define BOOST_OCTONION_MEMBER_SUB_GENERATOR_3(type) \
|
Chris@16
|
795 octonion<type> & operator -= (::boost::math::quaternion<type> const & rhs) \
|
Chris@16
|
796 { \
|
Chris@16
|
797 a -= rhs.R_component_1(); \
|
Chris@16
|
798 b -= rhs.R_component_2(); \
|
Chris@16
|
799 c -= rhs.R_component_3(); \
|
Chris@16
|
800 d -= rhs.R_component_4(); \
|
Chris@16
|
801 \
|
Chris@16
|
802 return(*this); \
|
Chris@16
|
803 }
|
Chris@16
|
804
|
Chris@16
|
805 #define BOOST_OCTONION_MEMBER_SUB_GENERATOR_4(type) \
|
Chris@16
|
806 template<typename X> \
|
Chris@16
|
807 octonion<type> & operator -= (octonion<X> const & rhs) \
|
Chris@16
|
808 { \
|
Chris@16
|
809 a -= static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
810 b -= static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
811 c -= static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
812 d -= static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
813 e -= static_cast<type>(rhs.R_component_5()); \
|
Chris@16
|
814 f -= static_cast<type>(rhs.R_component_6()); \
|
Chris@16
|
815 g -= static_cast<type>(rhs.R_component_7()); \
|
Chris@16
|
816 h -= static_cast<type>(rhs.R_component_8()); \
|
Chris@16
|
817 \
|
Chris@16
|
818 return(*this); \
|
Chris@16
|
819 }
|
Chris@16
|
820
|
Chris@16
|
821 #define BOOST_OCTONION_MEMBER_MUL_GENERATOR_1(type) \
|
Chris@16
|
822 octonion<type> & operator *= (type const & rhs) \
|
Chris@16
|
823 { \
|
Chris@16
|
824 a *= rhs; \
|
Chris@16
|
825 b *= rhs; \
|
Chris@16
|
826 c *= rhs; \
|
Chris@16
|
827 d *= rhs; \
|
Chris@16
|
828 e *= rhs; \
|
Chris@16
|
829 f *= rhs; \
|
Chris@16
|
830 g *= rhs; \
|
Chris@16
|
831 h *= rhs; \
|
Chris@16
|
832 \
|
Chris@16
|
833 return(*this); \
|
Chris@16
|
834 }
|
Chris@16
|
835
|
Chris@16
|
836 #define BOOST_OCTONION_MEMBER_MUL_GENERATOR_2(type) \
|
Chris@16
|
837 octonion<type> & operator *= (::std::complex<type> const & rhs) \
|
Chris@16
|
838 { \
|
Chris@16
|
839 type ar = rhs.real(); \
|
Chris@16
|
840 type br = rhs.imag(); \
|
Chris@16
|
841 \
|
Chris@16
|
842 type at = +a*ar-b*br; \
|
Chris@16
|
843 type bt = +a*br+b*ar; \
|
Chris@16
|
844 type ct = +c*ar+d*br; \
|
Chris@16
|
845 type dt = -c*br+d*ar; \
|
Chris@16
|
846 type et = +e*ar+f*br; \
|
Chris@16
|
847 type ft = -e*br+f*ar; \
|
Chris@16
|
848 type gt = +g*ar-h*br; \
|
Chris@16
|
849 type ht = +g*br+h*ar; \
|
Chris@16
|
850 \
|
Chris@16
|
851 a = at; \
|
Chris@16
|
852 b = bt; \
|
Chris@16
|
853 c = ct; \
|
Chris@16
|
854 d = dt; \
|
Chris@16
|
855 e = et; \
|
Chris@16
|
856 f = ft; \
|
Chris@16
|
857 g = gt; \
|
Chris@16
|
858 h = ht; \
|
Chris@16
|
859 \
|
Chris@16
|
860 return(*this); \
|
Chris@16
|
861 }
|
Chris@16
|
862
|
Chris@16
|
863 #define BOOST_OCTONION_MEMBER_MUL_GENERATOR_3(type) \
|
Chris@16
|
864 octonion<type> & operator *= (::boost::math::quaternion<type> const & rhs) \
|
Chris@16
|
865 { \
|
Chris@16
|
866 type ar = rhs.R_component_1(); \
|
Chris@16
|
867 type br = rhs.R_component_2(); \
|
Chris@16
|
868 type cr = rhs.R_component_2(); \
|
Chris@16
|
869 type dr = rhs.R_component_2(); \
|
Chris@16
|
870 \
|
Chris@16
|
871 type at = +a*ar-b*br-c*cr-d*dr; \
|
Chris@16
|
872 type bt = +a*br+b*ar+c*dr-d*cr; \
|
Chris@16
|
873 type ct = +a*cr-b*dr+c*ar+d*br; \
|
Chris@16
|
874 type dt = +a*dr+b*cr-c*br+d*ar; \
|
Chris@16
|
875 type et = +e*ar+f*br+g*cr+h*dr; \
|
Chris@16
|
876 type ft = -e*br+f*ar-g*dr+h*cr; \
|
Chris@16
|
877 type gt = -e*cr+f*dr+g*ar-h*br; \
|
Chris@16
|
878 type ht = -e*dr-f*cr+g*br+h*ar; \
|
Chris@16
|
879 \
|
Chris@16
|
880 a = at; \
|
Chris@16
|
881 b = bt; \
|
Chris@16
|
882 c = ct; \
|
Chris@16
|
883 d = dt; \
|
Chris@16
|
884 e = et; \
|
Chris@16
|
885 f = ft; \
|
Chris@16
|
886 g = gt; \
|
Chris@16
|
887 h = ht; \
|
Chris@16
|
888 \
|
Chris@16
|
889 return(*this); \
|
Chris@16
|
890 }
|
Chris@16
|
891
|
Chris@16
|
892 #define BOOST_OCTONION_MEMBER_MUL_GENERATOR_4(type) \
|
Chris@16
|
893 template<typename X> \
|
Chris@16
|
894 octonion<type> & operator *= (octonion<X> const & rhs) \
|
Chris@16
|
895 { \
|
Chris@16
|
896 type ar = static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
897 type br = static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
898 type cr = static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
899 type dr = static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
900 type er = static_cast<type>(rhs.R_component_5()); \
|
Chris@16
|
901 type fr = static_cast<type>(rhs.R_component_6()); \
|
Chris@16
|
902 type gr = static_cast<type>(rhs.R_component_7()); \
|
Chris@16
|
903 type hr = static_cast<type>(rhs.R_component_8()); \
|
Chris@16
|
904 \
|
Chris@16
|
905 type at = +a*ar-b*br-c*cr-d*dr-e*er-f*fr-g*gr-h*hr; \
|
Chris@16
|
906 type bt = +a*br+b*ar+c*dr-d*cr+e*fr-f*er-g*hr+h*gr; \
|
Chris@16
|
907 type ct = +a*cr-b*dr+c*ar+d*br+e*gr+f*hr-g*er-h*fr; \
|
Chris@16
|
908 type dt = +a*dr+b*cr-c*br+d*ar+e*hr-f*gr+g*fr-h*er; \
|
Chris@16
|
909 type et = +a*er-b*fr-c*gr-d*hr+e*ar+f*br+g*cr+h*dr; \
|
Chris@16
|
910 type ft = +a*fr+b*er-c*hr+d*gr-e*br+f*ar-g*dr+h*cr; \
|
Chris@16
|
911 type gt = +a*gr+b*hr+c*er-d*fr-e*cr+f*dr+g*ar-h*br; \
|
Chris@16
|
912 type ht = +a*hr-b*gr+c*fr+d*er-e*dr-f*cr+g*br+h*ar; \
|
Chris@16
|
913 \
|
Chris@16
|
914 a = at; \
|
Chris@16
|
915 b = bt; \
|
Chris@16
|
916 c = ct; \
|
Chris@16
|
917 d = dt; \
|
Chris@16
|
918 e = et; \
|
Chris@16
|
919 f = ft; \
|
Chris@16
|
920 g = gt; \
|
Chris@16
|
921 h = ht; \
|
Chris@16
|
922 \
|
Chris@16
|
923 return(*this); \
|
Chris@16
|
924 }
|
Chris@16
|
925
|
Chris@16
|
926 // There is quite a lot of repetition in the code below. This is intentional.
|
Chris@16
|
927 // The last conditional block is the normal form, and the others merely
|
Chris@16
|
928 // consist of workarounds for various compiler deficiencies. Hopefuly, when
|
Chris@16
|
929 // more compilers are conformant and we can retire support for those that are
|
Chris@16
|
930 // not, we will be able to remove the clutter. This is makes the situation
|
Chris@16
|
931 // (painfully) explicit.
|
Chris@16
|
932
|
Chris@16
|
933 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_1(type) \
|
Chris@16
|
934 octonion<type> & operator /= (type const & rhs) \
|
Chris@16
|
935 { \
|
Chris@16
|
936 a /= rhs; \
|
Chris@16
|
937 b /= rhs; \
|
Chris@16
|
938 c /= rhs; \
|
Chris@16
|
939 d /= rhs; \
|
Chris@16
|
940 \
|
Chris@16
|
941 return(*this); \
|
Chris@16
|
942 }
|
Chris@16
|
943
|
Chris@101
|
944 #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
Chris@16
|
945 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_2(type) \
|
Chris@16
|
946 octonion<type> & operator /= (::std::complex<type> const & rhs) \
|
Chris@16
|
947 { \
|
Chris@16
|
948 using ::std::valarray; \
|
Chris@16
|
949 using ::std::abs; \
|
Chris@16
|
950 \
|
Chris@16
|
951 valarray<type> tr(2); \
|
Chris@16
|
952 \
|
Chris@16
|
953 tr[0] = rhs.real(); \
|
Chris@16
|
954 tr[1] = rhs.imag(); \
|
Chris@16
|
955 \
|
Chris@16
|
956 type mixam = static_cast<type>(1)/(abs(tr).max)(); \
|
Chris@16
|
957 \
|
Chris@16
|
958 tr *= mixam; \
|
Chris@16
|
959 \
|
Chris@16
|
960 valarray<type> tt(8); \
|
Chris@16
|
961 \
|
Chris@16
|
962 tt[0] = +a*tr[0]-b*tr[1]; \
|
Chris@16
|
963 tt[1] = -a*tr[1]+b*tr[0]; \
|
Chris@16
|
964 tt[2] = +c*tr[0]-d*tr[1]; \
|
Chris@16
|
965 tt[3] = +c*tr[1]+d*tr[0]; \
|
Chris@16
|
966 tt[4] = +e*tr[0]-f*tr[1]; \
|
Chris@16
|
967 tt[5] = +e*tr[1]+f*tr[0]; \
|
Chris@16
|
968 tt[6] = +g*tr[0]+h*tr[1]; \
|
Chris@16
|
969 tt[7] = +g*tr[1]+h*tr[0]; \
|
Chris@16
|
970 \
|
Chris@16
|
971 tr *= tr; \
|
Chris@16
|
972 \
|
Chris@16
|
973 tt *= (mixam/tr.sum()); \
|
Chris@16
|
974 \
|
Chris@16
|
975 a = tt[0]; \
|
Chris@16
|
976 b = tt[1]; \
|
Chris@16
|
977 c = tt[2]; \
|
Chris@16
|
978 d = tt[3]; \
|
Chris@16
|
979 e = tt[4]; \
|
Chris@16
|
980 f = tt[5]; \
|
Chris@16
|
981 g = tt[6]; \
|
Chris@16
|
982 h = tt[7]; \
|
Chris@16
|
983 \
|
Chris@16
|
984 return(*this); \
|
Chris@16
|
985 }
|
Chris@16
|
986 #else
|
Chris@16
|
987 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_2(type) \
|
Chris@16
|
988 octonion<type> & operator /= (::std::complex<type> const & rhs) \
|
Chris@16
|
989 { \
|
Chris@16
|
990 using ::std::valarray; \
|
Chris@16
|
991 \
|
Chris@16
|
992 valarray<type> tr(2); \
|
Chris@16
|
993 \
|
Chris@16
|
994 tr[0] = rhs.real(); \
|
Chris@16
|
995 tr[1] = rhs.imag(); \
|
Chris@16
|
996 \
|
Chris@16
|
997 type mixam = static_cast<type>(1)/(abs(tr).max)(); \
|
Chris@16
|
998 \
|
Chris@16
|
999 tr *= mixam; \
|
Chris@16
|
1000 \
|
Chris@16
|
1001 valarray<type> tt(8); \
|
Chris@16
|
1002 \
|
Chris@16
|
1003 tt[0] = +a*tr[0]-b*tr[1]; \
|
Chris@16
|
1004 tt[1] = -a*tr[1]+b*tr[0]; \
|
Chris@16
|
1005 tt[2] = +c*tr[0]-d*tr[1]; \
|
Chris@16
|
1006 tt[3] = +c*tr[1]+d*tr[0]; \
|
Chris@16
|
1007 tt[4] = +e*tr[0]-f*tr[1]; \
|
Chris@16
|
1008 tt[5] = +e*tr[1]+f*tr[0]; \
|
Chris@16
|
1009 tt[6] = +g*tr[0]+h*tr[1]; \
|
Chris@16
|
1010 tt[7] = +g*tr[1]+h*tr[0]; \
|
Chris@16
|
1011 \
|
Chris@16
|
1012 tr *= tr; \
|
Chris@16
|
1013 \
|
Chris@16
|
1014 tt *= (mixam/tr.sum()); \
|
Chris@16
|
1015 \
|
Chris@16
|
1016 a = tt[0]; \
|
Chris@16
|
1017 b = tt[1]; \
|
Chris@16
|
1018 c = tt[2]; \
|
Chris@16
|
1019 d = tt[3]; \
|
Chris@16
|
1020 e = tt[4]; \
|
Chris@16
|
1021 f = tt[5]; \
|
Chris@16
|
1022 g = tt[6]; \
|
Chris@16
|
1023 h = tt[7]; \
|
Chris@16
|
1024 \
|
Chris@16
|
1025 return(*this); \
|
Chris@16
|
1026 }
|
Chris@101
|
1027 #endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
|
Chris@16
|
1028
|
Chris@101
|
1029 #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
Chris@16
|
1030 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_3(type) \
|
Chris@16
|
1031 octonion<type> & operator /= (::boost::math::quaternion<type> const & rhs) \
|
Chris@16
|
1032 { \
|
Chris@16
|
1033 using ::std::valarray; \
|
Chris@16
|
1034 using ::std::abs; \
|
Chris@16
|
1035 \
|
Chris@16
|
1036 valarray<type> tr(4); \
|
Chris@16
|
1037 \
|
Chris@16
|
1038 tr[0] = static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
1039 tr[1] = static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
1040 tr[2] = static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
1041 tr[3] = static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
1042 \
|
Chris@16
|
1043 type mixam = static_cast<type>(1)/(abs(tr).max)(); \
|
Chris@16
|
1044 \
|
Chris@16
|
1045 tr *= mixam; \
|
Chris@16
|
1046 \
|
Chris@16
|
1047 valarray<type> tt(8); \
|
Chris@16
|
1048 \
|
Chris@16
|
1049 tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]; \
|
Chris@16
|
1050 tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]; \
|
Chris@16
|
1051 tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]; \
|
Chris@16
|
1052 tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]; \
|
Chris@16
|
1053 tt[4] = +e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3]; \
|
Chris@16
|
1054 tt[5] = +e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2]; \
|
Chris@16
|
1055 tt[6] = +e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1]; \
|
Chris@16
|
1056 tt[7] = +e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0]; \
|
Chris@16
|
1057 \
|
Chris@16
|
1058 tr *= tr; \
|
Chris@16
|
1059 \
|
Chris@16
|
1060 tt *= (mixam/tr.sum()); \
|
Chris@16
|
1061 \
|
Chris@16
|
1062 a = tt[0]; \
|
Chris@16
|
1063 b = tt[1]; \
|
Chris@16
|
1064 c = tt[2]; \
|
Chris@16
|
1065 d = tt[3]; \
|
Chris@16
|
1066 e = tt[4]; \
|
Chris@16
|
1067 f = tt[5]; \
|
Chris@16
|
1068 g = tt[6]; \
|
Chris@16
|
1069 h = tt[7]; \
|
Chris@16
|
1070 \
|
Chris@16
|
1071 return(*this); \
|
Chris@16
|
1072 }
|
Chris@16
|
1073 #else
|
Chris@16
|
1074 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_3(type) \
|
Chris@16
|
1075 octonion<type> & operator /= (::boost::math::quaternion<type> const & rhs) \
|
Chris@16
|
1076 { \
|
Chris@16
|
1077 using ::std::valarray; \
|
Chris@16
|
1078 \
|
Chris@16
|
1079 valarray<type> tr(4); \
|
Chris@16
|
1080 \
|
Chris@16
|
1081 tr[0] = static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
1082 tr[1] = static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
1083 tr[2] = static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
1084 tr[3] = static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
1085 \
|
Chris@16
|
1086 type mixam = static_cast<type>(1)/(abs(tr).max)(); \
|
Chris@16
|
1087 \
|
Chris@16
|
1088 tr *= mixam; \
|
Chris@16
|
1089 \
|
Chris@16
|
1090 valarray<type> tt(8); \
|
Chris@16
|
1091 \
|
Chris@16
|
1092 tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]; \
|
Chris@16
|
1093 tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]; \
|
Chris@16
|
1094 tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]; \
|
Chris@16
|
1095 tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]; \
|
Chris@16
|
1096 tt[4] = +e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3]; \
|
Chris@16
|
1097 tt[5] = +e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2]; \
|
Chris@16
|
1098 tt[6] = +e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1]; \
|
Chris@16
|
1099 tt[7] = +e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0]; \
|
Chris@16
|
1100 \
|
Chris@16
|
1101 tr *= tr; \
|
Chris@16
|
1102 \
|
Chris@16
|
1103 tt *= (mixam/tr.sum()); \
|
Chris@16
|
1104 \
|
Chris@16
|
1105 a = tt[0]; \
|
Chris@16
|
1106 b = tt[1]; \
|
Chris@16
|
1107 c = tt[2]; \
|
Chris@16
|
1108 d = tt[3]; \
|
Chris@16
|
1109 e = tt[4]; \
|
Chris@16
|
1110 f = tt[5]; \
|
Chris@16
|
1111 g = tt[6]; \
|
Chris@16
|
1112 h = tt[7]; \
|
Chris@16
|
1113 \
|
Chris@16
|
1114 return(*this); \
|
Chris@16
|
1115 }
|
Chris@101
|
1116 #endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
|
Chris@16
|
1117
|
Chris@101
|
1118 #if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP)
|
Chris@16
|
1119 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_4(type) \
|
Chris@16
|
1120 template<typename X> \
|
Chris@16
|
1121 octonion<type> & operator /= (octonion<X> const & rhs) \
|
Chris@16
|
1122 { \
|
Chris@16
|
1123 using ::std::valarray; \
|
Chris@16
|
1124 using ::std::abs; \
|
Chris@16
|
1125 \
|
Chris@16
|
1126 valarray<type> tr(8); \
|
Chris@16
|
1127 \
|
Chris@16
|
1128 tr[0] = static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
1129 tr[1] = static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
1130 tr[2] = static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
1131 tr[3] = static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
1132 tr[4] = static_cast<type>(rhs.R_component_5()); \
|
Chris@16
|
1133 tr[5] = static_cast<type>(rhs.R_component_6()); \
|
Chris@16
|
1134 tr[6] = static_cast<type>(rhs.R_component_7()); \
|
Chris@16
|
1135 tr[7] = static_cast<type>(rhs.R_component_8()); \
|
Chris@16
|
1136 \
|
Chris@16
|
1137 type mixam = static_cast<type>(1)/(abs(tr).max)(); \
|
Chris@16
|
1138 \
|
Chris@16
|
1139 tr *= mixam; \
|
Chris@16
|
1140 \
|
Chris@16
|
1141 valarray<type> tt(8); \
|
Chris@16
|
1142 \
|
Chris@16
|
1143 tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]+e*tr[4]+f*tr[5]+g*tr[6]+h*tr[7]; \
|
Chris@16
|
1144 tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]-e*tr[5]+f*tr[4]+g*tr[7]-h*tr[6]; \
|
Chris@16
|
1145 tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]-e*tr[6]-f*tr[7]+g*tr[4]+h*tr[5]; \
|
Chris@16
|
1146 tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]-e*tr[7]+f*tr[6]-g*tr[5]+h*tr[4]; \
|
Chris@16
|
1147 tt[4] = -a*tr[4]+b*tr[5]+c*tr[6]+d*tr[7]+e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3]; \
|
Chris@16
|
1148 tt[5] = -a*tr[5]-b*tr[4]+c*tr[7]-d*tr[6]+e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2]; \
|
Chris@16
|
1149 tt[6] = -a*tr[6]-b*tr[7]-c*tr[4]+d*tr[5]+e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1]; \
|
Chris@16
|
1150 tt[7] = -a*tr[7]+b*tr[6]-c*tr[5]-d*tr[4]+e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0]; \
|
Chris@16
|
1151 \
|
Chris@16
|
1152 tr *= tr; \
|
Chris@16
|
1153 \
|
Chris@16
|
1154 tt *= (mixam/tr.sum()); \
|
Chris@16
|
1155 \
|
Chris@16
|
1156 a = tt[0]; \
|
Chris@16
|
1157 b = tt[1]; \
|
Chris@16
|
1158 c = tt[2]; \
|
Chris@16
|
1159 d = tt[3]; \
|
Chris@16
|
1160 e = tt[4]; \
|
Chris@16
|
1161 f = tt[5]; \
|
Chris@16
|
1162 g = tt[6]; \
|
Chris@16
|
1163 h = tt[7]; \
|
Chris@16
|
1164 \
|
Chris@16
|
1165 return(*this); \
|
Chris@16
|
1166 }
|
Chris@16
|
1167 #else
|
Chris@16
|
1168 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR_4(type) \
|
Chris@16
|
1169 template<typename X> \
|
Chris@16
|
1170 octonion<type> & operator /= (octonion<X> const & rhs) \
|
Chris@16
|
1171 { \
|
Chris@16
|
1172 using ::std::valarray; \
|
Chris@16
|
1173 \
|
Chris@16
|
1174 valarray<type> tr(8); \
|
Chris@16
|
1175 \
|
Chris@16
|
1176 tr[0] = static_cast<type>(rhs.R_component_1()); \
|
Chris@16
|
1177 tr[1] = static_cast<type>(rhs.R_component_2()); \
|
Chris@16
|
1178 tr[2] = static_cast<type>(rhs.R_component_3()); \
|
Chris@16
|
1179 tr[3] = static_cast<type>(rhs.R_component_4()); \
|
Chris@16
|
1180 tr[4] = static_cast<type>(rhs.R_component_5()); \
|
Chris@16
|
1181 tr[5] = static_cast<type>(rhs.R_component_6()); \
|
Chris@16
|
1182 tr[6] = static_cast<type>(rhs.R_component_7()); \
|
Chris@16
|
1183 tr[7] = static_cast<type>(rhs.R_component_8()); \
|
Chris@16
|
1184 \
|
Chris@16
|
1185 type mixam = static_cast<type>(1)/(abs(tr).max)(); \
|
Chris@16
|
1186 \
|
Chris@16
|
1187 tr *= mixam; \
|
Chris@16
|
1188 \
|
Chris@16
|
1189 valarray<type> tt(8); \
|
Chris@16
|
1190 \
|
Chris@16
|
1191 tt[0] = +a*tr[0]+b*tr[1]+c*tr[2]+d*tr[3]+e*tr[4]+f*tr[5]+g*tr[6]+h*tr[7]; \
|
Chris@16
|
1192 tt[1] = -a*tr[1]+b*tr[0]-c*tr[3]+d*tr[2]-e*tr[5]+f*tr[4]+g*tr[7]-h*tr[6]; \
|
Chris@16
|
1193 tt[2] = -a*tr[2]+b*tr[3]+c*tr[0]-d*tr[1]-e*tr[6]-f*tr[7]+g*tr[4]+h*tr[5]; \
|
Chris@16
|
1194 tt[3] = -a*tr[3]-b*tr[2]+c*tr[1]+d*tr[0]-e*tr[7]+f*tr[6]-g*tr[5]+h*tr[4]; \
|
Chris@16
|
1195 tt[4] = -a*tr[4]+b*tr[5]+c*tr[6]+d*tr[7]+e*tr[0]-f*tr[1]-g*tr[2]-h*tr[3]; \
|
Chris@16
|
1196 tt[5] = -a*tr[5]-b*tr[4]+c*tr[7]-d*tr[6]+e*tr[1]+f*tr[0]+g*tr[3]-h*tr[2]; \
|
Chris@16
|
1197 tt[6] = -a*tr[6]-b*tr[7]-c*tr[4]+d*tr[5]+e*tr[2]-f*tr[3]+g*tr[0]+h*tr[1]; \
|
Chris@16
|
1198 tt[7] = -a*tr[7]+b*tr[6]-c*tr[5]-d*tr[4]+e*tr[3]+f*tr[2]-g*tr[1]+h*tr[0]; \
|
Chris@16
|
1199 \
|
Chris@16
|
1200 tr *= tr; \
|
Chris@16
|
1201 \
|
Chris@16
|
1202 tt *= (mixam/tr.sum()); \
|
Chris@16
|
1203 \
|
Chris@16
|
1204 a = tt[0]; \
|
Chris@16
|
1205 b = tt[1]; \
|
Chris@16
|
1206 c = tt[2]; \
|
Chris@16
|
1207 d = tt[3]; \
|
Chris@16
|
1208 e = tt[4]; \
|
Chris@16
|
1209 f = tt[5]; \
|
Chris@16
|
1210 g = tt[6]; \
|
Chris@16
|
1211 h = tt[7]; \
|
Chris@16
|
1212 \
|
Chris@16
|
1213 return(*this); \
|
Chris@16
|
1214 }
|
Chris@101
|
1215 #endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
|
Chris@16
|
1216
|
Chris@16
|
1217
|
Chris@16
|
1218 #define BOOST_OCTONION_MEMBER_ADD_GENERATOR(type) \
|
Chris@16
|
1219 BOOST_OCTONION_MEMBER_ADD_GENERATOR_1(type) \
|
Chris@16
|
1220 BOOST_OCTONION_MEMBER_ADD_GENERATOR_2(type) \
|
Chris@16
|
1221 BOOST_OCTONION_MEMBER_ADD_GENERATOR_3(type) \
|
Chris@16
|
1222 BOOST_OCTONION_MEMBER_ADD_GENERATOR_4(type)
|
Chris@16
|
1223
|
Chris@16
|
1224 #define BOOST_OCTONION_MEMBER_SUB_GENERATOR(type) \
|
Chris@16
|
1225 BOOST_OCTONION_MEMBER_SUB_GENERATOR_1(type) \
|
Chris@16
|
1226 BOOST_OCTONION_MEMBER_SUB_GENERATOR_2(type) \
|
Chris@16
|
1227 BOOST_OCTONION_MEMBER_SUB_GENERATOR_3(type) \
|
Chris@16
|
1228 BOOST_OCTONION_MEMBER_SUB_GENERATOR_4(type)
|
Chris@16
|
1229
|
Chris@16
|
1230 #define BOOST_OCTONION_MEMBER_MUL_GENERATOR(type) \
|
Chris@16
|
1231 BOOST_OCTONION_MEMBER_MUL_GENERATOR_1(type) \
|
Chris@16
|
1232 BOOST_OCTONION_MEMBER_MUL_GENERATOR_2(type) \
|
Chris@16
|
1233 BOOST_OCTONION_MEMBER_MUL_GENERATOR_3(type) \
|
Chris@16
|
1234 BOOST_OCTONION_MEMBER_MUL_GENERATOR_4(type)
|
Chris@16
|
1235
|
Chris@16
|
1236 #define BOOST_OCTONION_MEMBER_DIV_GENERATOR(type) \
|
Chris@16
|
1237 BOOST_OCTONION_MEMBER_DIV_GENERATOR_1(type) \
|
Chris@16
|
1238 BOOST_OCTONION_MEMBER_DIV_GENERATOR_2(type) \
|
Chris@16
|
1239 BOOST_OCTONION_MEMBER_DIV_GENERATOR_3(type) \
|
Chris@16
|
1240 BOOST_OCTONION_MEMBER_DIV_GENERATOR_4(type)
|
Chris@16
|
1241
|
Chris@16
|
1242 #define BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(type) \
|
Chris@16
|
1243 BOOST_OCTONION_MEMBER_ADD_GENERATOR(type) \
|
Chris@16
|
1244 BOOST_OCTONION_MEMBER_SUB_GENERATOR(type) \
|
Chris@16
|
1245 BOOST_OCTONION_MEMBER_MUL_GENERATOR(type) \
|
Chris@16
|
1246 BOOST_OCTONION_MEMBER_DIV_GENERATOR(type)
|
Chris@16
|
1247
|
Chris@16
|
1248
|
Chris@16
|
1249 template<>
|
Chris@16
|
1250 class octonion<float>
|
Chris@16
|
1251 {
|
Chris@16
|
1252 public:
|
Chris@16
|
1253
|
Chris@16
|
1254 typedef float value_type;
|
Chris@16
|
1255
|
Chris@16
|
1256 BOOST_OCTONION_CONSTRUCTOR_GENERATOR(float)
|
Chris@16
|
1257
|
Chris@16
|
1258 // UNtemplated copy constructor
|
Chris@16
|
1259 // (this is taken care of by the compiler itself)
|
Chris@16
|
1260
|
Chris@16
|
1261 // explicit copy constructors (precision-loosing converters)
|
Chris@16
|
1262
|
Chris@16
|
1263 explicit octonion(octonion<double> const & a_recopier)
|
Chris@16
|
1264 {
|
Chris@16
|
1265 *this = detail::octonion_type_converter<float, double>(a_recopier);
|
Chris@16
|
1266 }
|
Chris@16
|
1267
|
Chris@16
|
1268 explicit octonion(octonion<long double> const & a_recopier)
|
Chris@16
|
1269 {
|
Chris@16
|
1270 *this = detail::octonion_type_converter<float, long double>(a_recopier);
|
Chris@16
|
1271 }
|
Chris@16
|
1272
|
Chris@16
|
1273 // destructor
|
Chris@16
|
1274 // (this is taken care of by the compiler itself)
|
Chris@16
|
1275
|
Chris@16
|
1276 // accessors
|
Chris@16
|
1277 //
|
Chris@16
|
1278 // Note: Like complex number, octonions do have a meaningful notion of "real part",
|
Chris@16
|
1279 // but unlike them there is no meaningful notion of "imaginary part".
|
Chris@16
|
1280 // Instead there is an "unreal part" which itself is an octonion, and usually
|
Chris@16
|
1281 // nothing simpler (as opposed to the complex number case).
|
Chris@16
|
1282 // However, for practicallity, there are accessors for the other components
|
Chris@16
|
1283 // (these are necessary for the templated copy constructor, for instance).
|
Chris@16
|
1284
|
Chris@16
|
1285 BOOST_OCTONION_ACCESSOR_GENERATOR(float)
|
Chris@16
|
1286
|
Chris@16
|
1287 // assignment operators
|
Chris@16
|
1288
|
Chris@16
|
1289 BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(float)
|
Chris@16
|
1290
|
Chris@16
|
1291 // other assignment-related operators
|
Chris@16
|
1292 //
|
Chris@16
|
1293 // NOTE: Octonion multiplication is *NOT* commutative;
|
Chris@16
|
1294 // symbolically, "q *= rhs;" means "q = q * rhs;"
|
Chris@16
|
1295 // and "q /= rhs;" means "q = q * inverse_of(rhs);";
|
Chris@16
|
1296 // octonion multiplication is also *NOT* associative
|
Chris@16
|
1297
|
Chris@16
|
1298 BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(float)
|
Chris@16
|
1299
|
Chris@16
|
1300
|
Chris@16
|
1301 protected:
|
Chris@16
|
1302
|
Chris@16
|
1303 BOOST_OCTONION_MEMBER_DATA_GENERATOR(float)
|
Chris@16
|
1304
|
Chris@16
|
1305
|
Chris@16
|
1306 private:
|
Chris@16
|
1307
|
Chris@16
|
1308 };
|
Chris@16
|
1309
|
Chris@16
|
1310
|
Chris@16
|
1311 template<>
|
Chris@16
|
1312 class octonion<double>
|
Chris@16
|
1313 {
|
Chris@16
|
1314 public:
|
Chris@16
|
1315
|
Chris@16
|
1316 typedef double value_type;
|
Chris@16
|
1317
|
Chris@16
|
1318 BOOST_OCTONION_CONSTRUCTOR_GENERATOR(double)
|
Chris@16
|
1319
|
Chris@16
|
1320 // UNtemplated copy constructor
|
Chris@16
|
1321 // (this is taken care of by the compiler itself)
|
Chris@16
|
1322
|
Chris@16
|
1323 // converting copy constructor
|
Chris@16
|
1324
|
Chris@16
|
1325 explicit octonion(octonion<float> const & a_recopier)
|
Chris@16
|
1326 {
|
Chris@16
|
1327 *this = detail::octonion_type_converter<double, float>(a_recopier);
|
Chris@16
|
1328 }
|
Chris@16
|
1329
|
Chris@16
|
1330 // explicit copy constructors (precision-loosing converters)
|
Chris@16
|
1331
|
Chris@16
|
1332 explicit octonion(octonion<long double> const & a_recopier)
|
Chris@16
|
1333 {
|
Chris@16
|
1334 *this = detail::octonion_type_converter<double, long double>(a_recopier);
|
Chris@16
|
1335 }
|
Chris@16
|
1336
|
Chris@16
|
1337 // destructor
|
Chris@16
|
1338 // (this is taken care of by the compiler itself)
|
Chris@16
|
1339
|
Chris@16
|
1340 // accessors
|
Chris@16
|
1341 //
|
Chris@16
|
1342 // Note: Like complex number, octonions do have a meaningful notion of "real part",
|
Chris@16
|
1343 // but unlike them there is no meaningful notion of "imaginary part".
|
Chris@16
|
1344 // Instead there is an "unreal part" which itself is an octonion, and usually
|
Chris@16
|
1345 // nothing simpler (as opposed to the complex number case).
|
Chris@16
|
1346 // However, for practicallity, there are accessors for the other components
|
Chris@16
|
1347 // (these are necessary for the templated copy constructor, for instance).
|
Chris@16
|
1348
|
Chris@16
|
1349 BOOST_OCTONION_ACCESSOR_GENERATOR(double)
|
Chris@16
|
1350
|
Chris@16
|
1351 // assignment operators
|
Chris@16
|
1352
|
Chris@16
|
1353 BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(double)
|
Chris@16
|
1354
|
Chris@16
|
1355 // other assignment-related operators
|
Chris@16
|
1356 //
|
Chris@16
|
1357 // NOTE: Octonion multiplication is *NOT* commutative;
|
Chris@16
|
1358 // symbolically, "q *= rhs;" means "q = q * rhs;"
|
Chris@16
|
1359 // and "q /= rhs;" means "q = q * inverse_of(rhs);";
|
Chris@16
|
1360 // octonion multiplication is also *NOT* associative
|
Chris@16
|
1361
|
Chris@16
|
1362 BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(double)
|
Chris@16
|
1363
|
Chris@16
|
1364
|
Chris@16
|
1365 protected:
|
Chris@16
|
1366
|
Chris@16
|
1367 BOOST_OCTONION_MEMBER_DATA_GENERATOR(double)
|
Chris@16
|
1368
|
Chris@16
|
1369
|
Chris@16
|
1370 private:
|
Chris@16
|
1371
|
Chris@16
|
1372 };
|
Chris@16
|
1373
|
Chris@16
|
1374
|
Chris@16
|
1375 template<>
|
Chris@16
|
1376 class octonion<long double>
|
Chris@16
|
1377 {
|
Chris@16
|
1378 public:
|
Chris@16
|
1379
|
Chris@16
|
1380 typedef long double value_type;
|
Chris@16
|
1381
|
Chris@16
|
1382 BOOST_OCTONION_CONSTRUCTOR_GENERATOR(long double)
|
Chris@16
|
1383
|
Chris@16
|
1384 // UNtemplated copy constructor
|
Chris@16
|
1385 // (this is taken care of by the compiler itself)
|
Chris@16
|
1386
|
Chris@16
|
1387 // converting copy constructor
|
Chris@16
|
1388
|
Chris@16
|
1389 explicit octonion(octonion<float> const & a_recopier)
|
Chris@16
|
1390 {
|
Chris@16
|
1391 *this = detail::octonion_type_converter<long double, float>(a_recopier);
|
Chris@16
|
1392 }
|
Chris@16
|
1393
|
Chris@16
|
1394
|
Chris@16
|
1395 explicit octonion(octonion<double> const & a_recopier)
|
Chris@16
|
1396 {
|
Chris@16
|
1397 *this = detail::octonion_type_converter<long double, double>(a_recopier);
|
Chris@16
|
1398 }
|
Chris@16
|
1399
|
Chris@16
|
1400
|
Chris@16
|
1401 // destructor
|
Chris@16
|
1402 // (this is taken care of by the compiler itself)
|
Chris@16
|
1403
|
Chris@16
|
1404 // accessors
|
Chris@16
|
1405 //
|
Chris@16
|
1406 // Note: Like complex number, octonions do have a meaningful notion of "real part",
|
Chris@16
|
1407 // but unlike them there is no meaningful notion of "imaginary part".
|
Chris@16
|
1408 // Instead there is an "unreal part" which itself is an octonion, and usually
|
Chris@16
|
1409 // nothing simpler (as opposed to the complex number case).
|
Chris@16
|
1410 // However, for practicallity, there are accessors for the other components
|
Chris@16
|
1411 // (these are necessary for the templated copy constructor, for instance).
|
Chris@16
|
1412
|
Chris@16
|
1413 BOOST_OCTONION_ACCESSOR_GENERATOR(long double)
|
Chris@16
|
1414
|
Chris@16
|
1415 // assignment operators
|
Chris@16
|
1416
|
Chris@16
|
1417 BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR(long double)
|
Chris@16
|
1418
|
Chris@16
|
1419 // other assignment-related operators
|
Chris@16
|
1420 //
|
Chris@16
|
1421 // NOTE: Octonion multiplication is *NOT* commutative;
|
Chris@16
|
1422 // symbolically, "q *= rhs;" means "q = q * rhs;"
|
Chris@16
|
1423 // and "q /= rhs;" means "q = q * inverse_of(rhs);";
|
Chris@16
|
1424 // octonion multiplication is also *NOT* associative
|
Chris@16
|
1425
|
Chris@16
|
1426 BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR(long double)
|
Chris@16
|
1427
|
Chris@16
|
1428
|
Chris@16
|
1429 protected:
|
Chris@16
|
1430
|
Chris@16
|
1431 BOOST_OCTONION_MEMBER_DATA_GENERATOR(long double)
|
Chris@16
|
1432
|
Chris@16
|
1433
|
Chris@16
|
1434 private:
|
Chris@16
|
1435
|
Chris@16
|
1436 };
|
Chris@16
|
1437
|
Chris@16
|
1438
|
Chris@16
|
1439 #undef BOOST_OCTONION_CONSTRUCTOR_GENERATOR
|
Chris@16
|
1440
|
Chris@16
|
1441 #undef BOOST_OCTONION_MEMBER_ALGEBRAIC_GENERATOR
|
Chris@16
|
1442
|
Chris@16
|
1443 #undef BOOST_OCTONION_MEMBER_ADD_GENERATOR
|
Chris@16
|
1444 #undef BOOST_OCTONION_MEMBER_SUB_GENERATOR
|
Chris@16
|
1445 #undef BOOST_OCTONION_MEMBER_MUL_GENERATOR
|
Chris@16
|
1446 #undef BOOST_OCTONION_MEMBER_DIV_GENERATOR
|
Chris@16
|
1447
|
Chris@16
|
1448 #undef BOOST_OCTONION_MEMBER_ADD_GENERATOR_1
|
Chris@16
|
1449 #undef BOOST_OCTONION_MEMBER_ADD_GENERATOR_2
|
Chris@16
|
1450 #undef BOOST_OCTONION_MEMBER_ADD_GENERATOR_3
|
Chris@16
|
1451 #undef BOOST_OCTONION_MEMBER_ADD_GENERATOR_4
|
Chris@16
|
1452 #undef BOOST_OCTONION_MEMBER_SUB_GENERATOR_1
|
Chris@16
|
1453 #undef BOOST_OCTONION_MEMBER_SUB_GENERATOR_2
|
Chris@16
|
1454 #undef BOOST_OCTONION_MEMBER_SUB_GENERATOR_3
|
Chris@16
|
1455 #undef BOOST_OCTONION_MEMBER_SUB_GENERATOR_4
|
Chris@16
|
1456 #undef BOOST_OCTONION_MEMBER_MUL_GENERATOR_1
|
Chris@16
|
1457 #undef BOOST_OCTONION_MEMBER_MUL_GENERATOR_2
|
Chris@16
|
1458 #undef BOOST_OCTONION_MEMBER_MUL_GENERATOR_3
|
Chris@16
|
1459 #undef BOOST_OCTONION_MEMBER_MUL_GENERATOR_4
|
Chris@16
|
1460 #undef BOOST_OCTONION_MEMBER_DIV_GENERATOR_1
|
Chris@16
|
1461 #undef BOOST_OCTONION_MEMBER_DIV_GENERATOR_2
|
Chris@16
|
1462 #undef BOOST_OCTONION_MEMBER_DIV_GENERATOR_3
|
Chris@16
|
1463 #undef BOOST_OCTONION_MEMBER_DIV_GENERATOR_4
|
Chris@16
|
1464
|
Chris@16
|
1465
|
Chris@16
|
1466 #undef BOOST_OCTONION_MEMBER_DATA_GENERATOR
|
Chris@16
|
1467
|
Chris@16
|
1468 #undef BOOST_OCTONION_MEMBER_ASSIGNMENT_GENERATOR
|
Chris@16
|
1469
|
Chris@16
|
1470 #undef BOOST_OCTONION_ACCESSOR_GENERATOR
|
Chris@16
|
1471
|
Chris@16
|
1472
|
Chris@16
|
1473 // operators
|
Chris@16
|
1474
|
Chris@16
|
1475 #define BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op) \
|
Chris@16
|
1476 { \
|
Chris@16
|
1477 octonion<T> res(lhs); \
|
Chris@16
|
1478 res op##= rhs; \
|
Chris@16
|
1479 return(res); \
|
Chris@16
|
1480 }
|
Chris@16
|
1481
|
Chris@16
|
1482 #define BOOST_OCTONION_OPERATOR_GENERATOR_1_L(op) \
|
Chris@16
|
1483 template<typename T> \
|
Chris@16
|
1484 inline octonion<T> operator op (T const & lhs, octonion<T> const & rhs) \
|
Chris@16
|
1485 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1486
|
Chris@16
|
1487 #define BOOST_OCTONION_OPERATOR_GENERATOR_1_R(op) \
|
Chris@16
|
1488 template<typename T> \
|
Chris@16
|
1489 inline octonion<T> operator op (octonion<T> const & lhs, T const & rhs) \
|
Chris@16
|
1490 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1491
|
Chris@16
|
1492 #define BOOST_OCTONION_OPERATOR_GENERATOR_2_L(op) \
|
Chris@16
|
1493 template<typename T> \
|
Chris@16
|
1494 inline octonion<T> operator op (::std::complex<T> const & lhs, octonion<T> const & rhs) \
|
Chris@16
|
1495 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1496
|
Chris@16
|
1497 #define BOOST_OCTONION_OPERATOR_GENERATOR_2_R(op) \
|
Chris@16
|
1498 template<typename T> \
|
Chris@16
|
1499 inline octonion<T> operator op (octonion<T> const & lhs, ::std::complex<T> const & rhs) \
|
Chris@16
|
1500 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1501
|
Chris@16
|
1502 #define BOOST_OCTONION_OPERATOR_GENERATOR_3_L(op) \
|
Chris@16
|
1503 template<typename T> \
|
Chris@16
|
1504 inline octonion<T> operator op (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs) \
|
Chris@16
|
1505 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1506
|
Chris@16
|
1507 #define BOOST_OCTONION_OPERATOR_GENERATOR_3_R(op) \
|
Chris@16
|
1508 template<typename T> \
|
Chris@16
|
1509 inline octonion<T> operator op (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs) \
|
Chris@16
|
1510 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1511
|
Chris@16
|
1512 #define BOOST_OCTONION_OPERATOR_GENERATOR_4(op) \
|
Chris@16
|
1513 template<typename T> \
|
Chris@16
|
1514 inline octonion<T> operator op (octonion<T> const & lhs, octonion<T> const & rhs) \
|
Chris@16
|
1515 BOOST_OCTONION_OPERATOR_GENERATOR_BODY(op)
|
Chris@16
|
1516
|
Chris@16
|
1517 #define BOOST_OCTONION_OPERATOR_GENERATOR(op) \
|
Chris@16
|
1518 BOOST_OCTONION_OPERATOR_GENERATOR_1_L(op) \
|
Chris@16
|
1519 BOOST_OCTONION_OPERATOR_GENERATOR_1_R(op) \
|
Chris@16
|
1520 BOOST_OCTONION_OPERATOR_GENERATOR_2_L(op) \
|
Chris@16
|
1521 BOOST_OCTONION_OPERATOR_GENERATOR_2_R(op) \
|
Chris@16
|
1522 BOOST_OCTONION_OPERATOR_GENERATOR_3_L(op) \
|
Chris@16
|
1523 BOOST_OCTONION_OPERATOR_GENERATOR_3_R(op) \
|
Chris@16
|
1524 BOOST_OCTONION_OPERATOR_GENERATOR_4(op)
|
Chris@16
|
1525
|
Chris@16
|
1526
|
Chris@16
|
1527 BOOST_OCTONION_OPERATOR_GENERATOR(+)
|
Chris@16
|
1528 BOOST_OCTONION_OPERATOR_GENERATOR(-)
|
Chris@16
|
1529 BOOST_OCTONION_OPERATOR_GENERATOR(*)
|
Chris@16
|
1530 BOOST_OCTONION_OPERATOR_GENERATOR(/)
|
Chris@16
|
1531
|
Chris@16
|
1532
|
Chris@16
|
1533 #undef BOOST_OCTONION_OPERATOR_GENERATOR
|
Chris@16
|
1534
|
Chris@16
|
1535 #undef BOOST_OCTONION_OPERATOR_GENERATOR_1_L
|
Chris@16
|
1536 #undef BOOST_OCTONION_OPERATOR_GENERATOR_1_R
|
Chris@16
|
1537 #undef BOOST_OCTONION_OPERATOR_GENERATOR_2_L
|
Chris@16
|
1538 #undef BOOST_OCTONION_OPERATOR_GENERATOR_2_R
|
Chris@16
|
1539 #undef BOOST_OCTONION_OPERATOR_GENERATOR_3_L
|
Chris@16
|
1540 #undef BOOST_OCTONION_OPERATOR_GENERATOR_3_R
|
Chris@16
|
1541 #undef BOOST_OCTONION_OPERATOR_GENERATOR_4
|
Chris@16
|
1542
|
Chris@16
|
1543 #undef BOOST_OCTONION_OPERATOR_GENERATOR_BODY
|
Chris@16
|
1544
|
Chris@16
|
1545
|
Chris@16
|
1546 template<typename T>
|
Chris@16
|
1547 inline octonion<T> operator + (octonion<T> const & o)
|
Chris@16
|
1548 {
|
Chris@16
|
1549 return(o);
|
Chris@16
|
1550 }
|
Chris@16
|
1551
|
Chris@16
|
1552
|
Chris@16
|
1553 template<typename T>
|
Chris@16
|
1554 inline octonion<T> operator - (octonion<T> const & o)
|
Chris@16
|
1555 {
|
Chris@16
|
1556 return(octonion<T>(-o.R_component_1(),-o.R_component_2(),-o.R_component_3(),-o.R_component_4(),-o.R_component_5(),-o.R_component_6(),-o.R_component_7(),-o.R_component_8()));
|
Chris@16
|
1557 }
|
Chris@16
|
1558
|
Chris@16
|
1559
|
Chris@16
|
1560 template<typename T>
|
Chris@16
|
1561 inline bool operator == (T const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1562 {
|
Chris@16
|
1563 return(
|
Chris@16
|
1564 (rhs.R_component_1() == lhs)&&
|
Chris@16
|
1565 (rhs.R_component_2() == static_cast<T>(0))&&
|
Chris@16
|
1566 (rhs.R_component_3() == static_cast<T>(0))&&
|
Chris@16
|
1567 (rhs.R_component_4() == static_cast<T>(0))&&
|
Chris@16
|
1568 (rhs.R_component_5() == static_cast<T>(0))&&
|
Chris@16
|
1569 (rhs.R_component_6() == static_cast<T>(0))&&
|
Chris@16
|
1570 (rhs.R_component_7() == static_cast<T>(0))&&
|
Chris@16
|
1571 (rhs.R_component_8() == static_cast<T>(0))
|
Chris@16
|
1572 );
|
Chris@16
|
1573 }
|
Chris@16
|
1574
|
Chris@16
|
1575
|
Chris@16
|
1576 template<typename T>
|
Chris@16
|
1577 inline bool operator == (octonion<T> const & lhs, T const & rhs)
|
Chris@16
|
1578 {
|
Chris@16
|
1579 return(
|
Chris@16
|
1580 (lhs.R_component_1() == rhs)&&
|
Chris@16
|
1581 (lhs.R_component_2() == static_cast<T>(0))&&
|
Chris@16
|
1582 (lhs.R_component_3() == static_cast<T>(0))&&
|
Chris@16
|
1583 (lhs.R_component_4() == static_cast<T>(0))&&
|
Chris@16
|
1584 (lhs.R_component_5() == static_cast<T>(0))&&
|
Chris@16
|
1585 (lhs.R_component_6() == static_cast<T>(0))&&
|
Chris@16
|
1586 (lhs.R_component_7() == static_cast<T>(0))&&
|
Chris@16
|
1587 (lhs.R_component_8() == static_cast<T>(0))
|
Chris@16
|
1588 );
|
Chris@16
|
1589 }
|
Chris@16
|
1590
|
Chris@16
|
1591
|
Chris@16
|
1592 template<typename T>
|
Chris@16
|
1593 inline bool operator == (::std::complex<T> const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1594 {
|
Chris@16
|
1595 return(
|
Chris@16
|
1596 (rhs.R_component_1() == lhs.real())&&
|
Chris@16
|
1597 (rhs.R_component_2() == lhs.imag())&&
|
Chris@16
|
1598 (rhs.R_component_3() == static_cast<T>(0))&&
|
Chris@16
|
1599 (rhs.R_component_4() == static_cast<T>(0))&&
|
Chris@16
|
1600 (rhs.R_component_5() == static_cast<T>(0))&&
|
Chris@16
|
1601 (rhs.R_component_6() == static_cast<T>(0))&&
|
Chris@16
|
1602 (rhs.R_component_7() == static_cast<T>(0))&&
|
Chris@16
|
1603 (rhs.R_component_8() == static_cast<T>(0))
|
Chris@16
|
1604 );
|
Chris@16
|
1605 }
|
Chris@16
|
1606
|
Chris@16
|
1607
|
Chris@16
|
1608 template<typename T>
|
Chris@16
|
1609 inline bool operator == (octonion<T> const & lhs, ::std::complex<T> const & rhs)
|
Chris@16
|
1610 {
|
Chris@16
|
1611 return(
|
Chris@16
|
1612 (lhs.R_component_1() == rhs.real())&&
|
Chris@16
|
1613 (lhs.R_component_2() == rhs.imag())&&
|
Chris@16
|
1614 (lhs.R_component_3() == static_cast<T>(0))&&
|
Chris@16
|
1615 (lhs.R_component_4() == static_cast<T>(0))&&
|
Chris@16
|
1616 (lhs.R_component_5() == static_cast<T>(0))&&
|
Chris@16
|
1617 (lhs.R_component_6() == static_cast<T>(0))&&
|
Chris@16
|
1618 (lhs.R_component_7() == static_cast<T>(0))&&
|
Chris@16
|
1619 (lhs.R_component_8() == static_cast<T>(0))
|
Chris@16
|
1620 );
|
Chris@16
|
1621 }
|
Chris@16
|
1622
|
Chris@16
|
1623
|
Chris@16
|
1624 template<typename T>
|
Chris@16
|
1625 inline bool operator == (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1626 {
|
Chris@16
|
1627 return(
|
Chris@16
|
1628 (rhs.R_component_1() == lhs.R_component_1())&&
|
Chris@16
|
1629 (rhs.R_component_2() == lhs.R_component_2())&&
|
Chris@16
|
1630 (rhs.R_component_3() == lhs.R_component_3())&&
|
Chris@16
|
1631 (rhs.R_component_4() == lhs.R_component_4())&&
|
Chris@16
|
1632 (rhs.R_component_5() == static_cast<T>(0))&&
|
Chris@16
|
1633 (rhs.R_component_6() == static_cast<T>(0))&&
|
Chris@16
|
1634 (rhs.R_component_7() == static_cast<T>(0))&&
|
Chris@16
|
1635 (rhs.R_component_8() == static_cast<T>(0))
|
Chris@16
|
1636 );
|
Chris@16
|
1637 }
|
Chris@16
|
1638
|
Chris@16
|
1639
|
Chris@16
|
1640 template<typename T>
|
Chris@16
|
1641 inline bool operator == (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs)
|
Chris@16
|
1642 {
|
Chris@16
|
1643 return(
|
Chris@16
|
1644 (lhs.R_component_1() == rhs.R_component_1())&&
|
Chris@16
|
1645 (lhs.R_component_2() == rhs.R_component_2())&&
|
Chris@16
|
1646 (lhs.R_component_3() == rhs.R_component_3())&&
|
Chris@16
|
1647 (lhs.R_component_4() == rhs.R_component_4())&&
|
Chris@16
|
1648 (lhs.R_component_5() == static_cast<T>(0))&&
|
Chris@16
|
1649 (lhs.R_component_6() == static_cast<T>(0))&&
|
Chris@16
|
1650 (lhs.R_component_7() == static_cast<T>(0))&&
|
Chris@16
|
1651 (lhs.R_component_8() == static_cast<T>(0))
|
Chris@16
|
1652 );
|
Chris@16
|
1653 }
|
Chris@16
|
1654
|
Chris@16
|
1655
|
Chris@16
|
1656 template<typename T>
|
Chris@16
|
1657 inline bool operator == (octonion<T> const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1658 {
|
Chris@16
|
1659 return(
|
Chris@16
|
1660 (rhs.R_component_1() == lhs.R_component_1())&&
|
Chris@16
|
1661 (rhs.R_component_2() == lhs.R_component_2())&&
|
Chris@16
|
1662 (rhs.R_component_3() == lhs.R_component_3())&&
|
Chris@16
|
1663 (rhs.R_component_4() == lhs.R_component_4())&&
|
Chris@16
|
1664 (rhs.R_component_5() == lhs.R_component_5())&&
|
Chris@16
|
1665 (rhs.R_component_6() == lhs.R_component_6())&&
|
Chris@16
|
1666 (rhs.R_component_7() == lhs.R_component_7())&&
|
Chris@16
|
1667 (rhs.R_component_8() == lhs.R_component_8())
|
Chris@16
|
1668 );
|
Chris@16
|
1669 }
|
Chris@16
|
1670
|
Chris@16
|
1671
|
Chris@16
|
1672 #define BOOST_OCTONION_NOT_EQUAL_GENERATOR \
|
Chris@16
|
1673 { \
|
Chris@16
|
1674 return(!(lhs == rhs)); \
|
Chris@16
|
1675 }
|
Chris@16
|
1676
|
Chris@16
|
1677 template<typename T>
|
Chris@16
|
1678 inline bool operator != (T const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1679 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1680
|
Chris@16
|
1681 template<typename T>
|
Chris@16
|
1682 inline bool operator != (octonion<T> const & lhs, T const & rhs)
|
Chris@16
|
1683 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1684
|
Chris@16
|
1685 template<typename T>
|
Chris@16
|
1686 inline bool operator != (::std::complex<T> const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1687 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1688
|
Chris@16
|
1689 template<typename T>
|
Chris@16
|
1690 inline bool operator != (octonion<T> const & lhs, ::std::complex<T> const & rhs)
|
Chris@16
|
1691 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1692
|
Chris@16
|
1693 template<typename T>
|
Chris@16
|
1694 inline bool operator != (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1695 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1696
|
Chris@16
|
1697 template<typename T>
|
Chris@16
|
1698 inline bool operator != (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs)
|
Chris@16
|
1699 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1700
|
Chris@16
|
1701 template<typename T>
|
Chris@16
|
1702 inline bool operator != (octonion<T> const & lhs, octonion<T> const & rhs)
|
Chris@16
|
1703 BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1704
|
Chris@16
|
1705 #undef BOOST_OCTONION_NOT_EQUAL_GENERATOR
|
Chris@16
|
1706
|
Chris@16
|
1707
|
Chris@16
|
1708 // Note: the default values in the constructors of the complex and quaternions make for
|
Chris@16
|
1709 // a very complex and ambiguous situation; we have made choices to disambiguate.
|
Chris@16
|
1710 template<typename T, typename charT, class traits>
|
Chris@16
|
1711 ::std::basic_istream<charT,traits> & operator >> ( ::std::basic_istream<charT,traits> & is,
|
Chris@16
|
1712 octonion<T> & o)
|
Chris@16
|
1713 {
|
Chris@16
|
1714 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1715 #else
|
Chris@16
|
1716 const ::std::ctype<charT> & ct = ::std::use_facet< ::std::ctype<charT> >(is.getloc());
|
Chris@16
|
1717 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1718
|
Chris@16
|
1719 T a = T();
|
Chris@16
|
1720 T b = T();
|
Chris@16
|
1721 T c = T();
|
Chris@16
|
1722 T d = T();
|
Chris@16
|
1723 T e = T();
|
Chris@16
|
1724 T f = T();
|
Chris@16
|
1725 T g = T();
|
Chris@16
|
1726 T h = T();
|
Chris@16
|
1727
|
Chris@16
|
1728 ::std::complex<T> u = ::std::complex<T>();
|
Chris@16
|
1729 ::std::complex<T> v = ::std::complex<T>();
|
Chris@16
|
1730 ::std::complex<T> x = ::std::complex<T>();
|
Chris@16
|
1731 ::std::complex<T> y = ::std::complex<T>();
|
Chris@16
|
1732
|
Chris@16
|
1733 ::boost::math::quaternion<T> p = ::boost::math::quaternion<T>();
|
Chris@16
|
1734 ::boost::math::quaternion<T> q = ::boost::math::quaternion<T>();
|
Chris@16
|
1735
|
Chris@16
|
1736 charT ch = charT();
|
Chris@16
|
1737 char cc;
|
Chris@16
|
1738
|
Chris@16
|
1739 is >> ch; // get the first lexeme
|
Chris@16
|
1740
|
Chris@16
|
1741 if (!is.good()) goto finish;
|
Chris@16
|
1742
|
Chris@16
|
1743 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1744 cc = ch;
|
Chris@16
|
1745 #else
|
Chris@16
|
1746 cc = ct.narrow(ch, char());
|
Chris@16
|
1747 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1748
|
Chris@16
|
1749 if (cc == '(') // read "("
|
Chris@16
|
1750 {
|
Chris@16
|
1751 is >> ch; // get the second lexeme
|
Chris@16
|
1752
|
Chris@16
|
1753 if (!is.good()) goto finish;
|
Chris@16
|
1754
|
Chris@16
|
1755 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1756 cc = ch;
|
Chris@16
|
1757 #else
|
Chris@16
|
1758 cc = ct.narrow(ch, char());
|
Chris@16
|
1759 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1760
|
Chris@16
|
1761 if (cc == '(') // read "(("
|
Chris@16
|
1762 {
|
Chris@16
|
1763 is >> ch; // get the third lexeme
|
Chris@16
|
1764
|
Chris@16
|
1765 if (!is.good()) goto finish;
|
Chris@16
|
1766
|
Chris@16
|
1767 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1768 cc = ch;
|
Chris@16
|
1769 #else
|
Chris@16
|
1770 cc = ct.narrow(ch, char());
|
Chris@16
|
1771 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1772
|
Chris@16
|
1773 if (cc == '(') // read "((("
|
Chris@16
|
1774 {
|
Chris@16
|
1775 is.putback(ch);
|
Chris@16
|
1776
|
Chris@16
|
1777 is >> u; // read "((u"
|
Chris@16
|
1778
|
Chris@16
|
1779 if (!is.good()) goto finish;
|
Chris@16
|
1780
|
Chris@16
|
1781 is >> ch; // get the next lexeme
|
Chris@16
|
1782
|
Chris@16
|
1783 if (!is.good()) goto finish;
|
Chris@16
|
1784
|
Chris@16
|
1785 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1786 cc = ch;
|
Chris@16
|
1787 #else
|
Chris@16
|
1788 cc = ct.narrow(ch, char());
|
Chris@16
|
1789 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1790
|
Chris@16
|
1791 if (cc == ')') // read "((u)"
|
Chris@16
|
1792 {
|
Chris@16
|
1793 is >> ch; // get the next lexeme
|
Chris@16
|
1794
|
Chris@16
|
1795 if (!is.good()) goto finish;
|
Chris@16
|
1796
|
Chris@16
|
1797 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1798 cc = ch;
|
Chris@16
|
1799 #else
|
Chris@16
|
1800 cc = ct.narrow(ch, char());
|
Chris@16
|
1801 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1802
|
Chris@16
|
1803 if (cc == ')') // format: (((a))), (((a,b)))
|
Chris@16
|
1804 {
|
Chris@16
|
1805 o = octonion<T>(u);
|
Chris@16
|
1806 }
|
Chris@16
|
1807 else if (cc == ',') // read "((u),"
|
Chris@16
|
1808 {
|
Chris@16
|
1809 p = ::boost::math::quaternion<T>(u);
|
Chris@16
|
1810
|
Chris@16
|
1811 is >> q; // read "((u),q"
|
Chris@16
|
1812
|
Chris@16
|
1813 if (!is.good()) goto finish;
|
Chris@16
|
1814
|
Chris@16
|
1815 is >> ch; // get the next lexeme
|
Chris@16
|
1816
|
Chris@16
|
1817 if (!is.good()) goto finish;
|
Chris@16
|
1818
|
Chris@16
|
1819 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1820 cc = ch;
|
Chris@16
|
1821 #else
|
Chris@16
|
1822 cc = ct.narrow(ch, char());
|
Chris@16
|
1823 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1824
|
Chris@16
|
1825 if (cc == ')') // format: (((a)),q), (((a,b)),q)
|
Chris@16
|
1826 {
|
Chris@16
|
1827 o = octonion<T>(p,q);
|
Chris@16
|
1828 }
|
Chris@16
|
1829 else // error
|
Chris@16
|
1830 {
|
Chris@16
|
1831 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
1832 }
|
Chris@16
|
1833 }
|
Chris@16
|
1834 else // error
|
Chris@16
|
1835 {
|
Chris@16
|
1836 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
1837 }
|
Chris@16
|
1838 }
|
Chris@16
|
1839 else if (cc ==',') // read "((u,"
|
Chris@16
|
1840 {
|
Chris@16
|
1841 is >> v; // read "((u,v"
|
Chris@16
|
1842
|
Chris@16
|
1843 if (!is.good()) goto finish;
|
Chris@16
|
1844
|
Chris@16
|
1845 is >> ch; // get the next lexeme
|
Chris@16
|
1846
|
Chris@16
|
1847 if (!is.good()) goto finish;
|
Chris@16
|
1848
|
Chris@16
|
1849 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1850 cc = ch;
|
Chris@16
|
1851 #else
|
Chris@16
|
1852 cc = ct.narrow(ch, char());
|
Chris@16
|
1853 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1854
|
Chris@16
|
1855 if (cc == ')') // read "((u,v)"
|
Chris@16
|
1856 {
|
Chris@16
|
1857 p = ::boost::math::quaternion<T>(u,v);
|
Chris@16
|
1858
|
Chris@16
|
1859 is >> ch; // get the next lexeme
|
Chris@16
|
1860
|
Chris@16
|
1861 if (!is.good()) goto finish;
|
Chris@16
|
1862
|
Chris@16
|
1863 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1864 cc = ch;
|
Chris@16
|
1865 #else
|
Chris@16
|
1866 cc = ct.narrow(ch, char());
|
Chris@16
|
1867 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1868
|
Chris@16
|
1869 if (cc == ')') // format: (((a),v)), (((a,b),v))
|
Chris@16
|
1870 {
|
Chris@16
|
1871 o = octonion<T>(p);
|
Chris@16
|
1872 }
|
Chris@16
|
1873 else if (cc == ',') // read "((u,v),"
|
Chris@16
|
1874 {
|
Chris@16
|
1875 is >> q; // read "(p,q"
|
Chris@16
|
1876
|
Chris@16
|
1877 if (!is.good()) goto finish;
|
Chris@16
|
1878
|
Chris@16
|
1879 is >> ch; // get the next lexeme
|
Chris@16
|
1880
|
Chris@16
|
1881 if (!is.good()) goto finish;
|
Chris@16
|
1882
|
Chris@16
|
1883 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1884 cc = ch;
|
Chris@16
|
1885 #else
|
Chris@16
|
1886 cc = ct.narrow(ch, char());
|
Chris@16
|
1887 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1888
|
Chris@16
|
1889 if (cc == ')') // format: (((a),v),q), (((a,b),v),q)
|
Chris@16
|
1890 {
|
Chris@16
|
1891 o = octonion<T>(p,q);
|
Chris@16
|
1892 }
|
Chris@16
|
1893 else // error
|
Chris@16
|
1894 {
|
Chris@16
|
1895 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
1896 }
|
Chris@16
|
1897 }
|
Chris@16
|
1898 else // error
|
Chris@16
|
1899 {
|
Chris@16
|
1900 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
1901 }
|
Chris@16
|
1902 }
|
Chris@16
|
1903 else // error
|
Chris@16
|
1904 {
|
Chris@16
|
1905 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
1906 }
|
Chris@16
|
1907 }
|
Chris@16
|
1908 else // error
|
Chris@16
|
1909 {
|
Chris@16
|
1910 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
1911 }
|
Chris@16
|
1912 }
|
Chris@16
|
1913 else // read "((a"
|
Chris@16
|
1914 {
|
Chris@16
|
1915 is.putback(ch);
|
Chris@16
|
1916
|
Chris@16
|
1917 is >> a; // we extract the first component
|
Chris@16
|
1918
|
Chris@16
|
1919 if (!is.good()) goto finish;
|
Chris@16
|
1920
|
Chris@16
|
1921 is >> ch; // get the next lexeme
|
Chris@16
|
1922
|
Chris@16
|
1923 if (!is.good()) goto finish;
|
Chris@16
|
1924
|
Chris@16
|
1925 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1926 cc = ch;
|
Chris@16
|
1927 #else
|
Chris@16
|
1928 cc = ct.narrow(ch, char());
|
Chris@16
|
1929 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1930
|
Chris@16
|
1931 if (cc == ')') // read "((a)"
|
Chris@16
|
1932 {
|
Chris@16
|
1933 is >> ch; // get the next lexeme
|
Chris@16
|
1934
|
Chris@16
|
1935 if (!is.good()) goto finish;
|
Chris@16
|
1936
|
Chris@16
|
1937 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1938 cc = ch;
|
Chris@16
|
1939 #else
|
Chris@16
|
1940 cc = ct.narrow(ch, char());
|
Chris@16
|
1941 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1942
|
Chris@16
|
1943 if (cc == ')') // read "((a))"
|
Chris@16
|
1944 {
|
Chris@16
|
1945 o = octonion<T>(a);
|
Chris@16
|
1946 }
|
Chris@16
|
1947 else if (cc == ',') // read "((a),"
|
Chris@16
|
1948 {
|
Chris@16
|
1949 is >> ch; // get the next lexeme
|
Chris@16
|
1950
|
Chris@16
|
1951 if (!is.good()) goto finish;
|
Chris@16
|
1952
|
Chris@16
|
1953 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1954 cc = ch;
|
Chris@16
|
1955 #else
|
Chris@16
|
1956 cc = ct.narrow(ch, char());
|
Chris@16
|
1957 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1958
|
Chris@16
|
1959 if (cc == '(') // read "((a),("
|
Chris@16
|
1960 {
|
Chris@16
|
1961 is >> ch; // get the next lexeme
|
Chris@16
|
1962
|
Chris@16
|
1963 if (!is.good()) goto finish;
|
Chris@16
|
1964
|
Chris@16
|
1965 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1966 cc = ch;
|
Chris@16
|
1967 #else
|
Chris@16
|
1968 cc = ct.narrow(ch, char());
|
Chris@16
|
1969 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1970
|
Chris@16
|
1971 if (cc == '(') // read "((a),(("
|
Chris@16
|
1972 {
|
Chris@16
|
1973 is.putback(ch);
|
Chris@16
|
1974
|
Chris@16
|
1975 is.putback(ch); // we backtrack twice, with the same value!
|
Chris@16
|
1976
|
Chris@16
|
1977 is >> q; // read "((a),q"
|
Chris@16
|
1978
|
Chris@16
|
1979 if (!is.good()) goto finish;
|
Chris@16
|
1980
|
Chris@16
|
1981 is >> ch; // get the next lexeme
|
Chris@16
|
1982
|
Chris@16
|
1983 if (!is.good()) goto finish;
|
Chris@16
|
1984
|
Chris@16
|
1985 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
1986 cc = ch;
|
Chris@16
|
1987 #else
|
Chris@16
|
1988 cc = ct.narrow(ch, char());
|
Chris@16
|
1989 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
1990
|
Chris@16
|
1991 if (cc == ')') // read "((a),q)"
|
Chris@16
|
1992 {
|
Chris@16
|
1993 p = ::boost::math::quaternion<T>(a);
|
Chris@16
|
1994
|
Chris@16
|
1995 o = octonion<T>(p,q);
|
Chris@16
|
1996 }
|
Chris@16
|
1997 else // error
|
Chris@16
|
1998 {
|
Chris@16
|
1999 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2000 }
|
Chris@16
|
2001 }
|
Chris@16
|
2002 else // read "((a),(c" or "((a),(e"
|
Chris@16
|
2003 {
|
Chris@16
|
2004 is.putback(ch);
|
Chris@16
|
2005
|
Chris@16
|
2006 is >> c;
|
Chris@16
|
2007
|
Chris@16
|
2008 if (!is.good()) goto finish;
|
Chris@16
|
2009
|
Chris@16
|
2010 is >> ch; // get the next lexeme
|
Chris@16
|
2011
|
Chris@16
|
2012 if (!is.good()) goto finish;
|
Chris@16
|
2013
|
Chris@16
|
2014 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2015 cc = ch;
|
Chris@16
|
2016 #else
|
Chris@16
|
2017 cc = ct.narrow(ch, char());
|
Chris@16
|
2018 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2019
|
Chris@16
|
2020 if (cc == ')') // read "((a),(c)" (ambiguity resolution)
|
Chris@16
|
2021 {
|
Chris@16
|
2022 is >> ch; // get the next lexeme
|
Chris@16
|
2023
|
Chris@16
|
2024 if (!is.good()) goto finish;
|
Chris@16
|
2025
|
Chris@16
|
2026 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2027 cc = ch;
|
Chris@16
|
2028 #else
|
Chris@16
|
2029 cc = ct.narrow(ch, char());
|
Chris@16
|
2030 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2031
|
Chris@16
|
2032 if (cc == ')') // read "((a),(c))"
|
Chris@16
|
2033 {
|
Chris@16
|
2034 o = octonion<T>(a,b,c);
|
Chris@16
|
2035 }
|
Chris@16
|
2036 else if (cc == ',') // read "((a),(c),"
|
Chris@16
|
2037 {
|
Chris@16
|
2038 u = ::std::complex<T>(a);
|
Chris@16
|
2039
|
Chris@16
|
2040 v = ::std::complex<T>(c);
|
Chris@16
|
2041
|
Chris@16
|
2042 is >> x; // read "((a),(c),x"
|
Chris@16
|
2043
|
Chris@16
|
2044 if (!is.good()) goto finish;
|
Chris@16
|
2045
|
Chris@16
|
2046 is >> ch; // get the next lexeme
|
Chris@16
|
2047
|
Chris@16
|
2048 if (!is.good()) goto finish;
|
Chris@16
|
2049
|
Chris@16
|
2050 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2051 cc = ch;
|
Chris@16
|
2052 #else
|
Chris@16
|
2053 cc = ct.narrow(ch, char());
|
Chris@16
|
2054 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2055
|
Chris@16
|
2056 if (cc == ')') // read "((a),(c),x)"
|
Chris@16
|
2057 {
|
Chris@16
|
2058 o = octonion<T>(u,v,x);
|
Chris@16
|
2059 }
|
Chris@16
|
2060 else if (cc == ',') // read "((a),(c),x,"
|
Chris@16
|
2061 {
|
Chris@16
|
2062 is >> y; // read "((a),(c),x,y"
|
Chris@16
|
2063
|
Chris@16
|
2064 if (!is.good()) goto finish;
|
Chris@16
|
2065
|
Chris@16
|
2066 is >> ch; // get the next lexeme
|
Chris@16
|
2067
|
Chris@16
|
2068 if (!is.good()) goto finish;
|
Chris@16
|
2069
|
Chris@16
|
2070 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2071 cc = ch;
|
Chris@16
|
2072 #else
|
Chris@16
|
2073 cc = ct.narrow(ch, char());
|
Chris@16
|
2074 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2075
|
Chris@16
|
2076 if (cc == ')') // read "((a),(c),x,y)"
|
Chris@16
|
2077 {
|
Chris@16
|
2078 o = octonion<T>(u,v,x,y);
|
Chris@16
|
2079 }
|
Chris@16
|
2080 else // error
|
Chris@16
|
2081 {
|
Chris@16
|
2082 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2083 }
|
Chris@16
|
2084 }
|
Chris@16
|
2085 else // error
|
Chris@16
|
2086 {
|
Chris@16
|
2087 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2088 }
|
Chris@16
|
2089 }
|
Chris@16
|
2090 else // error
|
Chris@16
|
2091 {
|
Chris@16
|
2092 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2093 }
|
Chris@16
|
2094 }
|
Chris@16
|
2095 else if (cc == ',') // read "((a),(c," or "((a),(e,"
|
Chris@16
|
2096 {
|
Chris@16
|
2097 is >> ch; // get the next lexeme
|
Chris@16
|
2098
|
Chris@16
|
2099 if (!is.good()) goto finish;
|
Chris@16
|
2100
|
Chris@16
|
2101 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2102 cc = ch;
|
Chris@16
|
2103 #else
|
Chris@16
|
2104 cc = ct.narrow(ch, char());
|
Chris@16
|
2105 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2106
|
Chris@16
|
2107 if (cc == '(') // read "((a),(e,(" (ambiguity resolution)
|
Chris@16
|
2108 {
|
Chris@16
|
2109 p = ::boost::math::quaternion<T>(a);
|
Chris@16
|
2110
|
Chris@16
|
2111 x = ::std::complex<T>(c); // "c" was actually "e"
|
Chris@16
|
2112
|
Chris@16
|
2113 is.putback(ch); // we can only backtrace once
|
Chris@16
|
2114
|
Chris@16
|
2115 is >> y; // read "((a),(e,y"
|
Chris@16
|
2116
|
Chris@16
|
2117 if (!is.good()) goto finish;
|
Chris@16
|
2118
|
Chris@16
|
2119 is >> ch; // get the next lexeme
|
Chris@16
|
2120
|
Chris@16
|
2121 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2122 cc = ch;
|
Chris@16
|
2123 #else
|
Chris@16
|
2124 cc = ct.narrow(ch, char());
|
Chris@16
|
2125 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2126
|
Chris@16
|
2127 if (cc == ')') // read "((a),(e,y)"
|
Chris@16
|
2128 {
|
Chris@16
|
2129 q = ::boost::math::quaternion<T>(x,y);
|
Chris@16
|
2130
|
Chris@16
|
2131 is >> ch; // get the next lexeme
|
Chris@16
|
2132
|
Chris@16
|
2133 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2134 cc = ch;
|
Chris@16
|
2135 #else
|
Chris@16
|
2136 cc = ct.narrow(ch, char());
|
Chris@16
|
2137 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2138
|
Chris@16
|
2139 if (cc == ')') // read "((a),(e,y))"
|
Chris@16
|
2140 {
|
Chris@16
|
2141 o = octonion<T>(p,q);
|
Chris@16
|
2142 }
|
Chris@16
|
2143 else // error
|
Chris@16
|
2144 {
|
Chris@16
|
2145 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2146 }
|
Chris@16
|
2147 }
|
Chris@16
|
2148 else // error
|
Chris@16
|
2149 {
|
Chris@16
|
2150 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2151 }
|
Chris@16
|
2152 }
|
Chris@16
|
2153 else // read "((a),(c,d" or "((a),(e,f"
|
Chris@16
|
2154 {
|
Chris@16
|
2155 is.putback(ch);
|
Chris@16
|
2156
|
Chris@16
|
2157 is >> d;
|
Chris@16
|
2158
|
Chris@16
|
2159 if (!is.good()) goto finish;
|
Chris@16
|
2160
|
Chris@16
|
2161 is >> ch; // get the next lexeme
|
Chris@16
|
2162
|
Chris@16
|
2163 if (!is.good()) goto finish;
|
Chris@16
|
2164
|
Chris@16
|
2165 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2166 cc = ch;
|
Chris@16
|
2167 #else
|
Chris@16
|
2168 cc = ct.narrow(ch, char());
|
Chris@16
|
2169 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2170
|
Chris@16
|
2171 if (cc == ')') // read "((a),(c,d)" (ambiguity resolution)
|
Chris@16
|
2172 {
|
Chris@16
|
2173 is >> ch; // get the next lexeme
|
Chris@16
|
2174
|
Chris@16
|
2175 if (!is.good()) goto finish;
|
Chris@16
|
2176
|
Chris@16
|
2177 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2178 cc = ch;
|
Chris@16
|
2179 #else
|
Chris@16
|
2180 cc = ct.narrow(ch, char());
|
Chris@16
|
2181 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2182
|
Chris@16
|
2183 if (cc == ')') // read "((a),(c,d))"
|
Chris@16
|
2184 {
|
Chris@16
|
2185 o = octonion<T>(a,b,c,d);
|
Chris@16
|
2186 }
|
Chris@16
|
2187 else if (cc == ',') // read "((a),(c,d),"
|
Chris@16
|
2188 {
|
Chris@16
|
2189 u = ::std::complex<T>(a);
|
Chris@16
|
2190
|
Chris@16
|
2191 v = ::std::complex<T>(c,d);
|
Chris@16
|
2192
|
Chris@16
|
2193 is >> x; // read "((a),(c,d),x"
|
Chris@16
|
2194
|
Chris@16
|
2195 if (!is.good()) goto finish;
|
Chris@16
|
2196
|
Chris@16
|
2197 is >> ch; // get the next lexeme
|
Chris@16
|
2198
|
Chris@16
|
2199 if (!is.good()) goto finish;
|
Chris@16
|
2200
|
Chris@16
|
2201 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2202 cc = ch;
|
Chris@16
|
2203 #else
|
Chris@16
|
2204 cc = ct.narrow(ch, char());
|
Chris@16
|
2205 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2206
|
Chris@16
|
2207 if (cc == ')') // read "((a),(c,d),x)"
|
Chris@16
|
2208 {
|
Chris@16
|
2209 o = octonion<T>(u,v,x);
|
Chris@16
|
2210 }
|
Chris@16
|
2211 else if (cc == ',') // read "((a),(c,d),x,"
|
Chris@16
|
2212 {
|
Chris@16
|
2213 is >> y; // read "((a),(c,d),x,y"
|
Chris@16
|
2214
|
Chris@16
|
2215 if (!is.good()) goto finish;
|
Chris@16
|
2216
|
Chris@16
|
2217 is >> ch; // get the next lexeme
|
Chris@16
|
2218
|
Chris@16
|
2219 if (!is.good()) goto finish;
|
Chris@16
|
2220
|
Chris@16
|
2221 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2222 cc = ch;
|
Chris@16
|
2223 #else
|
Chris@16
|
2224 cc = ct.narrow(ch, char());
|
Chris@16
|
2225 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2226
|
Chris@16
|
2227 if (cc == ')') // read "((a),(c,d),x,y)"
|
Chris@16
|
2228 {
|
Chris@16
|
2229 o = octonion<T>(u,v,x,y);
|
Chris@16
|
2230 }
|
Chris@16
|
2231 else // error
|
Chris@16
|
2232 {
|
Chris@16
|
2233 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2234 }
|
Chris@16
|
2235 }
|
Chris@16
|
2236 else // error
|
Chris@16
|
2237 {
|
Chris@16
|
2238 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2239 }
|
Chris@16
|
2240 }
|
Chris@16
|
2241 else // error
|
Chris@16
|
2242 {
|
Chris@16
|
2243 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2244 }
|
Chris@16
|
2245 }
|
Chris@16
|
2246 else if (cc == ',') // read "((a),(e,f," (ambiguity resolution)
|
Chris@16
|
2247 {
|
Chris@16
|
2248 p = ::boost::math::quaternion<T>(a);
|
Chris@16
|
2249
|
Chris@16
|
2250 is >> g; // read "((a),(e,f,g" (too late to backtrack)
|
Chris@16
|
2251
|
Chris@16
|
2252 if (!is.good()) goto finish;
|
Chris@16
|
2253
|
Chris@16
|
2254 is >> ch; // get the next lexeme
|
Chris@16
|
2255
|
Chris@16
|
2256 if (!is.good()) goto finish;
|
Chris@16
|
2257
|
Chris@16
|
2258 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2259 cc = ch;
|
Chris@16
|
2260 #else
|
Chris@16
|
2261 cc = ct.narrow(ch, char());
|
Chris@16
|
2262 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2263
|
Chris@16
|
2264 if (cc == ')') // read "((a),(e,f,g)"
|
Chris@16
|
2265 {
|
Chris@16
|
2266 q = ::boost::math::quaternion<T>(c,d,g); // "c" was actually "e", and "d" was actually "f"
|
Chris@16
|
2267
|
Chris@16
|
2268 is >> ch; // get the next lexeme
|
Chris@16
|
2269
|
Chris@16
|
2270 if (!is.good()) goto finish;
|
Chris@16
|
2271
|
Chris@16
|
2272 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2273 cc = ch;
|
Chris@16
|
2274 #else
|
Chris@16
|
2275 cc = ct.narrow(ch, char());
|
Chris@16
|
2276 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2277
|
Chris@16
|
2278 if (cc == ')') // read "((a),(e,f,g))"
|
Chris@16
|
2279 {
|
Chris@16
|
2280 o = octonion<T>(p,q);
|
Chris@16
|
2281 }
|
Chris@16
|
2282 else // error
|
Chris@16
|
2283 {
|
Chris@16
|
2284 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2285 }
|
Chris@16
|
2286 }
|
Chris@16
|
2287 else if (cc == ',') // read "((a),(e,f,g,"
|
Chris@16
|
2288 {
|
Chris@16
|
2289 is >> h; // read "((a),(e,f,g,h"
|
Chris@16
|
2290
|
Chris@16
|
2291 if (!is.good()) goto finish;
|
Chris@16
|
2292
|
Chris@16
|
2293 is >> ch; // get the next lexeme
|
Chris@16
|
2294
|
Chris@16
|
2295 if (!is.good()) goto finish;
|
Chris@16
|
2296
|
Chris@16
|
2297 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2298 cc = ch;
|
Chris@16
|
2299 #else
|
Chris@16
|
2300 cc = ct.narrow(ch, char());
|
Chris@16
|
2301 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2302
|
Chris@16
|
2303 if (cc == ')') // read "((a),(e,f,g,h)"
|
Chris@16
|
2304 {
|
Chris@16
|
2305 q = ::boost::math::quaternion<T>(c,d,g,h); // "c" was actually "e", and "d" was actually "f"
|
Chris@16
|
2306
|
Chris@16
|
2307 is >> ch; // get the next lexeme
|
Chris@16
|
2308
|
Chris@16
|
2309 if (!is.good()) goto finish;
|
Chris@16
|
2310
|
Chris@16
|
2311 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2312 cc = ch;
|
Chris@16
|
2313 #else
|
Chris@16
|
2314 cc = ct.narrow(ch, char());
|
Chris@16
|
2315 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2316
|
Chris@16
|
2317 if (cc == ')') // read "((a),(e,f,g,h))"
|
Chris@16
|
2318 {
|
Chris@16
|
2319 o = octonion<T>(p,q);
|
Chris@16
|
2320 }
|
Chris@16
|
2321 else // error
|
Chris@16
|
2322 {
|
Chris@16
|
2323 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2324 }
|
Chris@16
|
2325 }
|
Chris@16
|
2326 else // error
|
Chris@16
|
2327 {
|
Chris@16
|
2328 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2329 }
|
Chris@16
|
2330 }
|
Chris@16
|
2331 else // error
|
Chris@16
|
2332 {
|
Chris@16
|
2333 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2334 }
|
Chris@16
|
2335 }
|
Chris@16
|
2336 else // error
|
Chris@16
|
2337 {
|
Chris@16
|
2338 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2339 }
|
Chris@16
|
2340 }
|
Chris@16
|
2341 }
|
Chris@16
|
2342 else // error
|
Chris@16
|
2343 {
|
Chris@16
|
2344 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2345 }
|
Chris@16
|
2346 }
|
Chris@16
|
2347 }
|
Chris@16
|
2348 else // read "((a),c" (ambiguity resolution)
|
Chris@16
|
2349 {
|
Chris@16
|
2350 is.putback(ch);
|
Chris@16
|
2351
|
Chris@16
|
2352 is >> c; // we extract the third component
|
Chris@16
|
2353
|
Chris@16
|
2354 if (!is.good()) goto finish;
|
Chris@16
|
2355
|
Chris@16
|
2356 is >> ch; // get the next lexeme
|
Chris@16
|
2357
|
Chris@16
|
2358 if (!is.good()) goto finish;
|
Chris@16
|
2359
|
Chris@16
|
2360 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2361 cc = ch;
|
Chris@16
|
2362 #else
|
Chris@16
|
2363 cc = ct.narrow(ch, char());
|
Chris@16
|
2364 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2365
|
Chris@16
|
2366 if (cc == ')') // read "((a),c)"
|
Chris@16
|
2367 {
|
Chris@16
|
2368 o = octonion<T>(a,b,c);
|
Chris@16
|
2369 }
|
Chris@16
|
2370 else if (cc == ',') // read "((a),c,"
|
Chris@16
|
2371 {
|
Chris@16
|
2372 is >> x; // read "((a),c,x"
|
Chris@16
|
2373
|
Chris@16
|
2374 if (!is.good()) goto finish;
|
Chris@16
|
2375
|
Chris@16
|
2376 is >> ch; // get the next lexeme
|
Chris@16
|
2377
|
Chris@16
|
2378 if (!is.good()) goto finish;
|
Chris@16
|
2379
|
Chris@16
|
2380 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2381 cc = ch;
|
Chris@16
|
2382 #else
|
Chris@16
|
2383 cc = ct.narrow(ch, char());
|
Chris@16
|
2384 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2385
|
Chris@16
|
2386 if (cc == ')') // read "((a),c,x)"
|
Chris@16
|
2387 {
|
Chris@16
|
2388 o = octonion<T>(a,b,c,d,x.real(),x.imag());
|
Chris@16
|
2389 }
|
Chris@16
|
2390 else if (cc == ',') // read "((a),c,x,"
|
Chris@16
|
2391 {
|
Chris@16
|
2392 is >> y;if (!is.good()) goto finish; // read "((a),c,x,y"
|
Chris@16
|
2393
|
Chris@16
|
2394 is >> ch; // get the next lexeme
|
Chris@16
|
2395
|
Chris@16
|
2396 if (!is.good()) goto finish;
|
Chris@16
|
2397
|
Chris@16
|
2398 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2399 cc = ch;
|
Chris@16
|
2400 #else
|
Chris@16
|
2401 cc = ct.narrow(ch, char());
|
Chris@16
|
2402 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2403
|
Chris@16
|
2404 if (cc == ')') // read "((a),c,x,y)"
|
Chris@16
|
2405 {
|
Chris@16
|
2406 o = octonion<T>(a,b,c,d,x.real(),x.imag(),y.real(),y.imag());
|
Chris@16
|
2407 }
|
Chris@16
|
2408 else // error
|
Chris@16
|
2409 {
|
Chris@16
|
2410 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2411 }
|
Chris@16
|
2412 }
|
Chris@16
|
2413 else // error
|
Chris@16
|
2414 {
|
Chris@16
|
2415 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2416 }
|
Chris@16
|
2417 }
|
Chris@16
|
2418 else // error
|
Chris@16
|
2419 {
|
Chris@16
|
2420 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2421 }
|
Chris@16
|
2422 }
|
Chris@16
|
2423 }
|
Chris@16
|
2424 else // error
|
Chris@16
|
2425 {
|
Chris@16
|
2426 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2427 }
|
Chris@16
|
2428 }
|
Chris@16
|
2429 else if (cc ==',') // read "((a,"
|
Chris@16
|
2430 {
|
Chris@16
|
2431 is >> ch; // get the next lexeme
|
Chris@16
|
2432
|
Chris@16
|
2433 if (!is.good()) goto finish;
|
Chris@16
|
2434
|
Chris@16
|
2435 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2436 cc = ch;
|
Chris@16
|
2437 #else
|
Chris@16
|
2438 cc = ct.narrow(ch, char());
|
Chris@16
|
2439 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2440
|
Chris@16
|
2441 if (cc == '(') // read "((a,("
|
Chris@16
|
2442 {
|
Chris@16
|
2443 u = ::std::complex<T>(a);
|
Chris@16
|
2444
|
Chris@16
|
2445 is.putback(ch); // can only backtrack so much
|
Chris@16
|
2446
|
Chris@16
|
2447 is >> v; // read "((a,v"
|
Chris@16
|
2448
|
Chris@16
|
2449 if (!is.good()) goto finish;
|
Chris@16
|
2450
|
Chris@16
|
2451 is >> ch; // get the next lexeme
|
Chris@16
|
2452
|
Chris@16
|
2453 if (!is.good()) goto finish;
|
Chris@16
|
2454
|
Chris@16
|
2455 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2456 cc = ch;
|
Chris@16
|
2457 #else
|
Chris@16
|
2458 cc = ct.narrow(ch, char());
|
Chris@16
|
2459 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2460
|
Chris@16
|
2461 if (cc == ')') // read "((a,v)"
|
Chris@16
|
2462 {
|
Chris@16
|
2463 is >> ch; // get the next lexeme
|
Chris@16
|
2464
|
Chris@16
|
2465 if (!is.good()) goto finish;
|
Chris@16
|
2466
|
Chris@16
|
2467 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2468 cc = ch;
|
Chris@16
|
2469 #else
|
Chris@16
|
2470 cc = ct.narrow(ch, char());
|
Chris@16
|
2471 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2472
|
Chris@16
|
2473 if (cc == ')') // read "((a,v))"
|
Chris@16
|
2474 {
|
Chris@16
|
2475 o = octonion<T>(u,v);
|
Chris@16
|
2476 }
|
Chris@16
|
2477 else if (cc == ',') // read "((a,v),"
|
Chris@16
|
2478 {
|
Chris@16
|
2479 p = ::boost::math::quaternion<T>(u,v);
|
Chris@16
|
2480
|
Chris@16
|
2481 is >> q; // read "((a,v),q"
|
Chris@16
|
2482
|
Chris@16
|
2483 if (!is.good()) goto finish;
|
Chris@16
|
2484
|
Chris@16
|
2485 is >> ch; // get the next lexeme
|
Chris@16
|
2486
|
Chris@16
|
2487 if (!is.good()) goto finish;
|
Chris@16
|
2488
|
Chris@16
|
2489 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2490 cc = ch;
|
Chris@16
|
2491 #else
|
Chris@16
|
2492 cc = ct.narrow(ch, char());
|
Chris@16
|
2493 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2494
|
Chris@16
|
2495 if (cc == ')') // read "((a,v),q)"
|
Chris@16
|
2496 {
|
Chris@16
|
2497 o = octonion<T>(p,q);
|
Chris@16
|
2498 }
|
Chris@16
|
2499 else // error
|
Chris@16
|
2500 {
|
Chris@16
|
2501 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2502 }
|
Chris@16
|
2503 }
|
Chris@16
|
2504 else // error
|
Chris@16
|
2505 {
|
Chris@16
|
2506 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2507 }
|
Chris@16
|
2508 }
|
Chris@16
|
2509 else // error
|
Chris@16
|
2510 {
|
Chris@16
|
2511 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2512 }
|
Chris@16
|
2513 }
|
Chris@16
|
2514 else
|
Chris@16
|
2515 {
|
Chris@16
|
2516 is.putback(ch);
|
Chris@16
|
2517
|
Chris@16
|
2518 is >> b; // read "((a,b"
|
Chris@16
|
2519
|
Chris@16
|
2520 if (!is.good()) goto finish;
|
Chris@16
|
2521
|
Chris@16
|
2522 is >> ch; // get the next lexeme
|
Chris@16
|
2523
|
Chris@16
|
2524 if (!is.good()) goto finish;
|
Chris@16
|
2525
|
Chris@16
|
2526 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2527 cc = ch;
|
Chris@16
|
2528 #else
|
Chris@16
|
2529 cc = ct.narrow(ch, char());
|
Chris@16
|
2530 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2531
|
Chris@16
|
2532 if (cc == ')') // read "((a,b)"
|
Chris@16
|
2533 {
|
Chris@16
|
2534 is >> ch; // get the next lexeme
|
Chris@16
|
2535
|
Chris@16
|
2536 if (!is.good()) goto finish;
|
Chris@16
|
2537
|
Chris@16
|
2538 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2539 cc = ch;
|
Chris@16
|
2540 #else
|
Chris@16
|
2541 cc = ct.narrow(ch, char());
|
Chris@16
|
2542 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2543
|
Chris@16
|
2544 if (cc == ')') // read "((a,b))"
|
Chris@16
|
2545 {
|
Chris@16
|
2546 o = octonion<T>(a,b);
|
Chris@16
|
2547 }
|
Chris@16
|
2548 else if (cc == ',') // read "((a,b),"
|
Chris@16
|
2549 {
|
Chris@16
|
2550 is >> ch; // get the next lexeme
|
Chris@16
|
2551
|
Chris@16
|
2552 if (!is.good()) goto finish;
|
Chris@16
|
2553
|
Chris@16
|
2554 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2555 cc = ch;
|
Chris@16
|
2556 #else
|
Chris@16
|
2557 cc = ct.narrow(ch, char());
|
Chris@16
|
2558 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2559
|
Chris@16
|
2560 if (cc == '(') // read "((a,b),("
|
Chris@16
|
2561 {
|
Chris@16
|
2562 is >> ch; // get the next lexeme
|
Chris@16
|
2563
|
Chris@16
|
2564 if (!is.good()) goto finish;
|
Chris@16
|
2565
|
Chris@16
|
2566 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2567 cc = ch;
|
Chris@16
|
2568 #else
|
Chris@16
|
2569 cc = ct.narrow(ch, char());
|
Chris@16
|
2570 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2571
|
Chris@16
|
2572 if (cc == '(') // read "((a,b),(("
|
Chris@16
|
2573 {
|
Chris@16
|
2574 p = ::boost::math::quaternion<T>(a,b);
|
Chris@16
|
2575
|
Chris@16
|
2576 is.putback(ch);
|
Chris@16
|
2577
|
Chris@16
|
2578 is.putback(ch); // we backtrack twice, with the same value
|
Chris@16
|
2579
|
Chris@16
|
2580 is >> q; // read "((a,b),q"
|
Chris@16
|
2581
|
Chris@16
|
2582 if (!is.good()) goto finish;
|
Chris@16
|
2583
|
Chris@16
|
2584 is >> ch; // get the next lexeme
|
Chris@16
|
2585
|
Chris@16
|
2586 if (!is.good()) goto finish;
|
Chris@16
|
2587
|
Chris@16
|
2588 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2589 cc = ch;
|
Chris@16
|
2590 #else
|
Chris@16
|
2591 cc = ct.narrow(ch, char());
|
Chris@16
|
2592 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2593
|
Chris@16
|
2594 if (cc == ')') // read "((a,b),q)"
|
Chris@16
|
2595 {
|
Chris@16
|
2596 o = octonion<T>(p,q);
|
Chris@16
|
2597 }
|
Chris@16
|
2598 else // error
|
Chris@16
|
2599 {
|
Chris@16
|
2600 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2601 }
|
Chris@16
|
2602 }
|
Chris@16
|
2603 else // read "((a,b),(c" or "((a,b),(e"
|
Chris@16
|
2604 {
|
Chris@16
|
2605 is.putback(ch);
|
Chris@16
|
2606
|
Chris@16
|
2607 is >> c;
|
Chris@16
|
2608
|
Chris@16
|
2609 if (!is.good()) goto finish;
|
Chris@16
|
2610
|
Chris@16
|
2611 is >> ch; // get the next lexeme
|
Chris@16
|
2612
|
Chris@16
|
2613 if (!is.good()) goto finish;
|
Chris@16
|
2614
|
Chris@16
|
2615 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2616 cc = ch;
|
Chris@16
|
2617 #else
|
Chris@16
|
2618 cc = ct.narrow(ch, char());
|
Chris@16
|
2619 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2620
|
Chris@16
|
2621 if (cc == ')') // read "((a,b),(c)" (ambiguity resolution)
|
Chris@16
|
2622 {
|
Chris@16
|
2623 is >> ch; // get the next lexeme
|
Chris@16
|
2624
|
Chris@16
|
2625 if (!is.good()) goto finish;
|
Chris@16
|
2626
|
Chris@16
|
2627 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2628 cc = ch;
|
Chris@16
|
2629 #else
|
Chris@16
|
2630 cc = ct.narrow(ch, char());
|
Chris@16
|
2631 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2632
|
Chris@16
|
2633 if (cc == ')') // read "((a,b),(c))"
|
Chris@16
|
2634 {
|
Chris@16
|
2635 o = octonion<T>(a,b,c);
|
Chris@16
|
2636 }
|
Chris@16
|
2637 else if (cc == ',') // read "((a,b),(c),"
|
Chris@16
|
2638 {
|
Chris@16
|
2639 u = ::std::complex<T>(a,b);
|
Chris@16
|
2640
|
Chris@16
|
2641 v = ::std::complex<T>(c);
|
Chris@16
|
2642
|
Chris@16
|
2643 is >> x; // read "((a,b),(c),x"
|
Chris@16
|
2644
|
Chris@16
|
2645 if (!is.good()) goto finish;
|
Chris@16
|
2646
|
Chris@16
|
2647 is >> ch; // get the next lexeme
|
Chris@16
|
2648
|
Chris@16
|
2649 if (!is.good()) goto finish;
|
Chris@16
|
2650
|
Chris@16
|
2651 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2652 cc = ch;
|
Chris@16
|
2653 #else
|
Chris@16
|
2654 cc = ct.narrow(ch, char());
|
Chris@16
|
2655 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2656
|
Chris@16
|
2657 if (cc == ')') // read "((a,b),(c),x)"
|
Chris@16
|
2658 {
|
Chris@16
|
2659 o = octonion<T>(u,v,x);
|
Chris@16
|
2660 }
|
Chris@16
|
2661 else if (cc == ',') // read "((a,b),(c),x,"
|
Chris@16
|
2662 {
|
Chris@16
|
2663 is >> y; // read "((a,b),(c),x,y"
|
Chris@16
|
2664
|
Chris@16
|
2665 if (!is.good()) goto finish;
|
Chris@16
|
2666
|
Chris@16
|
2667 is >> ch; // get the next lexeme
|
Chris@16
|
2668
|
Chris@16
|
2669 if (!is.good()) goto finish;
|
Chris@16
|
2670
|
Chris@16
|
2671 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2672 cc = ch;
|
Chris@16
|
2673 #else
|
Chris@16
|
2674 cc = ct.narrow(ch, char());
|
Chris@16
|
2675 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2676
|
Chris@16
|
2677 if (cc == ')') // read "((a,b),(c),x,y)"
|
Chris@16
|
2678 {
|
Chris@16
|
2679 o = octonion<T>(u,v,x,y);
|
Chris@16
|
2680 }
|
Chris@16
|
2681 else // error
|
Chris@16
|
2682 {
|
Chris@16
|
2683 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2684 }
|
Chris@16
|
2685 }
|
Chris@16
|
2686 else // error
|
Chris@16
|
2687 {
|
Chris@16
|
2688 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2689 }
|
Chris@16
|
2690 }
|
Chris@16
|
2691 else // error
|
Chris@16
|
2692 {
|
Chris@16
|
2693 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2694 }
|
Chris@16
|
2695 }
|
Chris@16
|
2696 else if (cc == ',') // read "((a,b),(c," or "((a,b),(e,"
|
Chris@16
|
2697 {
|
Chris@16
|
2698 is >> ch; // get the next lexeme
|
Chris@16
|
2699
|
Chris@16
|
2700 if (!is.good()) goto finish;
|
Chris@16
|
2701
|
Chris@16
|
2702 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2703 cc = ch;
|
Chris@16
|
2704 #else
|
Chris@16
|
2705 cc = ct.narrow(ch, char());
|
Chris@16
|
2706 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2707
|
Chris@16
|
2708 if (cc == '(') // read "((a,b),(e,(" (ambiguity resolution)
|
Chris@16
|
2709 {
|
Chris@16
|
2710 u = ::std::complex<T>(a,b);
|
Chris@16
|
2711
|
Chris@16
|
2712 x = ::std::complex<T>(c); // "c" is actually "e"
|
Chris@16
|
2713
|
Chris@16
|
2714 is.putback(ch);
|
Chris@16
|
2715
|
Chris@16
|
2716 is >> y; // read "((a,b),(e,y"
|
Chris@16
|
2717
|
Chris@16
|
2718 if (!is.good()) goto finish;
|
Chris@16
|
2719
|
Chris@16
|
2720 is >> ch; // get the next lexeme
|
Chris@16
|
2721
|
Chris@16
|
2722 if (!is.good()) goto finish;
|
Chris@16
|
2723
|
Chris@16
|
2724 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2725 cc = ch;
|
Chris@16
|
2726 #else
|
Chris@16
|
2727 cc = ct.narrow(ch, char());
|
Chris@16
|
2728 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2729
|
Chris@16
|
2730 if (cc == ')') // read "((a,b),(e,y)"
|
Chris@16
|
2731 {
|
Chris@16
|
2732 is >> ch; // get the next lexeme
|
Chris@16
|
2733
|
Chris@16
|
2734 if (!is.good()) goto finish;
|
Chris@16
|
2735
|
Chris@16
|
2736 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2737 cc = ch;
|
Chris@16
|
2738 #else
|
Chris@16
|
2739 cc = ct.narrow(ch, char());
|
Chris@16
|
2740 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2741
|
Chris@16
|
2742 if (cc == ')') // read "((a,b),(e,y))"
|
Chris@16
|
2743 {
|
Chris@16
|
2744 o = octonion<T>(u,v,x,y);
|
Chris@16
|
2745 }
|
Chris@16
|
2746 else // error
|
Chris@16
|
2747 {
|
Chris@16
|
2748 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2749 }
|
Chris@16
|
2750 }
|
Chris@16
|
2751 else // error
|
Chris@16
|
2752 {
|
Chris@16
|
2753 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2754 }
|
Chris@16
|
2755 }
|
Chris@16
|
2756 else // read "((a,b),(c,d" or "((a,b),(e,f"
|
Chris@16
|
2757 {
|
Chris@16
|
2758 is.putback(ch);
|
Chris@16
|
2759
|
Chris@16
|
2760 is >> d;
|
Chris@16
|
2761
|
Chris@16
|
2762 if (!is.good()) goto finish;
|
Chris@16
|
2763
|
Chris@16
|
2764 is >> ch; // get the next lexeme
|
Chris@16
|
2765
|
Chris@16
|
2766 if (!is.good()) goto finish;
|
Chris@16
|
2767
|
Chris@16
|
2768 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2769 cc = ch;
|
Chris@16
|
2770 #else
|
Chris@16
|
2771 cc = ct.narrow(ch, char());
|
Chris@16
|
2772 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2773
|
Chris@16
|
2774 if (cc == ')') // read "((a,b),(c,d)" (ambiguity resolution)
|
Chris@16
|
2775 {
|
Chris@16
|
2776 u = ::std::complex<T>(a,b);
|
Chris@16
|
2777
|
Chris@16
|
2778 v = ::std::complex<T>(c,d);
|
Chris@16
|
2779
|
Chris@16
|
2780 is >> ch; // get the next lexeme
|
Chris@16
|
2781
|
Chris@16
|
2782 if (!is.good()) goto finish;
|
Chris@16
|
2783
|
Chris@16
|
2784 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2785 cc = ch;
|
Chris@16
|
2786 #else
|
Chris@16
|
2787 cc = ct.narrow(ch, char());
|
Chris@16
|
2788 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2789
|
Chris@16
|
2790 if (cc == ')') // read "((a,b),(c,d))"
|
Chris@16
|
2791 {
|
Chris@16
|
2792 o = octonion<T>(u,v);
|
Chris@16
|
2793 }
|
Chris@16
|
2794 else if (cc == ',') // read "((a,b),(c,d),"
|
Chris@16
|
2795 {
|
Chris@16
|
2796 is >> x; // read "((a,b),(c,d),x
|
Chris@16
|
2797
|
Chris@16
|
2798 if (!is.good()) goto finish;
|
Chris@16
|
2799
|
Chris@16
|
2800 is >> ch; // get the next lexeme
|
Chris@16
|
2801
|
Chris@16
|
2802 if (!is.good()) goto finish;
|
Chris@16
|
2803
|
Chris@16
|
2804 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2805 cc = ch;
|
Chris@16
|
2806 #else
|
Chris@16
|
2807 cc = ct.narrow(ch, char());
|
Chris@16
|
2808 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2809
|
Chris@16
|
2810 if (cc == ')') // read "((a,b),(c,d),x)"
|
Chris@16
|
2811 {
|
Chris@16
|
2812 o = octonion<T>(u,v,x);
|
Chris@16
|
2813 }
|
Chris@16
|
2814 else if (cc == ',') // read "((a,b),(c,d),x,"
|
Chris@16
|
2815 {
|
Chris@16
|
2816 is >> y; // read "((a,b),(c,d),x,y"
|
Chris@16
|
2817
|
Chris@16
|
2818 if (!is.good()) goto finish;
|
Chris@16
|
2819
|
Chris@16
|
2820 is >> ch; // get the next lexeme
|
Chris@16
|
2821
|
Chris@16
|
2822 if (!is.good()) goto finish;
|
Chris@16
|
2823
|
Chris@16
|
2824 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2825 cc = ch;
|
Chris@16
|
2826 #else
|
Chris@16
|
2827 cc = ct.narrow(ch, char());
|
Chris@16
|
2828 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2829
|
Chris@16
|
2830 if (cc == ')') // read "((a,b),(c,d),x,y)"
|
Chris@16
|
2831 {
|
Chris@16
|
2832 o = octonion<T>(u,v,x,y);
|
Chris@16
|
2833 }
|
Chris@16
|
2834 else // error
|
Chris@16
|
2835 {
|
Chris@16
|
2836 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2837 }
|
Chris@16
|
2838 }
|
Chris@16
|
2839 else // error
|
Chris@16
|
2840 {
|
Chris@16
|
2841 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2842 }
|
Chris@16
|
2843 }
|
Chris@16
|
2844 else // error
|
Chris@16
|
2845 {
|
Chris@16
|
2846 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2847 }
|
Chris@16
|
2848 }
|
Chris@16
|
2849 else if (cc == ',') // read "((a,b),(e,f," (ambiguity resolution)
|
Chris@16
|
2850 {
|
Chris@16
|
2851 p = ::boost::math::quaternion<T>(a,b); // too late to backtrack
|
Chris@16
|
2852
|
Chris@16
|
2853 is >> g; // read "((a,b),(e,f,g"
|
Chris@16
|
2854
|
Chris@16
|
2855 if (!is.good()) goto finish;
|
Chris@16
|
2856
|
Chris@16
|
2857 is >> ch; // get the next lexeme
|
Chris@16
|
2858
|
Chris@16
|
2859 if (!is.good()) goto finish;
|
Chris@16
|
2860
|
Chris@16
|
2861 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2862 cc = ch;
|
Chris@16
|
2863 #else
|
Chris@16
|
2864 cc = ct.narrow(ch, char());
|
Chris@16
|
2865 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2866
|
Chris@16
|
2867 if (cc == ')') // read "((a,b),(e,f,g)"
|
Chris@16
|
2868 {
|
Chris@16
|
2869 is >> ch; // get the next lexeme
|
Chris@16
|
2870
|
Chris@16
|
2871 if (!is.good()) goto finish;
|
Chris@16
|
2872
|
Chris@16
|
2873 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2874 cc = ch;
|
Chris@16
|
2875 #else
|
Chris@16
|
2876 cc = ct.narrow(ch, char());
|
Chris@16
|
2877 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2878
|
Chris@16
|
2879 if (cc == ')') // read "((a,b),(e,f,g))"
|
Chris@16
|
2880 {
|
Chris@16
|
2881 q = ::boost::math::quaternion<T>(c,d,g); // "c" is actually "e" and "d" is actually "f"
|
Chris@16
|
2882
|
Chris@16
|
2883 o = octonion<T>(p,q);
|
Chris@16
|
2884 }
|
Chris@16
|
2885 else // error
|
Chris@16
|
2886 {
|
Chris@16
|
2887 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2888 }
|
Chris@16
|
2889 }
|
Chris@16
|
2890 else if (cc == ',') // read "((a,b),(e,f,g,"
|
Chris@16
|
2891 {
|
Chris@16
|
2892 is >> h; // read "((a,b),(e,f,g,h"
|
Chris@16
|
2893
|
Chris@16
|
2894 if (!is.good()) goto finish;
|
Chris@16
|
2895
|
Chris@16
|
2896 is >> ch; // get the next lexeme
|
Chris@16
|
2897
|
Chris@16
|
2898 if (!is.good()) goto finish;
|
Chris@16
|
2899
|
Chris@16
|
2900 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2901 cc = ch;
|
Chris@16
|
2902 #else
|
Chris@16
|
2903 cc = ct.narrow(ch, char());
|
Chris@16
|
2904 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2905
|
Chris@16
|
2906 if (cc == ')') // read "((a,b),(e,f,g,h)"
|
Chris@16
|
2907 {
|
Chris@16
|
2908 is >> ch; // get the next lexeme
|
Chris@16
|
2909
|
Chris@16
|
2910 if (!is.good()) goto finish;
|
Chris@16
|
2911
|
Chris@16
|
2912 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2913 cc = ch;
|
Chris@16
|
2914 #else
|
Chris@16
|
2915 cc = ct.narrow(ch, char());
|
Chris@16
|
2916 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2917
|
Chris@16
|
2918 if (cc == ')') // read ((a,b),(e,f,g,h))"
|
Chris@16
|
2919 {
|
Chris@16
|
2920 q = ::boost::math::quaternion<T>(c,d,g,h); // "c" is actually "e" and "d" is actually "f"
|
Chris@16
|
2921
|
Chris@16
|
2922 o = octonion<T>(p,q);
|
Chris@16
|
2923 }
|
Chris@16
|
2924 else // error
|
Chris@16
|
2925 {
|
Chris@16
|
2926 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2927 }
|
Chris@16
|
2928 }
|
Chris@16
|
2929 else // error
|
Chris@16
|
2930 {
|
Chris@16
|
2931 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2932 }
|
Chris@16
|
2933 }
|
Chris@16
|
2934 else // error
|
Chris@16
|
2935 {
|
Chris@16
|
2936 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2937 }
|
Chris@16
|
2938 }
|
Chris@16
|
2939 else // error
|
Chris@16
|
2940 {
|
Chris@16
|
2941 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2942 }
|
Chris@16
|
2943 }
|
Chris@16
|
2944 }
|
Chris@16
|
2945 else // error
|
Chris@16
|
2946 {
|
Chris@16
|
2947 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2948 }
|
Chris@16
|
2949 }
|
Chris@16
|
2950 }
|
Chris@16
|
2951 else // error
|
Chris@16
|
2952 {
|
Chris@16
|
2953 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2954 }
|
Chris@16
|
2955 }
|
Chris@16
|
2956 else // error
|
Chris@16
|
2957 {
|
Chris@16
|
2958 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
2959 }
|
Chris@16
|
2960 }
|
Chris@16
|
2961 else if (cc == ',') // read "((a,b,"
|
Chris@16
|
2962 {
|
Chris@16
|
2963 is >> c; // read "((a,b,c"
|
Chris@16
|
2964
|
Chris@16
|
2965 if (!is.good()) goto finish;
|
Chris@16
|
2966
|
Chris@16
|
2967 is >> ch; // get the next lexeme
|
Chris@16
|
2968
|
Chris@16
|
2969 if (!is.good()) goto finish;
|
Chris@16
|
2970
|
Chris@16
|
2971 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2972 cc = ch;
|
Chris@16
|
2973 #else
|
Chris@16
|
2974 cc = ct.narrow(ch, char());
|
Chris@16
|
2975 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2976
|
Chris@16
|
2977 if (cc == ')') // read "((a,b,c)"
|
Chris@16
|
2978 {
|
Chris@16
|
2979 is >> ch; // get the next lexeme
|
Chris@16
|
2980
|
Chris@16
|
2981 if (!is.good()) goto finish;
|
Chris@16
|
2982
|
Chris@16
|
2983 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
2984 cc = ch;
|
Chris@16
|
2985 #else
|
Chris@16
|
2986 cc = ct.narrow(ch, char());
|
Chris@16
|
2987 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
2988
|
Chris@16
|
2989 if (cc == ')') // read "((a,b,c))"
|
Chris@16
|
2990 {
|
Chris@16
|
2991 o = octonion<T>(a,b,c);
|
Chris@16
|
2992 }
|
Chris@16
|
2993 else if (cc == ',') // read "((a,b,c),"
|
Chris@16
|
2994 {
|
Chris@16
|
2995 p = ::boost::math::quaternion<T>(a,b,c);
|
Chris@16
|
2996
|
Chris@16
|
2997 is >> q; // read "((a,b,c),q"
|
Chris@16
|
2998
|
Chris@16
|
2999 if (!is.good()) goto finish;
|
Chris@16
|
3000
|
Chris@16
|
3001 is >> ch; // get the next lexeme
|
Chris@16
|
3002
|
Chris@16
|
3003 if (!is.good()) goto finish;
|
Chris@16
|
3004
|
Chris@16
|
3005 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3006 cc = ch;
|
Chris@16
|
3007 #else
|
Chris@16
|
3008 cc = ct.narrow(ch, char());
|
Chris@16
|
3009 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3010
|
Chris@16
|
3011 if (cc == ')') // read "((a,b,c),q)"
|
Chris@16
|
3012 {
|
Chris@16
|
3013 o = octonion<T>(p,q);
|
Chris@16
|
3014 }
|
Chris@16
|
3015 else // error
|
Chris@16
|
3016 {
|
Chris@16
|
3017 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3018 }
|
Chris@16
|
3019 }
|
Chris@16
|
3020 else // error
|
Chris@16
|
3021 {
|
Chris@16
|
3022 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3023 }
|
Chris@16
|
3024 }
|
Chris@16
|
3025 else if (cc == ',') // read "((a,b,c,"
|
Chris@16
|
3026 {
|
Chris@16
|
3027 is >> d; // read "((a,b,c,d"
|
Chris@16
|
3028
|
Chris@16
|
3029 if (!is.good()) goto finish;
|
Chris@16
|
3030
|
Chris@16
|
3031 is >> ch; // get the next lexeme
|
Chris@16
|
3032
|
Chris@16
|
3033 if (!is.good()) goto finish;
|
Chris@16
|
3034
|
Chris@16
|
3035 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3036 cc = ch;
|
Chris@16
|
3037 #else
|
Chris@16
|
3038 cc = ct.narrow(ch, char());
|
Chris@16
|
3039 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3040
|
Chris@16
|
3041 if (cc == ')') // read "((a,b,c,d)"
|
Chris@16
|
3042 {
|
Chris@16
|
3043 is >> ch; // get the next lexeme
|
Chris@16
|
3044
|
Chris@16
|
3045 if (!is.good()) goto finish;
|
Chris@16
|
3046
|
Chris@16
|
3047 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3048 cc = ch;
|
Chris@16
|
3049 #else
|
Chris@16
|
3050 cc = ct.narrow(ch, char());
|
Chris@16
|
3051 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3052
|
Chris@16
|
3053 if (cc == ')') // read "((a,b,c,d))"
|
Chris@16
|
3054 {
|
Chris@16
|
3055 o = octonion<T>(a,b,c,d);
|
Chris@16
|
3056 }
|
Chris@16
|
3057 else if (cc == ',') // read "((a,b,c,d),"
|
Chris@16
|
3058 {
|
Chris@16
|
3059 p = ::boost::math::quaternion<T>(a,b,c,d);
|
Chris@16
|
3060
|
Chris@16
|
3061 is >> q; // read "((a,b,c,d),q"
|
Chris@16
|
3062
|
Chris@16
|
3063 if (!is.good()) goto finish;
|
Chris@16
|
3064
|
Chris@16
|
3065 is >> ch; // get the next lexeme
|
Chris@16
|
3066
|
Chris@16
|
3067 if (!is.good()) goto finish;
|
Chris@16
|
3068
|
Chris@16
|
3069 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3070 cc = ch;
|
Chris@16
|
3071 #else
|
Chris@16
|
3072 cc = ct.narrow(ch, char());
|
Chris@16
|
3073 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3074
|
Chris@16
|
3075 if (cc == ')') // read "((a,b,c,d),q)"
|
Chris@16
|
3076 {
|
Chris@16
|
3077 o = octonion<T>(p,q);
|
Chris@16
|
3078 }
|
Chris@16
|
3079 else // error
|
Chris@16
|
3080 {
|
Chris@16
|
3081 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3082 }
|
Chris@16
|
3083 }
|
Chris@16
|
3084 else // error
|
Chris@16
|
3085 {
|
Chris@16
|
3086 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3087 }
|
Chris@16
|
3088 }
|
Chris@16
|
3089 else // error
|
Chris@16
|
3090 {
|
Chris@16
|
3091 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3092 }
|
Chris@16
|
3093 }
|
Chris@16
|
3094 else // error
|
Chris@16
|
3095 {
|
Chris@16
|
3096 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3097 }
|
Chris@16
|
3098 }
|
Chris@16
|
3099 else // error
|
Chris@16
|
3100 {
|
Chris@16
|
3101 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3102 }
|
Chris@16
|
3103 }
|
Chris@16
|
3104 }
|
Chris@16
|
3105 else // error
|
Chris@16
|
3106 {
|
Chris@16
|
3107 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3108 }
|
Chris@16
|
3109 }
|
Chris@16
|
3110 }
|
Chris@16
|
3111 else // read "(a"
|
Chris@16
|
3112 {
|
Chris@16
|
3113 is.putback(ch);
|
Chris@16
|
3114
|
Chris@16
|
3115 is >> a; // we extract the first component
|
Chris@16
|
3116
|
Chris@16
|
3117 if (!is.good()) goto finish;
|
Chris@16
|
3118
|
Chris@16
|
3119 is >> ch; // get the next lexeme
|
Chris@16
|
3120
|
Chris@16
|
3121 if (!is.good()) goto finish;
|
Chris@16
|
3122
|
Chris@16
|
3123 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3124 cc = ch;
|
Chris@16
|
3125 #else
|
Chris@16
|
3126 cc = ct.narrow(ch, char());
|
Chris@16
|
3127 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3128
|
Chris@16
|
3129 if (cc == ')') // read "(a)"
|
Chris@16
|
3130 {
|
Chris@16
|
3131 o = octonion<T>(a);
|
Chris@16
|
3132 }
|
Chris@16
|
3133 else if (cc == ',') // read "(a,"
|
Chris@16
|
3134 {
|
Chris@16
|
3135 is >> ch; // get the next lexeme
|
Chris@16
|
3136
|
Chris@16
|
3137 if (!is.good()) goto finish;
|
Chris@16
|
3138
|
Chris@16
|
3139 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3140 cc = ch;
|
Chris@16
|
3141 #else
|
Chris@16
|
3142 cc = ct.narrow(ch, char());
|
Chris@16
|
3143 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3144
|
Chris@16
|
3145 if (cc == '(') // read "(a,("
|
Chris@16
|
3146 {
|
Chris@16
|
3147 is >> ch; // get the next lexeme
|
Chris@16
|
3148
|
Chris@16
|
3149 if (!is.good()) goto finish;
|
Chris@16
|
3150
|
Chris@16
|
3151 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3152 cc = ch;
|
Chris@16
|
3153 #else
|
Chris@16
|
3154 cc = ct.narrow(ch, char());
|
Chris@16
|
3155 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3156
|
Chris@16
|
3157 if (cc == '(') // read "(a,(("
|
Chris@16
|
3158 {
|
Chris@16
|
3159 p = ::boost::math::quaternion<T>(a);
|
Chris@16
|
3160
|
Chris@16
|
3161 is.putback(ch);
|
Chris@16
|
3162
|
Chris@16
|
3163 is.putback(ch); // we backtrack twice, with the same value
|
Chris@16
|
3164
|
Chris@16
|
3165 is >> q; // read "(a,q"
|
Chris@16
|
3166
|
Chris@16
|
3167 if (!is.good()) goto finish;
|
Chris@16
|
3168
|
Chris@16
|
3169 is >> ch; // get the next lexeme
|
Chris@16
|
3170
|
Chris@16
|
3171 if (!is.good()) goto finish;
|
Chris@16
|
3172
|
Chris@16
|
3173 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3174 cc = ch;
|
Chris@16
|
3175 #else
|
Chris@16
|
3176 cc = ct.narrow(ch, char());
|
Chris@16
|
3177 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3178
|
Chris@16
|
3179 if (cc == ')') // read "(a,q)"
|
Chris@16
|
3180 {
|
Chris@16
|
3181 o = octonion<T>(p,q);
|
Chris@16
|
3182 }
|
Chris@16
|
3183 else // error
|
Chris@16
|
3184 {
|
Chris@16
|
3185 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3186 }
|
Chris@16
|
3187 }
|
Chris@16
|
3188 else // read "(a,(c" or "(a,(e"
|
Chris@16
|
3189 {
|
Chris@16
|
3190 is.putback(ch);
|
Chris@16
|
3191
|
Chris@16
|
3192 is >> c;
|
Chris@16
|
3193
|
Chris@16
|
3194 if (!is.good()) goto finish;
|
Chris@16
|
3195
|
Chris@16
|
3196 is >> ch; // get the next lexeme
|
Chris@16
|
3197
|
Chris@16
|
3198 if (!is.good()) goto finish;
|
Chris@16
|
3199
|
Chris@16
|
3200 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3201 cc = ch;
|
Chris@16
|
3202 #else
|
Chris@16
|
3203 cc = ct.narrow(ch, char());
|
Chris@16
|
3204 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3205
|
Chris@16
|
3206 if (cc == ')') // read "(a,(c)" (ambiguity resolution)
|
Chris@16
|
3207 {
|
Chris@16
|
3208 is >> ch; // get the next lexeme
|
Chris@16
|
3209
|
Chris@16
|
3210 if (!is.good()) goto finish;
|
Chris@16
|
3211
|
Chris@16
|
3212 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3213 cc = ch;
|
Chris@16
|
3214 #else
|
Chris@16
|
3215 cc = ct.narrow(ch, char());
|
Chris@16
|
3216 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3217
|
Chris@16
|
3218 if (cc == ')') // read "(a,(c))"
|
Chris@16
|
3219 {
|
Chris@16
|
3220 o = octonion<T>(a,b,c);
|
Chris@16
|
3221 }
|
Chris@16
|
3222 else if (cc == ',') // read "(a,(c),"
|
Chris@16
|
3223 {
|
Chris@16
|
3224 u = ::std::complex<T>(a);
|
Chris@16
|
3225
|
Chris@16
|
3226 v = ::std::complex<T>(c);
|
Chris@16
|
3227
|
Chris@16
|
3228 is >> x; // read "(a,(c),x"
|
Chris@16
|
3229
|
Chris@16
|
3230 if (!is.good()) goto finish;
|
Chris@16
|
3231
|
Chris@16
|
3232 is >> ch; // get the next lexeme
|
Chris@16
|
3233
|
Chris@16
|
3234 if (!is.good()) goto finish;
|
Chris@16
|
3235
|
Chris@16
|
3236 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3237 cc = ch;
|
Chris@16
|
3238 #else
|
Chris@16
|
3239 cc = ct.narrow(ch, char());
|
Chris@16
|
3240 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3241
|
Chris@16
|
3242 if (cc == ')') // read "(a,(c),x)"
|
Chris@16
|
3243 {
|
Chris@16
|
3244 o = octonion<T>(u,v,x);
|
Chris@16
|
3245 }
|
Chris@16
|
3246 else if (cc == ',') // read "(a,(c),x,"
|
Chris@16
|
3247 {
|
Chris@16
|
3248 is >> y; // read "(a,(c),x,y"
|
Chris@16
|
3249
|
Chris@16
|
3250 if (!is.good()) goto finish;
|
Chris@16
|
3251
|
Chris@16
|
3252 is >> ch; // get the next lexeme
|
Chris@16
|
3253
|
Chris@16
|
3254 if (!is.good()) goto finish;
|
Chris@16
|
3255
|
Chris@16
|
3256 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3257 cc = ch;
|
Chris@16
|
3258 #else
|
Chris@16
|
3259 cc = ct.narrow(ch, char());
|
Chris@16
|
3260 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3261
|
Chris@16
|
3262 if (cc == ')') // read "(a,(c),x,y)"
|
Chris@16
|
3263 {
|
Chris@16
|
3264 o = octonion<T>(u,v,x,y);
|
Chris@16
|
3265 }
|
Chris@16
|
3266 else // error
|
Chris@16
|
3267 {
|
Chris@16
|
3268 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3269 }
|
Chris@16
|
3270 }
|
Chris@16
|
3271 else // error
|
Chris@16
|
3272 {
|
Chris@16
|
3273 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3274 }
|
Chris@16
|
3275 }
|
Chris@16
|
3276 else // error
|
Chris@16
|
3277 {
|
Chris@16
|
3278 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3279 }
|
Chris@16
|
3280 }
|
Chris@16
|
3281 else if (cc == ',') // read "(a,(c," or "(a,(e,"
|
Chris@16
|
3282 {
|
Chris@16
|
3283 is >> ch; // get the next lexeme
|
Chris@16
|
3284
|
Chris@16
|
3285 if (!is.good()) goto finish;
|
Chris@16
|
3286
|
Chris@16
|
3287 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3288 cc = ch;
|
Chris@16
|
3289 #else
|
Chris@16
|
3290 cc = ct.narrow(ch, char());
|
Chris@16
|
3291 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3292
|
Chris@16
|
3293 if (cc == '(') // read "(a,(e,(" (ambiguity resolution)
|
Chris@16
|
3294 {
|
Chris@16
|
3295 u = ::std::complex<T>(a);
|
Chris@16
|
3296
|
Chris@16
|
3297 x = ::std::complex<T>(c); // "c" is actually "e"
|
Chris@16
|
3298
|
Chris@16
|
3299 is.putback(ch); // we backtrack
|
Chris@16
|
3300
|
Chris@16
|
3301 is >> y; // read "(a,(e,y"
|
Chris@16
|
3302
|
Chris@16
|
3303 if (!is.good()) goto finish;
|
Chris@16
|
3304
|
Chris@16
|
3305 is >> ch; // get the next lexeme
|
Chris@16
|
3306
|
Chris@16
|
3307 if (!is.good()) goto finish;
|
Chris@16
|
3308
|
Chris@16
|
3309 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3310 cc = ch;
|
Chris@16
|
3311 #else
|
Chris@16
|
3312 cc = ct.narrow(ch, char());
|
Chris@16
|
3313 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3314
|
Chris@16
|
3315 if (cc == ')') // read "(a,(e,y)"
|
Chris@16
|
3316 {
|
Chris@16
|
3317 is >> ch; // get the next lexeme
|
Chris@16
|
3318
|
Chris@16
|
3319 if (!is.good()) goto finish;
|
Chris@16
|
3320
|
Chris@16
|
3321 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3322 cc = ch;
|
Chris@16
|
3323 #else
|
Chris@16
|
3324 cc = ct.narrow(ch, char());
|
Chris@16
|
3325 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3326
|
Chris@16
|
3327 if (cc == ')') // read "(a,(e,y))"
|
Chris@16
|
3328 {
|
Chris@16
|
3329 o = octonion<T>(u,v,x,y);
|
Chris@16
|
3330 }
|
Chris@16
|
3331 else // error
|
Chris@16
|
3332 {
|
Chris@16
|
3333 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3334 }
|
Chris@16
|
3335 }
|
Chris@16
|
3336 else // error
|
Chris@16
|
3337 {
|
Chris@16
|
3338 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3339 }
|
Chris@16
|
3340 }
|
Chris@16
|
3341 else // read "(a,(c,d" or "(a,(e,f"
|
Chris@16
|
3342 {
|
Chris@16
|
3343 is.putback(ch);
|
Chris@16
|
3344
|
Chris@16
|
3345 is >> d;
|
Chris@16
|
3346
|
Chris@16
|
3347 if (!is.good()) goto finish;
|
Chris@16
|
3348
|
Chris@16
|
3349 is >> ch; // get the next lexeme
|
Chris@16
|
3350
|
Chris@16
|
3351 if (!is.good()) goto finish;
|
Chris@16
|
3352
|
Chris@16
|
3353 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3354 cc = ch;
|
Chris@16
|
3355 #else
|
Chris@16
|
3356 cc = ct.narrow(ch, char());
|
Chris@16
|
3357 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3358
|
Chris@16
|
3359 if (cc == ')') // read "(a,(c,d)" (ambiguity resolution)
|
Chris@16
|
3360 {
|
Chris@16
|
3361 is >> ch; // get the next lexeme
|
Chris@16
|
3362
|
Chris@16
|
3363 if (!is.good()) goto finish;
|
Chris@16
|
3364
|
Chris@16
|
3365 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3366 cc = ch;
|
Chris@16
|
3367 #else
|
Chris@16
|
3368 cc = ct.narrow(ch, char());
|
Chris@16
|
3369 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3370
|
Chris@16
|
3371 if (cc == ')') // read "(a,(c,d))"
|
Chris@16
|
3372 {
|
Chris@16
|
3373 o = octonion<T>(a,b,c,d);
|
Chris@16
|
3374 }
|
Chris@16
|
3375 else if (cc == ',') // read "(a,(c,d),"
|
Chris@16
|
3376 {
|
Chris@16
|
3377 u = ::std::complex<T>(a);
|
Chris@16
|
3378
|
Chris@16
|
3379 v = ::std::complex<T>(c,d);
|
Chris@16
|
3380
|
Chris@16
|
3381 is >> x; // read "(a,(c,d),x"
|
Chris@16
|
3382
|
Chris@16
|
3383 if (!is.good()) goto finish;
|
Chris@16
|
3384
|
Chris@16
|
3385 is >> ch; // get the next lexeme
|
Chris@16
|
3386
|
Chris@16
|
3387 if (!is.good()) goto finish;
|
Chris@16
|
3388
|
Chris@16
|
3389 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3390 cc = ch;
|
Chris@16
|
3391 #else
|
Chris@16
|
3392 cc = ct.narrow(ch, char());
|
Chris@16
|
3393 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3394
|
Chris@16
|
3395 if (cc == ')') // read "(a,(c,d),x)"
|
Chris@16
|
3396 {
|
Chris@16
|
3397 o = octonion<T>(u,v,x);
|
Chris@16
|
3398 }
|
Chris@16
|
3399 else if (cc == ',') // read "(a,(c,d),x,"
|
Chris@16
|
3400 {
|
Chris@16
|
3401 is >> y; // read "(a,(c,d),x,y"
|
Chris@16
|
3402
|
Chris@16
|
3403 if (!is.good()) goto finish;
|
Chris@16
|
3404
|
Chris@16
|
3405 is >> ch; // get the next lexeme
|
Chris@16
|
3406
|
Chris@16
|
3407 if (!is.good()) goto finish;
|
Chris@16
|
3408
|
Chris@16
|
3409 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3410 cc = ch;
|
Chris@16
|
3411 #else
|
Chris@16
|
3412 cc = ct.narrow(ch, char());
|
Chris@16
|
3413 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3414
|
Chris@16
|
3415 if (cc == ')') // read "(a,(c,d),x,y)"
|
Chris@16
|
3416 {
|
Chris@16
|
3417 o = octonion<T>(u,v,x,y);
|
Chris@16
|
3418 }
|
Chris@16
|
3419 else // error
|
Chris@16
|
3420 {
|
Chris@16
|
3421 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3422 }
|
Chris@16
|
3423 }
|
Chris@16
|
3424 else // error
|
Chris@16
|
3425 {
|
Chris@16
|
3426 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3427 }
|
Chris@16
|
3428 }
|
Chris@16
|
3429 else // error
|
Chris@16
|
3430 {
|
Chris@16
|
3431 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3432 }
|
Chris@16
|
3433 }
|
Chris@16
|
3434 else if (cc == ',') // read "(a,(e,f," (ambiguity resolution)
|
Chris@16
|
3435 {
|
Chris@16
|
3436 p = ::boost::math::quaternion<T>(a);
|
Chris@16
|
3437
|
Chris@16
|
3438 is >> g; // read "(a,(e,f,g"
|
Chris@16
|
3439
|
Chris@16
|
3440 if (!is.good()) goto finish;
|
Chris@16
|
3441
|
Chris@16
|
3442 is >> ch; // get the next lexeme
|
Chris@16
|
3443
|
Chris@16
|
3444 if (!is.good()) goto finish;
|
Chris@16
|
3445
|
Chris@16
|
3446 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3447 cc = ch;
|
Chris@16
|
3448 #else
|
Chris@16
|
3449 cc = ct.narrow(ch, char());
|
Chris@16
|
3450 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3451
|
Chris@16
|
3452 if (cc == ')') // read "(a,(e,f,g)"
|
Chris@16
|
3453 {
|
Chris@16
|
3454 is >> ch; // get the next lexeme
|
Chris@16
|
3455
|
Chris@16
|
3456 if (!is.good()) goto finish;
|
Chris@16
|
3457
|
Chris@16
|
3458 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3459 cc = ch;
|
Chris@16
|
3460 #else
|
Chris@16
|
3461 cc = ct.narrow(ch, char());
|
Chris@16
|
3462 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3463
|
Chris@16
|
3464 if (cc == ')') // read "(a,(e,f,g))"
|
Chris@16
|
3465 {
|
Chris@16
|
3466 q = ::boost::math::quaternion<T>(c,d,g); // "c" is actually "e" and "d" is actually "f"
|
Chris@16
|
3467
|
Chris@16
|
3468 o = octonion<T>(p,q);
|
Chris@16
|
3469 }
|
Chris@16
|
3470 else // error
|
Chris@16
|
3471 {
|
Chris@16
|
3472 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3473 }
|
Chris@16
|
3474 }
|
Chris@16
|
3475 else if (cc == ',') // read "(a,(e,f,g,"
|
Chris@16
|
3476 {
|
Chris@16
|
3477 is >> h; // read "(a,(e,f,g,h"
|
Chris@16
|
3478
|
Chris@16
|
3479 if (!is.good()) goto finish;
|
Chris@16
|
3480
|
Chris@16
|
3481 is >> ch; // get the next lexeme
|
Chris@16
|
3482
|
Chris@16
|
3483 if (!is.good()) goto finish;
|
Chris@16
|
3484
|
Chris@16
|
3485 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3486 cc = ch;
|
Chris@16
|
3487 #else
|
Chris@16
|
3488 cc = ct.narrow(ch, char());
|
Chris@16
|
3489 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3490
|
Chris@16
|
3491 if (cc == ')') // read "(a,(e,f,g,h)"
|
Chris@16
|
3492 {
|
Chris@16
|
3493 is >> ch; // get the next lexeme
|
Chris@16
|
3494
|
Chris@16
|
3495 if (!is.good()) goto finish;
|
Chris@16
|
3496
|
Chris@16
|
3497 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3498 cc = ch;
|
Chris@16
|
3499 #else
|
Chris@16
|
3500 cc = ct.narrow(ch, char());
|
Chris@16
|
3501 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3502
|
Chris@16
|
3503 if (cc == ')') // read "(a,(e,f,g,h))"
|
Chris@16
|
3504 {
|
Chris@16
|
3505 q = ::boost::math::quaternion<T>(c,d,g,h); // "c" is actually "e" and "d" is actually "f"
|
Chris@16
|
3506
|
Chris@16
|
3507 o = octonion<T>(p,q);
|
Chris@16
|
3508 }
|
Chris@16
|
3509 else // error
|
Chris@16
|
3510 {
|
Chris@16
|
3511 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3512 }
|
Chris@16
|
3513 }
|
Chris@16
|
3514 else // error
|
Chris@16
|
3515 {
|
Chris@16
|
3516 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3517 }
|
Chris@16
|
3518 }
|
Chris@16
|
3519 else // error
|
Chris@16
|
3520 {
|
Chris@16
|
3521 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3522 }
|
Chris@16
|
3523 }
|
Chris@16
|
3524 else // error
|
Chris@16
|
3525 {
|
Chris@16
|
3526 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3527 }
|
Chris@16
|
3528 }
|
Chris@16
|
3529 }
|
Chris@16
|
3530 else // error
|
Chris@16
|
3531 {
|
Chris@16
|
3532 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3533 }
|
Chris@16
|
3534 }
|
Chris@16
|
3535 }
|
Chris@16
|
3536 else // read "(a,b" or "(a,c" (ambiguity resolution)
|
Chris@16
|
3537 {
|
Chris@16
|
3538 is.putback(ch);
|
Chris@16
|
3539
|
Chris@16
|
3540 is >> b;
|
Chris@16
|
3541
|
Chris@16
|
3542 if (!is.good()) goto finish;
|
Chris@16
|
3543
|
Chris@16
|
3544 is >> ch; // get the next lexeme
|
Chris@16
|
3545
|
Chris@16
|
3546 if (!is.good()) goto finish;
|
Chris@16
|
3547
|
Chris@16
|
3548 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3549 cc = ch;
|
Chris@16
|
3550 #else
|
Chris@16
|
3551 cc = ct.narrow(ch, char());
|
Chris@16
|
3552 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3553
|
Chris@16
|
3554 if (cc == ')') // read "(a,b)" (ambiguity resolution)
|
Chris@16
|
3555 {
|
Chris@16
|
3556 o = octonion<T>(a,b);
|
Chris@16
|
3557 }
|
Chris@16
|
3558 else if (cc == ',') // read "(a,b," or "(a,c,"
|
Chris@16
|
3559 {
|
Chris@16
|
3560 is >> ch; // get the next lexeme
|
Chris@16
|
3561
|
Chris@16
|
3562 if (!is.good()) goto finish;
|
Chris@16
|
3563
|
Chris@16
|
3564 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3565 cc = ch;
|
Chris@16
|
3566 #else
|
Chris@16
|
3567 cc = ct.narrow(ch, char());
|
Chris@16
|
3568 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3569
|
Chris@16
|
3570 if (cc == '(') // read "(a,c,(" (ambiguity resolution)
|
Chris@16
|
3571 {
|
Chris@16
|
3572 u = ::std::complex<T>(a);
|
Chris@16
|
3573
|
Chris@16
|
3574 v = ::std::complex<T>(b); // "b" is actually "c"
|
Chris@16
|
3575
|
Chris@16
|
3576 is.putback(ch); // we backtrack
|
Chris@16
|
3577
|
Chris@16
|
3578 is >> x; // read "(a,c,x"
|
Chris@16
|
3579
|
Chris@16
|
3580 if (!is.good()) goto finish;
|
Chris@16
|
3581
|
Chris@16
|
3582 is >> ch; // get the next lexeme
|
Chris@16
|
3583
|
Chris@16
|
3584 if (!is.good()) goto finish;
|
Chris@16
|
3585
|
Chris@16
|
3586 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3587 cc = ch;
|
Chris@16
|
3588 #else
|
Chris@16
|
3589 cc = ct.narrow(ch, char());
|
Chris@16
|
3590 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3591
|
Chris@16
|
3592 if (cc == ')') // read "(a,c,x)"
|
Chris@16
|
3593 {
|
Chris@16
|
3594 o = octonion<T>(u,v,x);
|
Chris@16
|
3595 }
|
Chris@16
|
3596 else if (cc == ',') // read "(a,c,x,"
|
Chris@16
|
3597 {
|
Chris@16
|
3598 is >> y; // read "(a,c,x,y" // read "(a,c,x"
|
Chris@16
|
3599
|
Chris@16
|
3600 if (!is.good()) goto finish;
|
Chris@16
|
3601
|
Chris@16
|
3602 is >> ch; // get the next lexeme
|
Chris@16
|
3603
|
Chris@16
|
3604 if (!is.good()) goto finish;
|
Chris@16
|
3605
|
Chris@16
|
3606 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3607 cc = ch;
|
Chris@16
|
3608 #else
|
Chris@16
|
3609 cc = ct.narrow(ch, char());
|
Chris@16
|
3610 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3611
|
Chris@16
|
3612 if (cc == ')') // read "(a,c,x,y)"
|
Chris@16
|
3613 {
|
Chris@16
|
3614 o = octonion<T>(u,v,x,y);
|
Chris@16
|
3615 }
|
Chris@16
|
3616 else // error
|
Chris@16
|
3617 {
|
Chris@16
|
3618 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3619 }
|
Chris@16
|
3620 }
|
Chris@16
|
3621 else // error
|
Chris@16
|
3622 {
|
Chris@16
|
3623 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3624 }
|
Chris@16
|
3625 }
|
Chris@16
|
3626 else // read "(a,b,c" or "(a,c,e"
|
Chris@16
|
3627 {
|
Chris@16
|
3628 is.putback(ch);
|
Chris@16
|
3629
|
Chris@16
|
3630 is >> c;
|
Chris@16
|
3631
|
Chris@16
|
3632 if (!is.good()) goto finish;
|
Chris@16
|
3633
|
Chris@16
|
3634 is >> ch; // get the next lexeme
|
Chris@16
|
3635
|
Chris@16
|
3636 if (!is.good()) goto finish;
|
Chris@16
|
3637
|
Chris@16
|
3638 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3639 cc = ch;
|
Chris@16
|
3640 #else
|
Chris@16
|
3641 cc = ct.narrow(ch, char());
|
Chris@16
|
3642 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3643
|
Chris@16
|
3644 if (cc == ')') // read "(a,b,c)" (ambiguity resolution)
|
Chris@16
|
3645 {
|
Chris@16
|
3646 o = octonion<T>(a,b,c);
|
Chris@16
|
3647 }
|
Chris@16
|
3648 else if (cc == ',') // read "(a,b,c," or "(a,c,e,"
|
Chris@16
|
3649 {
|
Chris@16
|
3650 is >> ch; // get the next lexeme
|
Chris@16
|
3651
|
Chris@16
|
3652 if (!is.good()) goto finish;
|
Chris@16
|
3653
|
Chris@16
|
3654 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3655 cc = ch;
|
Chris@16
|
3656 #else
|
Chris@16
|
3657 cc = ct.narrow(ch, char());
|
Chris@16
|
3658 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3659
|
Chris@16
|
3660 if (cc == '(') // read "(a,c,e,(") (ambiguity resolution)
|
Chris@16
|
3661 {
|
Chris@16
|
3662 u = ::std::complex<T>(a);
|
Chris@16
|
3663
|
Chris@16
|
3664 v = ::std::complex<T>(b); // "b" is actually "c"
|
Chris@16
|
3665
|
Chris@16
|
3666 x = ::std::complex<T>(c); // "c" is actually "e"
|
Chris@16
|
3667
|
Chris@16
|
3668 is.putback(ch); // we backtrack
|
Chris@16
|
3669
|
Chris@16
|
3670 is >> y; // read "(a,c,e,y"
|
Chris@16
|
3671
|
Chris@16
|
3672 if (!is.good()) goto finish;
|
Chris@16
|
3673
|
Chris@16
|
3674 is >> ch; // get the next lexeme
|
Chris@16
|
3675
|
Chris@16
|
3676 if (!is.good()) goto finish;
|
Chris@16
|
3677
|
Chris@16
|
3678 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3679 cc = ch;
|
Chris@16
|
3680 #else
|
Chris@16
|
3681 cc = ct.narrow(ch, char());
|
Chris@16
|
3682 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3683
|
Chris@16
|
3684 if (cc == ')') // read "(a,c,e,y)"
|
Chris@16
|
3685 {
|
Chris@16
|
3686 o = octonion<T>(u,v,x,y);
|
Chris@16
|
3687 }
|
Chris@16
|
3688 else // error
|
Chris@16
|
3689 {
|
Chris@16
|
3690 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3691 }
|
Chris@16
|
3692 }
|
Chris@16
|
3693 else // read "(a,b,c,d" (ambiguity resolution)
|
Chris@16
|
3694 {
|
Chris@16
|
3695 is.putback(ch); // we backtrack
|
Chris@16
|
3696
|
Chris@16
|
3697 is >> d;
|
Chris@16
|
3698
|
Chris@16
|
3699 if (!is.good()) goto finish;
|
Chris@16
|
3700
|
Chris@16
|
3701 is >> ch; // get the next lexeme
|
Chris@16
|
3702
|
Chris@16
|
3703 if (!is.good()) goto finish;
|
Chris@16
|
3704
|
Chris@16
|
3705 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3706 cc = ch;
|
Chris@16
|
3707 #else
|
Chris@16
|
3708 cc = ct.narrow(ch, char());
|
Chris@16
|
3709 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3710
|
Chris@16
|
3711 if (cc == ')') // read "(a,b,c,d)"
|
Chris@16
|
3712 {
|
Chris@16
|
3713 o = octonion<T>(a,b,c,d);
|
Chris@16
|
3714 }
|
Chris@16
|
3715 else if (cc == ',') // read "(a,b,c,d,"
|
Chris@16
|
3716 {
|
Chris@16
|
3717 is >> e; // read "(a,b,c,d,e"
|
Chris@16
|
3718
|
Chris@16
|
3719 if (!is.good()) goto finish;
|
Chris@16
|
3720
|
Chris@16
|
3721 is >> ch; // get the next lexeme
|
Chris@16
|
3722
|
Chris@16
|
3723 if (!is.good()) goto finish;
|
Chris@16
|
3724
|
Chris@16
|
3725 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3726 cc = ch;
|
Chris@16
|
3727 #else
|
Chris@16
|
3728 cc = ct.narrow(ch, char());
|
Chris@16
|
3729 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3730
|
Chris@16
|
3731 if (cc == ')') // read "(a,b,c,d,e)"
|
Chris@16
|
3732 {
|
Chris@16
|
3733 o = octonion<T>(a,b,c,d,e);
|
Chris@16
|
3734 }
|
Chris@16
|
3735 else if (cc == ',') // read "(a,b,c,d,e,"
|
Chris@16
|
3736 {
|
Chris@16
|
3737 is >> f; // read "(a,b,c,d,e,f"
|
Chris@16
|
3738
|
Chris@16
|
3739 if (!is.good()) goto finish;
|
Chris@16
|
3740
|
Chris@16
|
3741 is >> ch; // get the next lexeme
|
Chris@16
|
3742
|
Chris@16
|
3743 if (!is.good()) goto finish;
|
Chris@16
|
3744
|
Chris@16
|
3745 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3746 cc = ch;
|
Chris@16
|
3747 #else
|
Chris@16
|
3748 cc = ct.narrow(ch, char());
|
Chris@16
|
3749 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3750
|
Chris@16
|
3751 if (cc == ')') // read "(a,b,c,d,e,f)"
|
Chris@16
|
3752 {
|
Chris@16
|
3753 o = octonion<T>(a,b,c,d,e,f);
|
Chris@16
|
3754 }
|
Chris@16
|
3755 else if (cc == ',') // read "(a,b,c,d,e,f,"
|
Chris@16
|
3756 {
|
Chris@16
|
3757 is >> g; // read "(a,b,c,d,e,f,g" // read "(a,b,c,d,e,f"
|
Chris@16
|
3758
|
Chris@16
|
3759 if (!is.good()) goto finish;
|
Chris@16
|
3760
|
Chris@16
|
3761 is >> ch; // get the next lexeme
|
Chris@16
|
3762
|
Chris@16
|
3763 if (!is.good()) goto finish;
|
Chris@16
|
3764
|
Chris@16
|
3765 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3766 cc = ch;
|
Chris@16
|
3767 #else
|
Chris@16
|
3768 cc = ct.narrow(ch, char());
|
Chris@16
|
3769 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3770
|
Chris@16
|
3771 if (cc == ')') // read "(a,b,c,d,e,f,g)"
|
Chris@16
|
3772 {
|
Chris@16
|
3773 o = octonion<T>(a,b,c,d,e,f,g);
|
Chris@16
|
3774 }
|
Chris@16
|
3775 else if (cc == ',') // read "(a,b,c,d,e,f,g,"
|
Chris@16
|
3776 {
|
Chris@16
|
3777 is >> h; // read "(a,b,c,d,e,f,g,h" // read "(a,b,c,d,e,f,g" // read "(a,b,c,d,e,f"
|
Chris@16
|
3778
|
Chris@16
|
3779 if (!is.good()) goto finish;
|
Chris@16
|
3780
|
Chris@16
|
3781 is >> ch; // get the next lexeme
|
Chris@16
|
3782
|
Chris@16
|
3783 if (!is.good()) goto finish;
|
Chris@16
|
3784
|
Chris@16
|
3785 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3786 cc = ch;
|
Chris@16
|
3787 #else
|
Chris@16
|
3788 cc = ct.narrow(ch, char());
|
Chris@16
|
3789 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3790
|
Chris@16
|
3791 if (cc == ')') // read "(a,b,c,d,e,f,g,h)"
|
Chris@16
|
3792 {
|
Chris@16
|
3793 o = octonion<T>(a,b,c,d,e,f,g,h);
|
Chris@16
|
3794 }
|
Chris@16
|
3795 else // error
|
Chris@16
|
3796 {
|
Chris@16
|
3797 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3798 }
|
Chris@16
|
3799 }
|
Chris@16
|
3800 else // error
|
Chris@16
|
3801 {
|
Chris@16
|
3802 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3803 }
|
Chris@16
|
3804 }
|
Chris@16
|
3805 else // error
|
Chris@16
|
3806 {
|
Chris@16
|
3807 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3808 }
|
Chris@16
|
3809 }
|
Chris@16
|
3810 else // error
|
Chris@16
|
3811 {
|
Chris@16
|
3812 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3813 }
|
Chris@16
|
3814 }
|
Chris@16
|
3815 else // error
|
Chris@16
|
3816 {
|
Chris@16
|
3817 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3818 }
|
Chris@16
|
3819 }
|
Chris@16
|
3820 }
|
Chris@16
|
3821 else // error
|
Chris@16
|
3822 {
|
Chris@16
|
3823 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3824 }
|
Chris@16
|
3825 }
|
Chris@16
|
3826 }
|
Chris@16
|
3827 else // error
|
Chris@16
|
3828 {
|
Chris@16
|
3829 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3830 }
|
Chris@16
|
3831 }
|
Chris@16
|
3832 }
|
Chris@16
|
3833 else // error
|
Chris@16
|
3834 {
|
Chris@16
|
3835 is.setstate(::std::ios_base::failbit);
|
Chris@16
|
3836 }
|
Chris@16
|
3837 }
|
Chris@16
|
3838 }
|
Chris@16
|
3839 else // format: a
|
Chris@16
|
3840 {
|
Chris@16
|
3841 is.putback(ch);
|
Chris@16
|
3842
|
Chris@16
|
3843 is >> a; // we extract the first component
|
Chris@16
|
3844
|
Chris@16
|
3845 if (!is.good()) goto finish;
|
Chris@16
|
3846
|
Chris@16
|
3847 o = octonion<T>(a);
|
Chris@16
|
3848 }
|
Chris@16
|
3849
|
Chris@16
|
3850 finish:
|
Chris@16
|
3851 return(is);
|
Chris@16
|
3852 }
|
Chris@16
|
3853
|
Chris@16
|
3854
|
Chris@16
|
3855 template<typename T, typename charT, class traits>
|
Chris@16
|
3856 ::std::basic_ostream<charT,traits> & operator << ( ::std::basic_ostream<charT,traits> & os,
|
Chris@16
|
3857 octonion<T> const & o)
|
Chris@16
|
3858 {
|
Chris@16
|
3859 ::std::basic_ostringstream<charT,traits> s;
|
Chris@16
|
3860
|
Chris@16
|
3861 s.flags(os.flags());
|
Chris@16
|
3862 #ifdef BOOST_NO_STD_LOCALE
|
Chris@16
|
3863 #else
|
Chris@16
|
3864 s.imbue(os.getloc());
|
Chris@16
|
3865 #endif /* BOOST_NO_STD_LOCALE */
|
Chris@16
|
3866 s.precision(os.precision());
|
Chris@16
|
3867
|
Chris@16
|
3868 s << '(' << o.R_component_1() << ','
|
Chris@16
|
3869 << o.R_component_2() << ','
|
Chris@16
|
3870 << o.R_component_3() << ','
|
Chris@16
|
3871 << o.R_component_4() << ','
|
Chris@16
|
3872 << o.R_component_5() << ','
|
Chris@16
|
3873 << o.R_component_6() << ','
|
Chris@16
|
3874 << o.R_component_7() << ','
|
Chris@16
|
3875 << o.R_component_8() << ')';
|
Chris@16
|
3876
|
Chris@16
|
3877 return os << s.str();
|
Chris@16
|
3878 }
|
Chris@16
|
3879
|
Chris@16
|
3880
|
Chris@16
|
3881 // values
|
Chris@16
|
3882
|
Chris@16
|
3883 template<typename T>
|
Chris@16
|
3884 inline T real(octonion<T> const & o)
|
Chris@16
|
3885 {
|
Chris@16
|
3886 return(o.real());
|
Chris@16
|
3887 }
|
Chris@16
|
3888
|
Chris@16
|
3889
|
Chris@16
|
3890 template<typename T>
|
Chris@16
|
3891 inline octonion<T> unreal(octonion<T> const & o)
|
Chris@16
|
3892 {
|
Chris@16
|
3893 return(o.unreal());
|
Chris@16
|
3894 }
|
Chris@16
|
3895
|
Chris@16
|
3896
|
Chris@16
|
3897 #define BOOST_OCTONION_VALARRAY_LOADER \
|
Chris@16
|
3898 using ::std::valarray; \
|
Chris@16
|
3899 \
|
Chris@16
|
3900 valarray<T> temp(8); \
|
Chris@16
|
3901 \
|
Chris@16
|
3902 temp[0] = o.R_component_1(); \
|
Chris@16
|
3903 temp[1] = o.R_component_2(); \
|
Chris@16
|
3904 temp[2] = o.R_component_3(); \
|
Chris@16
|
3905 temp[3] = o.R_component_4(); \
|
Chris@16
|
3906 temp[4] = o.R_component_5(); \
|
Chris@16
|
3907 temp[5] = o.R_component_6(); \
|
Chris@16
|
3908 temp[6] = o.R_component_7(); \
|
Chris@16
|
3909 temp[7] = o.R_component_8();
|
Chris@16
|
3910
|
Chris@16
|
3911
|
Chris@16
|
3912 template<typename T>
|
Chris@16
|
3913 inline T sup(octonion<T> const & o)
|
Chris@16
|
3914 {
|
Chris@16
|
3915 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
|
Chris@16
|
3916 using ::std::abs;
|
Chris@16
|
3917 #endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
|
Chris@16
|
3918
|
Chris@16
|
3919 BOOST_OCTONION_VALARRAY_LOADER
|
Chris@16
|
3920
|
Chris@16
|
3921 return((abs(temp).max)());
|
Chris@16
|
3922 }
|
Chris@16
|
3923
|
Chris@16
|
3924
|
Chris@16
|
3925 template<typename T>
|
Chris@16
|
3926 inline T l1(octonion<T> const & o)
|
Chris@16
|
3927 {
|
Chris@16
|
3928 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
|
Chris@16
|
3929 using ::std::abs;
|
Chris@16
|
3930 #endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
|
Chris@16
|
3931
|
Chris@16
|
3932 BOOST_OCTONION_VALARRAY_LOADER
|
Chris@16
|
3933
|
Chris@16
|
3934 return(abs(temp).sum());
|
Chris@16
|
3935 }
|
Chris@16
|
3936
|
Chris@16
|
3937
|
Chris@16
|
3938 template<typename T>
|
Chris@16
|
3939 inline T abs(const octonion<T> & o)
|
Chris@16
|
3940 {
|
Chris@16
|
3941 #ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP
|
Chris@16
|
3942 using ::std::abs;
|
Chris@16
|
3943 #endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */
|
Chris@16
|
3944
|
Chris@16
|
3945 using ::std::sqrt;
|
Chris@16
|
3946
|
Chris@16
|
3947 BOOST_OCTONION_VALARRAY_LOADER
|
Chris@16
|
3948
|
Chris@16
|
3949 T maxim = (abs(temp).max)(); // overflow protection
|
Chris@16
|
3950
|
Chris@16
|
3951 if (maxim == static_cast<T>(0))
|
Chris@16
|
3952 {
|
Chris@16
|
3953 return(maxim);
|
Chris@16
|
3954 }
|
Chris@16
|
3955 else
|
Chris@16
|
3956 {
|
Chris@16
|
3957 T mixam = static_cast<T>(1)/maxim; // prefer multiplications over divisions
|
Chris@16
|
3958
|
Chris@16
|
3959 temp *= mixam;
|
Chris@16
|
3960
|
Chris@16
|
3961 temp *= temp;
|
Chris@16
|
3962
|
Chris@16
|
3963 return(maxim*sqrt(temp.sum()));
|
Chris@16
|
3964 }
|
Chris@16
|
3965
|
Chris@16
|
3966 //return(::std::sqrt(norm(o)));
|
Chris@16
|
3967 }
|
Chris@16
|
3968
|
Chris@16
|
3969
|
Chris@16
|
3970 #undef BOOST_OCTONION_VALARRAY_LOADER
|
Chris@16
|
3971
|
Chris@16
|
3972
|
Chris@16
|
3973 // Note: This is the Cayley norm, not the Euclidian norm...
|
Chris@16
|
3974
|
Chris@16
|
3975 template<typename T>
|
Chris@16
|
3976 inline T norm(octonion<T> const & o)
|
Chris@16
|
3977 {
|
Chris@16
|
3978 return(real(o*conj(o)));
|
Chris@16
|
3979 }
|
Chris@16
|
3980
|
Chris@16
|
3981
|
Chris@16
|
3982 template<typename T>
|
Chris@16
|
3983 inline octonion<T> conj(octonion<T> const & o)
|
Chris@16
|
3984 {
|
Chris@16
|
3985 return(octonion<T>( +o.R_component_1(),
|
Chris@16
|
3986 -o.R_component_2(),
|
Chris@16
|
3987 -o.R_component_3(),
|
Chris@16
|
3988 -o.R_component_4(),
|
Chris@16
|
3989 -o.R_component_5(),
|
Chris@16
|
3990 -o.R_component_6(),
|
Chris@16
|
3991 -o.R_component_7(),
|
Chris@16
|
3992 -o.R_component_8()));
|
Chris@16
|
3993 }
|
Chris@16
|
3994
|
Chris@16
|
3995
|
Chris@16
|
3996 // Note: There is little point, for the octonions, to introduce the equivalents
|
Chris@16
|
3997 // to the complex "arg" and the quaternionic "cylindropolar".
|
Chris@16
|
3998
|
Chris@16
|
3999
|
Chris@16
|
4000 template<typename T>
|
Chris@16
|
4001 inline octonion<T> spherical(T const & rho,
|
Chris@16
|
4002 T const & theta,
|
Chris@16
|
4003 T const & phi1,
|
Chris@16
|
4004 T const & phi2,
|
Chris@16
|
4005 T const & phi3,
|
Chris@16
|
4006 T const & phi4,
|
Chris@16
|
4007 T const & phi5,
|
Chris@16
|
4008 T const & phi6)
|
Chris@16
|
4009 {
|
Chris@16
|
4010 using ::std::cos;
|
Chris@16
|
4011 using ::std::sin;
|
Chris@16
|
4012
|
Chris@16
|
4013 //T a = cos(theta)*cos(phi1)*cos(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
|
Chris@16
|
4014 //T b = sin(theta)*cos(phi1)*cos(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
|
Chris@16
|
4015 //T c = sin(phi1)*cos(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
|
Chris@16
|
4016 //T d = sin(phi2)*cos(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
|
Chris@16
|
4017 //T e = sin(phi3)*cos(phi4)*cos(phi5)*cos(phi6);
|
Chris@16
|
4018 //T f = sin(phi4)*cos(phi5)*cos(phi6);
|
Chris@16
|
4019 //T g = sin(phi5)*cos(phi6);
|
Chris@16
|
4020 //T h = sin(phi6);
|
Chris@16
|
4021
|
Chris@16
|
4022 T courrant = static_cast<T>(1);
|
Chris@16
|
4023
|
Chris@16
|
4024 T h = sin(phi6);
|
Chris@16
|
4025
|
Chris@16
|
4026 courrant *= cos(phi6);
|
Chris@16
|
4027
|
Chris@16
|
4028 T g = sin(phi5)*courrant;
|
Chris@16
|
4029
|
Chris@16
|
4030 courrant *= cos(phi5);
|
Chris@16
|
4031
|
Chris@16
|
4032 T f = sin(phi4)*courrant;
|
Chris@16
|
4033
|
Chris@16
|
4034 courrant *= cos(phi4);
|
Chris@16
|
4035
|
Chris@16
|
4036 T e = sin(phi3)*courrant;
|
Chris@16
|
4037
|
Chris@16
|
4038 courrant *= cos(phi3);
|
Chris@16
|
4039
|
Chris@16
|
4040 T d = sin(phi2)*courrant;
|
Chris@16
|
4041
|
Chris@16
|
4042 courrant *= cos(phi2);
|
Chris@16
|
4043
|
Chris@16
|
4044 T c = sin(phi1)*courrant;
|
Chris@16
|
4045
|
Chris@16
|
4046 courrant *= cos(phi1);
|
Chris@16
|
4047
|
Chris@16
|
4048 T b = sin(theta)*courrant;
|
Chris@16
|
4049 T a = cos(theta)*courrant;
|
Chris@16
|
4050
|
Chris@16
|
4051 return(rho*octonion<T>(a,b,c,d,e,f,g,h));
|
Chris@16
|
4052 }
|
Chris@16
|
4053
|
Chris@16
|
4054
|
Chris@16
|
4055 template<typename T>
|
Chris@16
|
4056 inline octonion<T> multipolar(T const & rho1,
|
Chris@16
|
4057 T const & theta1,
|
Chris@16
|
4058 T const & rho2,
|
Chris@16
|
4059 T const & theta2,
|
Chris@16
|
4060 T const & rho3,
|
Chris@16
|
4061 T const & theta3,
|
Chris@16
|
4062 T const & rho4,
|
Chris@16
|
4063 T const & theta4)
|
Chris@16
|
4064 {
|
Chris@16
|
4065 using ::std::cos;
|
Chris@16
|
4066 using ::std::sin;
|
Chris@16
|
4067
|
Chris@16
|
4068 T a = rho1*cos(theta1);
|
Chris@16
|
4069 T b = rho1*sin(theta1);
|
Chris@16
|
4070 T c = rho2*cos(theta2);
|
Chris@16
|
4071 T d = rho2*sin(theta2);
|
Chris@16
|
4072 T e = rho3*cos(theta3);
|
Chris@16
|
4073 T f = rho3*sin(theta3);
|
Chris@16
|
4074 T g = rho4*cos(theta4);
|
Chris@16
|
4075 T h = rho4*sin(theta4);
|
Chris@16
|
4076
|
Chris@16
|
4077 return(octonion<T>(a,b,c,d,e,f,g,h));
|
Chris@16
|
4078 }
|
Chris@16
|
4079
|
Chris@16
|
4080
|
Chris@16
|
4081 template<typename T>
|
Chris@16
|
4082 inline octonion<T> cylindrical(T const & r,
|
Chris@16
|
4083 T const & angle,
|
Chris@16
|
4084 T const & h1,
|
Chris@16
|
4085 T const & h2,
|
Chris@16
|
4086 T const & h3,
|
Chris@16
|
4087 T const & h4,
|
Chris@16
|
4088 T const & h5,
|
Chris@16
|
4089 T const & h6)
|
Chris@16
|
4090 {
|
Chris@16
|
4091 using ::std::cos;
|
Chris@16
|
4092 using ::std::sin;
|
Chris@16
|
4093
|
Chris@16
|
4094 T a = r*cos(angle);
|
Chris@16
|
4095 T b = r*sin(angle);
|
Chris@16
|
4096
|
Chris@16
|
4097 return(octonion<T>(a,b,h1,h2,h3,h4,h5,h6));
|
Chris@16
|
4098 }
|
Chris@16
|
4099
|
Chris@16
|
4100
|
Chris@16
|
4101 template<typename T>
|
Chris@16
|
4102 inline octonion<T> exp(octonion<T> const & o)
|
Chris@16
|
4103 {
|
Chris@16
|
4104 using ::std::exp;
|
Chris@16
|
4105 using ::std::cos;
|
Chris@16
|
4106
|
Chris@16
|
4107 using ::boost::math::sinc_pi;
|
Chris@16
|
4108
|
Chris@16
|
4109 T u = exp(real(o));
|
Chris@16
|
4110
|
Chris@16
|
4111 T z = abs(unreal(o));
|
Chris@16
|
4112
|
Chris@16
|
4113 T w = sinc_pi(z);
|
Chris@16
|
4114
|
Chris@16
|
4115 return(u*octonion<T>(cos(z),
|
Chris@16
|
4116 w*o.R_component_2(), w*o.R_component_3(),
|
Chris@16
|
4117 w*o.R_component_4(), w*o.R_component_5(),
|
Chris@16
|
4118 w*o.R_component_6(), w*o.R_component_7(),
|
Chris@16
|
4119 w*o.R_component_8()));
|
Chris@16
|
4120 }
|
Chris@16
|
4121
|
Chris@16
|
4122
|
Chris@16
|
4123 template<typename T>
|
Chris@16
|
4124 inline octonion<T> cos(octonion<T> const & o)
|
Chris@16
|
4125 {
|
Chris@16
|
4126 using ::std::sin;
|
Chris@16
|
4127 using ::std::cos;
|
Chris@16
|
4128 using ::std::cosh;
|
Chris@16
|
4129
|
Chris@16
|
4130 using ::boost::math::sinhc_pi;
|
Chris@16
|
4131
|
Chris@16
|
4132 T z = abs(unreal(o));
|
Chris@16
|
4133
|
Chris@16
|
4134 T w = -sin(o.real())*sinhc_pi(z);
|
Chris@16
|
4135
|
Chris@16
|
4136 return(octonion<T>(cos(o.real())*cosh(z),
|
Chris@16
|
4137 w*o.R_component_2(), w*o.R_component_3(),
|
Chris@16
|
4138 w*o.R_component_4(), w*o.R_component_5(),
|
Chris@16
|
4139 w*o.R_component_6(), w*o.R_component_7(),
|
Chris@16
|
4140 w*o.R_component_8()));
|
Chris@16
|
4141 }
|
Chris@16
|
4142
|
Chris@16
|
4143
|
Chris@16
|
4144 template<typename T>
|
Chris@16
|
4145 inline octonion<T> sin(octonion<T> const & o)
|
Chris@16
|
4146 {
|
Chris@16
|
4147 using ::std::sin;
|
Chris@16
|
4148 using ::std::cos;
|
Chris@16
|
4149 using ::std::cosh;
|
Chris@16
|
4150
|
Chris@16
|
4151 using ::boost::math::sinhc_pi;
|
Chris@16
|
4152
|
Chris@16
|
4153 T z = abs(unreal(o));
|
Chris@16
|
4154
|
Chris@16
|
4155 T w = +cos(o.real())*sinhc_pi(z);
|
Chris@16
|
4156
|
Chris@16
|
4157 return(octonion<T>(sin(o.real())*cosh(z),
|
Chris@16
|
4158 w*o.R_component_2(), w*o.R_component_3(),
|
Chris@16
|
4159 w*o.R_component_4(), w*o.R_component_5(),
|
Chris@16
|
4160 w*o.R_component_6(), w*o.R_component_7(),
|
Chris@16
|
4161 w*o.R_component_8()));
|
Chris@16
|
4162 }
|
Chris@16
|
4163
|
Chris@16
|
4164
|
Chris@16
|
4165 template<typename T>
|
Chris@16
|
4166 inline octonion<T> tan(octonion<T> const & o)
|
Chris@16
|
4167 {
|
Chris@16
|
4168 return(sin(o)/cos(o));
|
Chris@16
|
4169 }
|
Chris@16
|
4170
|
Chris@16
|
4171
|
Chris@16
|
4172 template<typename T>
|
Chris@16
|
4173 inline octonion<T> cosh(octonion<T> const & o)
|
Chris@16
|
4174 {
|
Chris@16
|
4175 return((exp(+o)+exp(-o))/static_cast<T>(2));
|
Chris@16
|
4176 }
|
Chris@16
|
4177
|
Chris@16
|
4178
|
Chris@16
|
4179 template<typename T>
|
Chris@16
|
4180 inline octonion<T> sinh(octonion<T> const & o)
|
Chris@16
|
4181 {
|
Chris@16
|
4182 return((exp(+o)-exp(-o))/static_cast<T>(2));
|
Chris@16
|
4183 }
|
Chris@16
|
4184
|
Chris@16
|
4185
|
Chris@16
|
4186 template<typename T>
|
Chris@16
|
4187 inline octonion<T> tanh(octonion<T> const & o)
|
Chris@16
|
4188 {
|
Chris@16
|
4189 return(sinh(o)/cosh(o));
|
Chris@16
|
4190 }
|
Chris@16
|
4191
|
Chris@16
|
4192
|
Chris@16
|
4193 template<typename T>
|
Chris@16
|
4194 octonion<T> pow(octonion<T> const & o,
|
Chris@16
|
4195 int n)
|
Chris@16
|
4196 {
|
Chris@16
|
4197 if (n > 1)
|
Chris@16
|
4198 {
|
Chris@16
|
4199 int m = n>>1;
|
Chris@16
|
4200
|
Chris@16
|
4201 octonion<T> result = pow(o, m);
|
Chris@16
|
4202
|
Chris@16
|
4203 result *= result;
|
Chris@16
|
4204
|
Chris@16
|
4205 if (n != (m<<1))
|
Chris@16
|
4206 {
|
Chris@16
|
4207 result *= o; // n odd
|
Chris@16
|
4208 }
|
Chris@16
|
4209
|
Chris@16
|
4210 return(result);
|
Chris@16
|
4211 }
|
Chris@16
|
4212 else if (n == 1)
|
Chris@16
|
4213 {
|
Chris@16
|
4214 return(o);
|
Chris@16
|
4215 }
|
Chris@16
|
4216 else if (n == 0)
|
Chris@16
|
4217 {
|
Chris@16
|
4218 return(octonion<T>(static_cast<T>(1)));
|
Chris@16
|
4219 }
|
Chris@16
|
4220 else /* n < 0 */
|
Chris@16
|
4221 {
|
Chris@16
|
4222 return(pow(octonion<T>(static_cast<T>(1))/o,-n));
|
Chris@16
|
4223 }
|
Chris@16
|
4224 }
|
Chris@16
|
4225
|
Chris@16
|
4226
|
Chris@16
|
4227 // helper templates for converting copy constructors (definition)
|
Chris@16
|
4228
|
Chris@16
|
4229 namespace detail
|
Chris@16
|
4230 {
|
Chris@16
|
4231
|
Chris@16
|
4232 template< typename T,
|
Chris@16
|
4233 typename U
|
Chris@16
|
4234 >
|
Chris@16
|
4235 octonion<T> octonion_type_converter(octonion<U> const & rhs)
|
Chris@16
|
4236 {
|
Chris@16
|
4237 return(octonion<T>( static_cast<T>(rhs.R_component_1()),
|
Chris@16
|
4238 static_cast<T>(rhs.R_component_2()),
|
Chris@16
|
4239 static_cast<T>(rhs.R_component_3()),
|
Chris@16
|
4240 static_cast<T>(rhs.R_component_4()),
|
Chris@16
|
4241 static_cast<T>(rhs.R_component_5()),
|
Chris@16
|
4242 static_cast<T>(rhs.R_component_6()),
|
Chris@16
|
4243 static_cast<T>(rhs.R_component_7()),
|
Chris@16
|
4244 static_cast<T>(rhs.R_component_8())));
|
Chris@16
|
4245 }
|
Chris@16
|
4246 }
|
Chris@16
|
4247 }
|
Chris@16
|
4248 }
|
Chris@16
|
4249
|
Chris@16
|
4250 #endif /* BOOST_OCTONION_HPP */
|