File indexing completed on 2023-03-17 11:12:46
0001 #include <string>
0002 #include <sstream>
0003 #include <cmath>
0004
0005 namespace {
0006
0007 template <typename T>
0008 inline T deltaPhiInRadians(T phi1, T phi2) {
0009 T result = phi1 - phi2;
0010 constexpr T _twopi = M_PI * 2.;
0011 result /= _twopi;
0012 result -= std::round(result);
0013 result *= _twopi;
0014 return result;
0015 }
0016
0017 template <typename T>
0018 inline T deltaPhiInDegrees(T phi1, T phi2) {
0019 T result = phi1 - phi2;
0020 constexpr T _twopi = 360.;
0021 result /= _twopi;
0022 result -= std::round(result);
0023 result *= _twopi;
0024 return result;
0025 }
0026
0027 template <typename T>
0028 T get_subword(T word, unsigned int msb, unsigned int lsb) {
0029 int len = msb - lsb + 1;
0030 len = (len < 0) ? 0 : len;
0031 return (word >> (lsb)) & ((1u << len) - 1);
0032 }
0033
0034 template <typename T>
0035 std::string print_subaddresses(T address) {
0036 int mode_inv = (address >> (30 - 4)) & ((1 << 4) - 1);
0037 std::stringstream ss;
0038
0039 switch (mode_inv) {
0040 case 0:
0041 case 1:
0042 case 2:
0043 case 4:
0044 case 8:
0045
0046 ss << get_subword(address, 29, 26) << ":" << get_subword(address, 25, 0);
0047 break;
0048
0049 case 3:
0050 case 5:
0051 case 9:
0052 case 6:
0053 case 10:
0054 case 12:
0055
0056 ss << get_subword(address, 29, 26) << ":" << get_subword(address, 25, 21) << ":" << get_subword(address, 20, 20)
0057 << ":" << get_subword(address, 19, 19) << ":" << get_subword(address, 18, 16) << ":"
0058 << get_subword(address, 15, 13) << ":" << get_subword(address, 12, 10) << ":" << get_subword(address, 9, 9)
0059 << ":" << get_subword(address, 8, 0);
0060 break;
0061
0062 case 7:
0063 case 11:
0064 case 13:
0065
0066 ss << get_subword(address, 29, 26) << ":" << get_subword(address, 25, 21) << ":" << get_subword(address, 20, 20)
0067 << ":" << get_subword(address, 19, 17) << ":" << get_subword(address, 16, 14) << ":"
0068 << get_subword(address, 13, 13) << ":" << get_subword(address, 12, 12) << ":" << get_subword(address, 11, 7)
0069 << ":" << get_subword(address, 6, 0);
0070 break;
0071
0072 case 14:
0073
0074 ss << get_subword(address, 29, 26) << ":" << get_subword(address, 25, 21) << ":" << get_subword(address, 20, 18)
0075 << ":" << get_subword(address, 17, 15) << ":" << get_subword(address, 14, 14) << ":"
0076 << get_subword(address, 13, 13) << ":" << get_subword(address, 12, 7) << ":" << get_subword(address, 6, 0);
0077 break;
0078
0079 case 15:
0080
0081 ss << get_subword(address, 29, 26) << ":" << get_subword(address, 25, 21) << ":" << get_subword(address, 20, 20)
0082 << ":" << get_subword(address, 19, 19) << ":" << get_subword(address, 18, 18) << ":"
0083 << get_subword(address, 17, 12) << ":" << get_subword(address, 11, 7) << ":" << get_subword(address, 6, 0);
0084 break;
0085
0086 default:
0087 break;
0088 }
0089 return ss.str();
0090 }
0091
0092 }