diff --git a/Control/CxxUtils/CxxUtils/get_unaligned.h b/Control/CxxUtils/CxxUtils/get_unaligned.h index 9adf4f757ab4354b253a6eb6a5ccb3f34c2856f5..48a2df6faa82f4ab879cb833e8e012923db3aeaa 100644 --- a/Control/CxxUtils/CxxUtils/get_unaligned.h +++ b/Control/CxxUtils/CxxUtils/get_unaligned.h @@ -147,6 +147,93 @@ double get_unaligned_double (const uint8_t* ATH_RESTRICT & p) } +/// Define templated versions of the above functions. + + +template <class T> +T get_unaligned (const uint8_t* ATH_RESTRICT & p); + + +template <> +inline +uint8_t get_unaligned<uint8_t> (const uint8_t* ATH_RESTRICT & p) +{ + return *p++; +} + + +template <> +inline +uint16_t get_unaligned<uint16_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned16 (p); +} + + +template <> +inline +uint32_t get_unaligned<uint32_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned32 (p); +} + + +template <> +inline +uint64_t get_unaligned<uint64_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned64 (p); +} + + +template <> +inline +float get_unaligned<float> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned_float (p); +} + + +template <> +inline +double get_unaligned<double> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned_double (p); +} + + +template <> +inline +int8_t get_unaligned<int8_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned<uint8_t> (p); +} + + +template <> +inline +int16_t get_unaligned<int16_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned<uint16_t> (p); +} + + +template <> +inline +int32_t get_unaligned<int32_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned<uint32_t> (p); +} + + +template <> +inline +int64_t get_unaligned<int64_t> (const uint8_t* ATH_RESTRICT & p) +{ + return get_unaligned<uint64_t> (p); +} + + } // namespace CxxUtils diff --git a/Control/CxxUtils/test/get_unaligned_test.cxx b/Control/CxxUtils/test/get_unaligned_test.cxx index 93a93e8636074dab6367a0b159404c81d0a615c5..b7db1dce12680b66ee8ee0fa4ef1961bbdd306c2 100644 --- a/Control/CxxUtils/test/get_unaligned_test.cxx +++ b/Control/CxxUtils/test/get_unaligned_test.cxx @@ -21,25 +21,56 @@ void test1() std::cout << "test1\n"; uint8_t arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; const uint8_t* p = arr+1; + assert (CxxUtils::get_unaligned<uint8_t> (p) == 1); + assert (p == arr+2); + p = arr+1; + assert (CxxUtils::get_unaligned<int8_t> (p) == 1); + assert (p == arr+2); + + p = arr+1; assert (CxxUtils::get_unaligned16 (p) == 0x201); assert (p == arr+3); + p = arr+1; + assert (CxxUtils::get_unaligned<uint16_t> (p) == 0x201); + assert (p == arr+3); + p = arr+1; + assert (CxxUtils::get_unaligned<int16_t> (p) == 0x201); + assert (p == arr+3); assert (CxxUtils::get_unaligned32 (p) == 0x6050403); assert (p == arr+7); + p = arr+3; + assert (CxxUtils::get_unaligned<uint32_t> (p) == 0x6050403); + assert (p == arr+7); + p = arr+3; + assert (CxxUtils::get_unaligned<int32_t> (p) == 0x6050403); + assert (p == arr+7); const uint8_t* ATH_RESTRICT q = arr+1; assert (CxxUtils::get_unaligned64 (q) == 0x807060504030201); assert (q == arr+9); + q = arr+1; + assert (CxxUtils::get_unaligned<uint64_t> (q) == 0x807060504030201); + assert (q == arr+9); + q = arr+1; + assert (CxxUtils::get_unaligned<int64_t> (q) == 0x807060504030201); + assert (q == arr+9); uint8_t arr_f[] = { 0, 0, 0, 72, 64 }; const uint8_t* pf = arr_f+1; assert (CxxUtils::get_unaligned_float (pf) == 3.125); assert (pf == arr_f+5); + pf = arr_f+1; + assert (CxxUtils::get_unaligned<float> (pf) == 3.125); + assert (pf == arr_f+5); uint8_t arr_d[] = { 0, 0, 0, 0, 0, 0, 0, 9, 64 }; const uint8_t* pd = arr_d+1; assert (CxxUtils::get_unaligned_double (pd) == 3.125); assert (pd == arr_d+9); + pd = arr_d+1; + assert (CxxUtils::get_unaligned<double> (pd) == 3.125); + assert (pd == arr_d+9); }