fixed GH #2382: Tuple assignment very slow

This commit is contained in:
Günter Obiltschnig 2019-06-22 14:06:47 +02:00
parent 4a2cc66ec6
commit 7a4f56e74b

View File

@ -32,7 +32,7 @@ namespace Poco {
template <class Head, class Tail>
struct TypeList;
struct NullTypeList
{
enum
@ -86,8 +86,8 @@ struct TypeList
{
if (this != &tl)
{
TypeList tmp(tl);
swap(tmp);
head = tl.head;
tail = tl.tail;
}
return *this;
}
@ -110,40 +110,54 @@ struct TypeList
return tail < tl.tail;
return false;
}
void swap(TypeList& tl)
{
std::swap(head, tl.head);
std::swap(tail, tl.tail);
}
HeadType head;
TailType tail;
};
template <typename T0 = NullTypeList,
typename T1 = NullTypeList,
template <typename T0 = NullTypeList,
typename T1 = NullTypeList,
typename T2 = NullTypeList,
typename T3 = NullTypeList,
typename T4 = NullTypeList,
typename T3 = NullTypeList,
typename T4 = NullTypeList,
typename T5 = NullTypeList,
typename T6 = NullTypeList,
typename T7 = NullTypeList,
typename T6 = NullTypeList,
typename T7 = NullTypeList,
typename T8 = NullTypeList,
typename T9 = NullTypeList,
typename T10 = NullTypeList,
typename T9 = NullTypeList,
typename T10 = NullTypeList,
typename T11 = NullTypeList,
typename T12 = NullTypeList,
typename T13 = NullTypeList,
typename T12 = NullTypeList,
typename T13 = NullTypeList,
typename T14 = NullTypeList,
typename T15 = NullTypeList,
typename T16 = NullTypeList,
typename T15 = NullTypeList,
typename T16 = NullTypeList,
typename T17 = NullTypeList,
typename T18 = NullTypeList,
typename T19 = NullTypeList>
typename T19 = NullTypeList,
typename T20 = NullTypeList,
typename T21 = NullTypeList,
typename T22 = NullTypeList,
typename T23 = NullTypeList,
typename T24 = NullTypeList,
typename T25 = NullTypeList,
typename T26 = NullTypeList,
typename T27 = NullTypeList,
typename T28 = NullTypeList,
typename T29 = NullTypeList,
typename T30 = NullTypeList,
typename T31 = NullTypeList,
typename T32 = NullTypeList,
typename T33 = NullTypeList,
typename T34 = NullTypeList,
typename T35 = NullTypeList,
typename T36 = NullTypeList,
typename T37 = NullTypeList,
typename T38 = NullTypeList,
typename T39 = NullTypeList>
struct TypeListType
/// TypeListType takes 1 - 20 typename arguments.
/// TypeListType takes 1 - 40 typename arguments.
/// Usage:
///
/// TypeListType<T0, T1, ... , Tn>::HeadType typeList;
@ -151,7 +165,11 @@ struct TypeListType
/// typeList is a TypeList of T0, T1, ... , Tn
{
private:
typedef typename TypeListType<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,T17,T18,T19>::HeadType TailType;
typedef typename
TypeListType<T1,T2, T3, T4, T5, T6, T7, T8, T9, T10,
T11,T12,T13,T14,T15,T16,T17,T18,T19,T20,
T21,T22,T23,T24,T25,T26,T27,T28,T29,T30,
T31,T32,T33,T34,T35,T36,T37,T38,T39>::HeadType TailType;
public:
typedef TypeList<T0, TailType> HeadType;