Line data Source code
1 1 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : /// \file 5 : /// Defines helper functions for working with boost. 6 : 7 : #pragma once 8 : 9 : #include <boost/container/small_vector.hpp> 10 : #include <boost/container/static_vector.hpp> 11 : #include <boost/math/quaternion.hpp> 12 : #include <boost/rational.hpp> 13 : #include <pup.h> 14 : 15 : namespace PUP { 16 : /// @{ 17 : /// \ingroup ParallelGroup 18 : /// Serialization of boost::rational for Charm++ 19 : template <class T> 20 : void pup(PUP::er& p, boost::rational<T>& var) { // NOLINT 21 : if (p.isUnpacking()) { 22 : typename boost::rational<T>::int_type n, d; 23 : p | n; 24 : p | d; 25 : var.assign(n, d); 26 : } else { 27 : typename boost::rational<T>::int_type n = var.numerator(); 28 : typename boost::rational<T>::int_type d = var.denominator(); 29 : p | n; 30 : p | d; 31 : } 32 : } 33 : 34 : template <typename T> 35 : inline void operator|(PUP::er& p, boost::rational<T>& var) { // NOLINT 36 : pup(p, var); 37 : } 38 : /// @} 39 : 40 : template <class T, size_t N> 41 : void pup(PUP::er& p, boost::container::static_vector<T, N>& v) { 42 : auto size = v.size(); 43 : p | size; 44 : v.resize(size); 45 : if (PUP::as_bytes<T>::value) { 46 : PUParray(p, v.data(), size); 47 : } else { 48 : for (auto& x : v) { 49 : p | x; 50 : } 51 : } 52 : } 53 : 54 : template <class T, size_t N> 55 : void operator|(PUP::er& p, boost::container::static_vector<T, N>& v) { 56 : pup(p, v); 57 : } 58 : 59 : template <class T, size_t N> 60 : void pup(PUP::er& p, boost::container::small_vector<T, N>& v) { 61 : auto size = v.size(); 62 : p | size; 63 : v.resize(size); 64 : if (PUP::as_bytes<T>::value) { 65 : PUParray(p, v.data(), size); 66 : } else { 67 : for (auto& x : v) { 68 : p | x; 69 : } 70 : } 71 : } 72 : 73 : template <class T, size_t N> 74 : void operator|(PUP::er& p, boost::container::small_vector<T, N>& v) { 75 : pup(p, v); 76 : } 77 : 78 : template <typename T> 79 : void pup(PUP::er& p, boost::math::quaternion<T>& quaternion) { 80 : T component_1 = quaternion.R_component_1(); 81 : T component_2 = quaternion.R_component_2(); 82 : T component_3 = quaternion.R_component_3(); 83 : T component_4 = quaternion.R_component_4(); 84 : p | component_1; 85 : p | component_2; 86 : p | component_3; 87 : p | component_4; 88 : if (p.isUnpacking()) { 89 : quaternion = boost::math::quaternion<T>(component_1, component_2, 90 : component_3, component_4); 91 : } 92 : } 93 : 94 : template <typename T> 95 : void operator|(PUP::er& p, boost::math::quaternion<T>& quaternion) { 96 : pup(p, quaternion); 97 : } 98 : } // namespace PUP