ParameterType<> template

This commit is contained in:
Pavel Kirienko 2015-05-16 13:21:36 +03:00
parent f713ef5e00
commit be5bcf9084
2 changed files with 27 additions and 21 deletions

View File

@ -58,12 +58,6 @@ class UAVCAN_EXPORT LazyConstructor
}
}
template <typename U> struct ParamType { typedef const U& Type; };
template <typename U> struct ParamType<U&> { typedef U& Type; };
#if UAVCAN_CPP_VERSION >= UAVCAN_CPP11
template <typename U> struct ParamType<U&&> { typedef U&& Type; };
#endif
public:
LazyConstructor()
: ptr_(NULL)
@ -130,50 +124,53 @@ public:
// for nargs in range(1, MAX_ARGS + 1):
// nums = [(x + 1) for x in range(nargs)]
// l1 = ['typename P%d' % x for x in nums]
// l2 = ['typename ParamType<P%d>::Type p%d' % (x, x) for x in nums]
// l2 = ['typename ParameterType<P%d>::Type p%d' % (x, x) for x in nums]
// l3 = ['p%d' % x for x in nums]
// print(TEMPLATE % (', '.join(l1), ', '.join(l2), ', '.join(l3)))
template <typename P1>
void construct(typename ParamType<P1>::Type p1)
void construct(typename ParameterType<P1>::Type p1)
{
ensureNotConstructed();
ptr_ = new (static_cast<void*>(data_.pool)) T(p1);
}
template <typename P1, typename P2>
void construct(typename ParamType<P1>::Type p1, typename ParamType<P2>::Type p2)
template<typename P1, typename P2>
void construct(typename ParameterType<P1>::Type p1, typename ParameterType<P2>::Type p2)
{
ensureNotConstructed();
ptr_ = new (static_cast<void*>(data_.pool)) T(p1, p2);
}
template <typename P1, typename P2, typename P3>
void construct(typename ParamType<P1>::Type p1, typename ParamType<P2>::Type p2, typename ParamType<P3>::Type p3)
template<typename P1, typename P2, typename P3>
void construct(typename ParameterType<P1>::Type p1, typename ParameterType<P2>::Type p2,
typename ParameterType<P3>::Type p3)
{
ensureNotConstructed();
ptr_ = new (static_cast<void*>(data_.pool)) T(p1, p2, p3);
}
template <typename P1, typename P2, typename P3, typename P4>
void construct(typename ParamType<P1>::Type p1, typename ParamType<P2>::Type p2, typename ParamType<P3>::Type p3,
typename ParamType<P4>::Type p4)
template<typename P1, typename P2, typename P3, typename P4>
void construct(typename ParameterType<P1>::Type p1, typename ParameterType<P2>::Type p2,
typename ParameterType<P3>::Type p3, typename ParameterType<P4>::Type p4)
{
ensureNotConstructed();
ptr_ = new (static_cast<void*>(data_.pool)) T(p1, p2, p3, p4);
}
template <typename P1, typename P2, typename P3, typename P4, typename P5>
void construct(typename ParamType<P1>::Type p1, typename ParamType<P2>::Type p2, typename ParamType<P3>::Type p3,
typename ParamType<P4>::Type p4, typename ParamType<P5>::Type p5)
template<typename P1, typename P2, typename P3, typename P4, typename P5>
void construct(typename ParameterType<P1>::Type p1, typename ParameterType<P2>::Type p2,
typename ParameterType<P3>::Type p3, typename ParameterType<P4>::Type p4,
typename ParameterType<P5>::Type p5)
{
ensureNotConstructed();
ptr_ = new (static_cast<void*>(data_.pool)) T(p1, p2, p3, p4, p5);
}
template <typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
void construct(typename ParamType<P1>::Type p1, typename ParamType<P2>::Type p2, typename ParamType<P3>::Type p3,
typename ParamType<P4>::Type p4, typename ParamType<P5>::Type p5, typename ParamType<P6>::Type p6)
template<typename P1, typename P2, typename P3, typename P4, typename P5, typename P6>
void construct(typename ParameterType<P1>::Type p1, typename ParameterType<P2>::Type p2,
typename ParameterType<P3>::Type p3, typename ParameterType<P4>::Type p4,
typename ParameterType<P5>::Type p5, typename ParameterType<P6>::Type p6)
{
ensureNotConstructed();
ptr_ = new (static_cast<void*>(data_.pool)) T(p1, p2, p3, p4, p5, p6);

View File

@ -100,6 +100,15 @@ template <typename T> struct RemoveReference<T&> { typedef T Type; };
template <typename T> struct RemoveReference<T&&> { typedef T Type; };
#endif
/**
* Parameter types
*/
template <typename U> struct ParameterType { typedef const U& Type; };
template <typename U> struct ParameterType<U&> { typedef U& Type; };
#if UAVCAN_CPP_VERSION > UAVCAN_CPP03
template <typename U> struct ParameterType<U&&> { typedef U&& Type; };
#endif
/**
* Value types
*/