mirror of
https://github.com/ETLCPP/etl.git
synced 2026-04-30 19:09:10 +08:00
Make 'packed' have better cross platform functionality
This commit is contained in:
parent
22c1ed4058
commit
0f487fa126
@ -462,10 +462,18 @@ SOFTWARE.
|
||||
|
||||
//*************************************
|
||||
// Determine if the ETL should use __attribute__((packed).
|
||||
#if defined(ETL_COMPILER_CLANG) || defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_INTEL)
|
||||
#define ETL_PACKED __attribute__((packed))
|
||||
#if defined(ETL_COMPILER_CLANG) || defined(ETL_COMPILER_GCC) || defined(ETL_COMPILER_INTEL) || defined(ETL_COMPILER_ARM6)
|
||||
#define ETL_PACKED __attribute__((packed))
|
||||
#define ETL_END_PACKED
|
||||
#define ETL_HAS_PACKED 1
|
||||
#elif defined(ETL_COMPILER_MICROSOFT)
|
||||
#define ETL_PACKED __pragma(pack(push, 1))
|
||||
#define ETL_END_PACKED __pragma(pack(pop))
|
||||
#define ETL_HAS_PACKED 1
|
||||
#else
|
||||
#define ETL_PACKED
|
||||
#define ETL_END_PACKED
|
||||
#define ETL_HAS_PACKED 0
|
||||
#endif
|
||||
|
||||
//*************************************
|
||||
@ -526,6 +534,7 @@ namespace etl
|
||||
static ETL_CONSTANT bool has_mutable_array_view = (ETL_HAS_MUTABLE_ARRAY_VIEW == 1);
|
||||
static ETL_CONSTANT bool has_ideque_repair = (ETL_HAS_IDEQUE_REPAIR == 1);
|
||||
static ETL_CONSTANT bool has_virtual_messages = (ETL_HAS_VIRTUAL_MESSAGES == 1);
|
||||
static ETL_CONSTANT bool has_packed = (ETL_HAS_PACKED == 1);
|
||||
|
||||
// Is...
|
||||
static ETL_CONSTANT bool is_debug_build = (ETL_IS_DEBUG_BUILD == 1);
|
||||
|
||||
@ -53,7 +53,7 @@ namespace etl
|
||||
/// Contains all functionality that doesn't require the type.
|
||||
//*************************************************************************
|
||||
template <size_t Size_>
|
||||
class unaligned_type_common
|
||||
class ETL_PACKED unaligned_type_common
|
||||
{
|
||||
public:
|
||||
|
||||
@ -214,7 +214,7 @@ namespace etl
|
||||
protected:
|
||||
|
||||
unsigned char storage[Size];
|
||||
};
|
||||
}; ETL_END_PACKED
|
||||
|
||||
template <size_t Size_>
|
||||
ETL_CONSTANT size_t unaligned_type_common<Size_>::Size;
|
||||
@ -729,7 +729,7 @@ namespace etl
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
}; ETL_END_PACKED
|
||||
|
||||
template <typename T, int Endian_>
|
||||
ETL_CONSTANT int unaligned_type<T, Endian_>::Endian;
|
||||
|
||||
@ -77,6 +77,7 @@ namespace
|
||||
CHECK_EQUAL((ETL_HAS_IDEQUE_REPAIR == 1), etl::traits::has_ideque_repair);
|
||||
CHECK_EQUAL((ETL_HAS_MUTABLE_ARRAY_VIEW == 1), etl::traits::has_mutable_array_view);
|
||||
CHECK_EQUAL((ETL_HAS_VIRTUAL_MESSAGES == 1), etl::traits::has_virtual_messages);
|
||||
CHECK_EQUAL((ETL_HAS_PACKED == 1), etl::traits::has_packed);
|
||||
|
||||
CHECK_EQUAL((ETL_IS_DEBUG_BUILD == 1), etl::traits::is_debug_build);
|
||||
CHECK_EQUAL(__cplusplus, etl::traits::cplusplus);
|
||||
|
||||
@ -718,5 +718,31 @@ namespace
|
||||
CHECK_EQUAL(forward_like_call_type::ConstRValue, template_function_fl<TFL&&>(etl::move(u4)));
|
||||
CHECK_EQUAL(forward_like_call_type::ConstRValue, template_function_fl<const TFL&&>(etl::move(u4)));
|
||||
}
|
||||
|
||||
#if ETL_HAS_PACKED
|
||||
//*********************************
|
||||
TEST(test_packed)
|
||||
{
|
||||
struct Unpacked
|
||||
{
|
||||
uint32_t a = 0x12345678;
|
||||
uint8_t b = 0x9A;
|
||||
uint32_t c = 0x87654321;
|
||||
};
|
||||
|
||||
struct ETL_PACKED Packed
|
||||
{
|
||||
uint32_t a = 0x12345678;
|
||||
uint8_t b = 0x9A;
|
||||
uint32_t c = 0x87654321;
|
||||
}; ETL_END_PACKED
|
||||
|
||||
Unpacked unpacked;
|
||||
Packed packed;
|
||||
|
||||
CHECK_TRUE(sizeof(unpacked) > sizeof(packed));
|
||||
CHECK_EQUAL(9U, sizeof(packed));
|
||||
}
|
||||
#endif
|
||||
};
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user