From d4b2feebe40851b1bc0634bc0835fcd135046072 Mon Sep 17 00:00:00 2001 From: "xiang.zhou" Date: Wed, 21 Aug 2024 16:43:17 +0800 Subject: [PATCH] add api about doing with basic data type --- include/neuron/type.h | 369 ++++++++++++++++++++++++++-------------- tests/ut/CMakeLists.txt | 9 + tests/ut/common_test.cc | 90 ++++++++++ 3 files changed, 337 insertions(+), 131 deletions(-) create mode 100644 tests/ut/common_test.cc diff --git a/include/neuron/type.h b/include/neuron/type.h index 5add54ae..c38c4fcf 100644 --- a/include/neuron/type.h +++ b/include/neuron/type.h @@ -474,6 +474,238 @@ static inline void neu_value16_set_bit(neu_value16_u *value, uint8_t index, } } +static inline uint16_t neu_get_u16(uint8_t *bytes) +{ + uint16_t ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + + return ret; +} + +static inline void neu_set_u16(uint8_t *bytes, uint16_t val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; +} + +static inline int16_t neu_get_i16(uint8_t *bytes) +{ + int16_t ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + + return ret; +} + +static inline void neu_set_i16(uint8_t *bytes, int16_t val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; +} + +static inline uint32_t neu_get_u32(uint8_t *bytes) +{ + uint32_t ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + t[2] = bytes[2]; + t[3] = bytes[3]; + + return ret; +} + +static inline void neu_set_u32(uint8_t *bytes, uint32_t val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; + bytes[2] = t[2]; + bytes[3] = t[3]; +} + +static inline int32_t neu_get_i32(uint8_t *bytes) +{ + int32_t ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + t[2] = bytes[2]; + t[3] = bytes[3]; + + return ret; +} + +static inline void neu_set_i32(uint8_t *bytes, int32_t val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; + bytes[2] = t[2]; + bytes[3] = t[3]; +} + +static inline float neu_get_f32(uint8_t *bytes) +{ + float ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + t[2] = bytes[2]; + t[3] = bytes[3]; + + return ret; +} + +static inline void neu_set_f32(uint8_t *bytes, float val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; + bytes[2] = t[2]; + bytes[3] = t[3]; +} + +static inline uint64_t neu_get_u64(uint8_t *bytes) +{ + uint64_t ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + t[2] = bytes[2]; + t[3] = bytes[3]; + t[4] = bytes[4]; + t[5] = bytes[5]; + t[6] = bytes[6]; + t[7] = bytes[7]; + + return ret; +} + +static inline void neu_set_u64(uint8_t *bytes, uint64_t val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; + bytes[2] = t[2]; + bytes[3] = t[3]; + bytes[4] = t[4]; + bytes[5] = t[5]; + bytes[6] = t[6]; + bytes[7] = t[7]; +} + +static inline int64_t neu_get_i64(uint8_t *bytes) +{ + int64_t ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + t[2] = bytes[2]; + t[3] = bytes[3]; + t[4] = bytes[4]; + t[5] = bytes[5]; + t[6] = bytes[6]; + t[7] = bytes[7]; + + return ret; +} + +static inline void neu_set_i64(uint8_t *bytes, int64_t val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; + bytes[2] = t[2]; + bytes[3] = t[3]; + bytes[4] = t[4]; + bytes[5] = t[5]; + bytes[6] = t[6]; + bytes[7] = t[7]; +} + +static inline double neu_get_f64(uint8_t *bytes) +{ + double ret = 0; + uint8_t *t = NULL; + + t = (uint8_t *) &ret; + + t[0] = bytes[0]; + t[1] = bytes[1]; + t[2] = bytes[2]; + t[3] = bytes[3]; + t[4] = bytes[4]; + t[5] = bytes[5]; + t[6] = bytes[6]; + t[7] = bytes[7]; + + return ret; +} + +static inline void neu_set_f64(uint8_t *bytes, double val) +{ + uint8_t *t = NULL; + + t = (uint8_t *) &val; + + bytes[0] = t[0]; + bytes[1] = t[1]; + bytes[2] = t[2]; + bytes[3] = t[3]; + bytes[4] = t[4]; + bytes[5] = t[5]; + bytes[6] = t[6]; + bytes[7] = t[7]; +} + static inline void neu_ntohs24_p(uint8_t *value) { uint8_t t = 0; @@ -513,7 +745,8 @@ static inline uint64_t neu_ntohll(uint64_t u) static inline void neu_ntonll_p(uint64_t *pu) { - *pu = neu_htonll(*pu); + uint64_t ret = neu_htonll(neu_get_u64((uint8_t *) pu)); + neu_set_u64((uint8_t *) pu, ret); } static inline void neu_htonll_p(uint64_t *pu) @@ -523,7 +756,8 @@ static inline void neu_htonll_p(uint64_t *pu) static inline void neu_ntohl_p(uint32_t *pu) { - *pu = ntohl(*pu); + uint32_t ret = ntohl(neu_get_u32((uint8_t *) pu)); + neu_set_u32((uint8_t *) pu, ret); } static inline void neu_htonl_p(uint32_t *pu) @@ -533,7 +767,8 @@ static inline void neu_htonl_p(uint32_t *pu) static inline void neu_ntohs_p(uint16_t *pu) { - *pu = ntohs(*pu); + uint16_t ret = ntohs(neu_get_u16((uint8_t *) pu)); + neu_set_u16((uint8_t *) pu, ret); } static inline void neu_htons_p(uint16_t *pu) @@ -541,134 +776,6 @@ static inline void neu_htons_p(uint16_t *pu) neu_ntohs_p(pu); } -static inline uint16_t neu_get_u16(uint8_t *bytes) -{ - uint16_t ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - - return ret; -} - -static inline int16_t neu_get_i16(uint8_t *bytes) -{ - int16_t ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - - return ret; -} - -static inline uint32_t neu_get_u32(uint8_t *bytes) -{ - uint32_t ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - t[2] = bytes[2]; - t[3] = bytes[3]; - - return ret; -} - -static inline int32_t neu_get_i32(uint8_t *bytes) -{ - int32_t ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - t[2] = bytes[2]; - t[3] = bytes[3]; - - return ret; -} - -static inline float neu_get_f32(uint8_t *bytes) -{ - float ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - t[2] = bytes[2]; - t[3] = bytes[3]; - - return ret; -} - -static inline uint64_t neu_get_u64(uint8_t *bytes) -{ - uint64_t ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - t[2] = bytes[2]; - t[3] = bytes[3]; - t[4] = bytes[4]; - t[5] = bytes[5]; - t[6] = bytes[6]; - t[7] = bytes[7]; - - return ret; -} - -static inline int64_t neu_get_i64(uint8_t *bytes) -{ - int64_t ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - t[2] = bytes[2]; - t[3] = bytes[3]; - t[4] = bytes[4]; - t[5] = bytes[5]; - t[6] = bytes[6]; - t[7] = bytes[7]; - - return ret; -} - -static inline double neu_get_f64(uint8_t *bytes) -{ - double ret = 0; - uint8_t *t = NULL; - - t = (uint8_t *) &ret; - - t[0] = bytes[0]; - t[1] = bytes[1]; - t[2] = bytes[2]; - t[3] = bytes[3]; - t[4] = bytes[4]; - t[5] = bytes[5]; - t[6] = bytes[6]; - t[7] = bytes[7]; - - return ret; -} - #ifdef __cplusplus } #endif diff --git a/tests/ut/CMakeLists.txt b/tests/ut/CMakeLists.txt index 88340072..cd70e063 100644 --- a/tests/ut/CMakeLists.txt +++ b/tests/ut/CMakeLists.txt @@ -71,6 +71,14 @@ target_include_directories(mqtt_client_test PRIVATE ) target_link_libraries(mqtt_client_test neuron-base gtest_main gtest) + +add_executable(common_test common_test.cc) +target_include_directories(common_test PRIVATE + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/include +) +target_link_libraries(common_test neuron-base gtest_main gtest) + include(GoogleTest) gtest_discover_tests(json_test) gtest_discover_tests(http_test) @@ -81,3 +89,4 @@ gtest_discover_tests(modbus_test) gtest_discover_tests(async_queue_test) gtest_discover_tests(rolling_counter_test) gtest_discover_tests(mqtt_client_test) +gtest_discover_tests(common_test) diff --git a/tests/ut/common_test.cc b/tests/ut/common_test.cc new file mode 100644 index 00000000..5efd0383 --- /dev/null +++ b/tests/ut/common_test.cc @@ -0,0 +1,90 @@ +#include + +#include "neuron.h" +#include "type.h" + +zlog_category_t *neuron = NULL; +TEST(type_set_get, type_set) +{ + uint16_t u16 = 0; + neu_set_u16((uint8_t *) &u16, 0x1234); + EXPECT_EQ(0x1234, u16); + + int16_t i16 = 0; + neu_set_i16((uint8_t *) &i16, 0x1234); + EXPECT_EQ(0x1234, i16); + + uint32_t u32 = 0; + neu_set_u32((uint8_t *) &u32, 0x12345678); + EXPECT_EQ(0x12345678, u32); + + int32_t i32 = 0; + neu_set_i32((uint8_t *) &i32, 0x12345678); + EXPECT_EQ(0x12345678, i32); + + float f32 = 0; + neu_set_f32((uint8_t *) &f32, 3.1415926); + EXPECT_FLOAT_EQ(3.1415926, f32); + + double f64 = 0; + neu_set_f64((uint8_t *) &f64, 3.1415926); + EXPECT_DOUBLE_EQ(3.1415926, f64); + + int64_t i64 = 0; + neu_set_i64((uint8_t *) &i64, 0x1234567890ABCDEF); + EXPECT_EQ(0x1234567890ABCDEF, i64); + + uint64_t u64 = 0; + neu_set_u64((uint8_t *) &u64, 0x1234567890ABCDEF); + EXPECT_EQ(0x1234567890ABCDEF, u64); +} + +TEST(type_set_get, type_get) +{ + uint16_t u16 = 0x1234; + EXPECT_EQ(0x1234, neu_get_u16((uint8_t *) &u16)); + + int16_t i16_ = 0x1234; + EXPECT_EQ(0x1234, neu_get_i16((uint8_t *) &i16_)); + + uint32_t u32 = 0x12345678; + EXPECT_EQ(0x12345678, neu_get_u32((uint8_t *) &u32)); + + int32_t i32 = 0x12345678; + EXPECT_EQ(0x12345678, neu_get_i32((uint8_t *) &i32)); + + float f32 = 3.1415926; + EXPECT_FLOAT_EQ(3.1415926, neu_get_f32((uint8_t *) &f32)); + + double f64 = 3.1415926; + EXPECT_DOUBLE_EQ(3.1415926, neu_get_f64((uint8_t *) &f64)); + + int64_t i64 = 0x1234567890ABCDEF; + EXPECT_EQ(0x1234567890ABCDEF, neu_get_i64((uint8_t *) &i64)); + + uint64_t u64 = 0x1234567890ABCDEF; + EXPECT_EQ(0x1234567890ABCDEF, neu_get_u64((uint8_t *) &u64)); +} + +TEST(type_h_n, type_h_n) +{ + uint16_t u16 = 0x1234; + neu_htons_p(&u16); + EXPECT_EQ(0x3412, u16); + + uint32_t u32 = 0x12345678; + neu_htonl_p(&u32); + EXPECT_EQ(0x78563412, u32); + + uint64_t u64 = 0x1234567890ABCDEF; + neu_htonll_p(&u64); + EXPECT_EQ(0xEFCDAB9078563412, u64); +} + +int main(int argc, char **argv) +{ + zlog_init("./config/dev.conf"); + neuron = zlog_get_category("neuron"); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}