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> template <class Head, class Tail>
struct TypeList; struct TypeList;
struct NullTypeList struct NullTypeList
{ {
enum enum
@ -86,8 +86,8 @@ struct TypeList
{ {
if (this != &tl) if (this != &tl)
{ {
TypeList tmp(tl); head = tl.head;
swap(tmp); tail = tl.tail;
} }
return *this; return *this;
} }
@ -110,40 +110,54 @@ struct TypeList
return tail < tl.tail; return tail < tl.tail;
return false; return false;
} }
void swap(TypeList& tl)
{
std::swap(head, tl.head);
std::swap(tail, tl.tail);
}
HeadType head; HeadType head;
TailType tail; TailType tail;
}; };
template <typename T0 = NullTypeList, template <typename T0 = NullTypeList,
typename T1 = NullTypeList, typename T1 = NullTypeList,
typename T2 = NullTypeList, typename T2 = NullTypeList,
typename T3 = NullTypeList, typename T3 = NullTypeList,
typename T4 = NullTypeList, typename T4 = NullTypeList,
typename T5 = NullTypeList, typename T5 = NullTypeList,
typename T6 = NullTypeList, typename T6 = NullTypeList,
typename T7 = NullTypeList, typename T7 = NullTypeList,
typename T8 = NullTypeList, typename T8 = NullTypeList,
typename T9 = NullTypeList, typename T9 = NullTypeList,
typename T10 = NullTypeList, typename T10 = NullTypeList,
typename T11 = NullTypeList, typename T11 = NullTypeList,
typename T12 = NullTypeList, typename T12 = NullTypeList,
typename T13 = NullTypeList, typename T13 = NullTypeList,
typename T14 = NullTypeList, typename T14 = NullTypeList,
typename T15 = NullTypeList, typename T15 = NullTypeList,
typename T16 = NullTypeList, typename T16 = NullTypeList,
typename T17 = NullTypeList, typename T17 = NullTypeList,
typename T18 = 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 struct TypeListType
/// TypeListType takes 1 - 20 typename arguments. /// TypeListType takes 1 - 40 typename arguments.
/// Usage: /// Usage:
/// ///
/// TypeListType<T0, T1, ... , Tn>::HeadType typeList; /// TypeListType<T0, T1, ... , Tn>::HeadType typeList;
@ -151,7 +165,11 @@ struct TypeListType
/// typeList is a TypeList of T0, T1, ... , Tn /// typeList is a TypeList of T0, T1, ... , Tn
{ {
private: 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: public:
typedef TypeList<T0, TailType> HeadType; typedef TypeList<T0, TailType> HeadType;