annotate DEPENDENCIES/generic/include/boost/math/octonion.hpp @ 16:2665513ce2d3

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