mirror of
https://github.com/ETLCPP/etl.git
synced 2026-10-28 18:07:10 +08:00
Added largest_alignment
Added largest_alignment Renamed largest to largest_type
This commit is contained in:
parent
2d0a243889
commit
32cb0c9a0b
73
largest.h
73
largest.h
@ -32,6 +32,8 @@ SOFTWARE.
|
||||
///\defgroup largest largest
|
||||
///\ingroup utilities
|
||||
|
||||
#include "type_traits.h"
|
||||
|
||||
namespace etl
|
||||
{
|
||||
//***************************************************************************
|
||||
@ -39,13 +41,13 @@ namespace etl
|
||||
/// Supports up to 16 types.
|
||||
/// Defines 'value_type' which is the type of the largest parameter.
|
||||
/// Defines 'size' which is the size of the largest parameter.
|
||||
///\ingroup numeric
|
||||
///\ingroup largest
|
||||
//***************************************************************************
|
||||
template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void,
|
||||
typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
|
||||
typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
|
||||
typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
|
||||
struct largest
|
||||
struct largest_type
|
||||
{
|
||||
private:
|
||||
|
||||
@ -71,8 +73,8 @@ namespace etl
|
||||
|
||||
public:
|
||||
|
||||
// Define 'largest_other' as 'largest' with all but the first parameter.
|
||||
typedef typename largest<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::type largest_other;
|
||||
// Define 'largest_other' as 'largest_type' with all but the first parameter.
|
||||
typedef typename largest_type<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::type largest_other;
|
||||
|
||||
// Set 'type' to be the largest of the first parameter and any of the others.
|
||||
// This is recursive.
|
||||
@ -92,10 +94,10 @@ namespace etl
|
||||
// Specialisation for one template parameter.
|
||||
//***************************************************************************
|
||||
template <typename T1>
|
||||
struct largest<T1, void, void, void,
|
||||
void, void, void, void,
|
||||
void, void, void, void,
|
||||
void, void, void, void>
|
||||
struct largest_type<T1, void, void, void,
|
||||
void, void, void, void,
|
||||
void, void, void, void,
|
||||
void, void, void, void>
|
||||
{
|
||||
typedef T1 type;
|
||||
|
||||
@ -104,6 +106,61 @@ namespace etl
|
||||
size = sizeof(type)
|
||||
};
|
||||
};
|
||||
|
||||
//***************************************************************************
|
||||
/// Template to determine the largest alignment.
|
||||
/// Supports up to 16 types.
|
||||
/// Defines 'value' which is the largest alignment of all the parameters.
|
||||
///\ingroup largest
|
||||
//***************************************************************************
|
||||
template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void,
|
||||
typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
|
||||
typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
|
||||
typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
|
||||
struct largest_alignment
|
||||
{
|
||||
// Determine the largest size.
|
||||
template <const size_t size1, const size_t size2>
|
||||
struct max_size
|
||||
{
|
||||
enum
|
||||
{
|
||||
value = (size1 > size2) ? size1 : size2
|
||||
};
|
||||
};
|
||||
|
||||
// All of the alignments.
|
||||
enum
|
||||
{
|
||||
t1 = alignment_of<T1>::value,
|
||||
t2 = alignment_of<T2>::value,
|
||||
t3 = alignment_of<T3>::value,
|
||||
t4 = alignment_of<T4>::value,
|
||||
t5 = alignment_of<T5>::value,
|
||||
t6 = alignment_of<T6>::value,
|
||||
t7 = alignment_of<T7>::value,
|
||||
t8 = alignment_of<T8>::value,
|
||||
t9 = alignment_of<T9>::value,
|
||||
t10 = alignment_of<T10>::value,
|
||||
t11 = alignment_of<T11>::value,
|
||||
t12 = alignment_of<T12>::value,
|
||||
t13 = alignment_of<T13>::value,
|
||||
t14 = alignment_of<T14>::value,
|
||||
t15 = alignment_of<T15>::value,
|
||||
t16 = alignment_of<T16>::value,
|
||||
};
|
||||
|
||||
public:
|
||||
|
||||
// The largest of all of them.
|
||||
enum
|
||||
{
|
||||
value = max_size<t1, max_size<t2, max_size<t3, max_size<t4, max_size<t5, max_size<t6, max_size<t7, max_size<t8,
|
||||
max_size<t9, max_size<t10, max_size<t11, max_size<t12, max_size<t13, max_size<t14, max_size<t15, t16>
|
||||
::value>::value>::value>::value>::value>::value>::value>::value>
|
||||
::value>::value>::value>::value>::value>::value>::value
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user