rewrite the TypeTraits and add some tests
This commit is contained in:
40
src/core/type-traits-test.cc
Normal file
40
src/core/type-traits-test.cc
Normal file
@@ -0,0 +1,40 @@
|
||||
#include "type-traits.h"
|
||||
#include "test.h"
|
||||
|
||||
#ifdef RUN_SELF_TESTS
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class TypeTraitsTest : public Test
|
||||
{
|
||||
public:
|
||||
TypeTraitsTest ();
|
||||
virtual bool RunTests (void);
|
||||
};
|
||||
|
||||
TypeTraitsTest::TypeTraitsTest ()
|
||||
: Test ("TypeTraits")
|
||||
{}
|
||||
bool
|
||||
TypeTraitsTest::RunTests (void)
|
||||
{
|
||||
bool result = true;
|
||||
|
||||
//TypeTraits<int &>::ReferencedType ir;
|
||||
//TypeTraits<const int>::NonConstType uci;
|
||||
NS_TEST_ASSERT_EQUAL (TypeTraits<void (TypeTraitsTest::*) (void)>::IsPointerToMember, 1);
|
||||
NS_TEST_ASSERT_EQUAL (TypeTraits<void (TypeTraitsTest::*) (void) const>::IsPointerToMember, 1);
|
||||
NS_TEST_ASSERT_EQUAL (TypeTraits<void (TypeTraitsTest::*) (int)>::IsPointerToMember, 1);
|
||||
NS_TEST_ASSERT_EQUAL (TypeTraits<void (TypeTraitsTest::*) (int) const>::IsPointerToMember, 1);
|
||||
NS_TEST_ASSERT_EQUAL (TypeTraits<void (TypeTraitsTest::*) (void) const>::PointerToMemberTraits::nArgs, 0);
|
||||
NS_TEST_ASSERT_EQUAL (TypeTraits<void (TypeTraitsTest::*) (int) const>::PointerToMemberTraits::nArgs, 1);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static TypeTraitsTest g_typeTraitsTest;
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* RUN_SELF_TESTS */
|
||||
|
||||
@@ -1,36 +1,127 @@
|
||||
#ifndef TYPE_TRAITS_H
|
||||
#define TYPE_TRAITS_H
|
||||
|
||||
template <typename T>
|
||||
struct TypeTraits;
|
||||
|
||||
template <typename T>
|
||||
struct TypeTraits
|
||||
{
|
||||
typedef T ReferencedType;
|
||||
typedef T NonConstType;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct TypeTraits<const T>
|
||||
{
|
||||
typedef T ReferencedType;
|
||||
typedef T NonConstType;
|
||||
};
|
||||
|
||||
|
||||
template <typename T>
|
||||
struct TypeTraits<const T &>
|
||||
{
|
||||
typedef T ReferencedType;
|
||||
typedef T & NonConstType;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct TypeTraits<T &>
|
||||
{
|
||||
typedef T ReferencedType;
|
||||
typedef T & NonConstType;
|
||||
private:
|
||||
struct NullType {};
|
||||
template <typename U> struct UnConst
|
||||
{
|
||||
typedef U Result;
|
||||
};
|
||||
template <typename U> struct UnConst<const U>
|
||||
{
|
||||
typedef U Result;
|
||||
};
|
||||
template <typename U> struct ReferenceTraits
|
||||
{
|
||||
enum {IsReference = 0};
|
||||
typedef U ReferencedType;
|
||||
};
|
||||
template <typename U> struct ReferenceTraits<U&>
|
||||
{
|
||||
enum {IsReference = 1};
|
||||
typedef U ReferencedType;
|
||||
};
|
||||
template <typename U> struct PointerTraits
|
||||
{
|
||||
enum {IsPointer = 0};
|
||||
typedef U PointeeType;
|
||||
};
|
||||
template <typename U> struct PointerTraits<U *>
|
||||
{
|
||||
enum {IsPointer = 1};
|
||||
typedef U PointeeType;
|
||||
};
|
||||
template <typename U> struct FunctionPtrTraits
|
||||
{
|
||||
enum {IsFunctionPointer = 0};
|
||||
};
|
||||
template <typename U>
|
||||
struct FunctionPtrTraits <U (*) (void)>
|
||||
{
|
||||
enum {IsFunctionPointer = 1};
|
||||
typedef U ReturnType;
|
||||
};
|
||||
template <typename U, typename V1>
|
||||
struct FunctionPtrTraits <U (*) (V1)>
|
||||
{
|
||||
enum {IsFunctionPointer = 1};
|
||||
typedef U ReturnType;
|
||||
typedef V1 Arg1Type;
|
||||
};
|
||||
template <typename U, typename V1, typename V2>
|
||||
struct FunctionPtrTraits <U (*) (V1,V2)>
|
||||
{
|
||||
enum {IsFunctionPointer = 1};
|
||||
typedef U ReturnType;
|
||||
typedef V1 Arg1Type;
|
||||
typedef V2 Arg2Type;
|
||||
};
|
||||
template <typename U> struct PtrToMemberTraits
|
||||
{
|
||||
enum {IsPointerToMember = 0};
|
||||
};
|
||||
template <typename U, typename V>
|
||||
struct PtrToMemberTraits <U (V::*) (void)>
|
||||
{
|
||||
enum {IsPointerToMember = 1};
|
||||
enum {nArgs = 0};
|
||||
typedef U ReturnType;
|
||||
};
|
||||
template <typename U, typename V>
|
||||
struct PtrToMemberTraits <U (V::*) (void) const>
|
||||
{
|
||||
enum {IsPointerToMember = 1};
|
||||
enum {nArgs = 0};
|
||||
typedef U ReturnType;
|
||||
};
|
||||
template <typename U, typename V,typename W1>
|
||||
struct PtrToMemberTraits <U (V::*) (W1)>
|
||||
{
|
||||
enum {IsPointerToMember = 1};
|
||||
enum {nArgs = 1};
|
||||
typedef U ReturnType;
|
||||
typedef W1 Arg1Type;
|
||||
};
|
||||
template <typename U, typename V,typename W1>
|
||||
struct PtrToMemberTraits <U (V::*) (W1) const>
|
||||
{
|
||||
enum {IsPointerToMember = 1};
|
||||
enum {nArgs = 1};
|
||||
typedef U ReturnType;
|
||||
typedef W1 Arg1Type;
|
||||
};
|
||||
template <typename U, typename V,typename W1, typename W2>
|
||||
struct PtrToMemberTraits <U (V::*) (W1,W2)>
|
||||
{
|
||||
enum {IsPointerToMember = 1};
|
||||
enum {nArgs = 2};
|
||||
typedef U ReturnType;
|
||||
typedef W1 Arg1Type;
|
||||
typedef W2 Arg2Type;
|
||||
};
|
||||
template <typename U, typename V,typename W1, typename W2>
|
||||
struct PtrToMemberTraits <U (V::*) (W1,W2) const>
|
||||
{
|
||||
enum {IsPointerToMember = 1};
|
||||
enum {nArgs = 2};
|
||||
typedef U ReturnType;
|
||||
typedef W1 Arg1Type;
|
||||
typedef W2 Arg2Type;
|
||||
};
|
||||
|
||||
public:
|
||||
typedef typename UnConst<T>::Result NonConstType;
|
||||
typedef typename ReferenceTraits<T>::ReferencedType ReferencedType;
|
||||
typedef typename PointerTraits<T>::PointeeType PointeeType;
|
||||
enum {IsPointerToMember = PtrToMemberTraits<T>::IsPointerToMember};
|
||||
enum {IsPointer = PointerTraits<T>::IsPointer};
|
||||
enum {IsReference = ReferenceTraits<T>::IsReference};
|
||||
enum {IsFunctionPointer = FunctionPtrTraits<T>::IsFunctionPointer};
|
||||
typedef PtrToMemberTraits<T> PointerToMemberTraits;
|
||||
typedef FunctionPtrTraits<T> FunctionPointerTraits;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@ def build(bld):
|
||||
'composite-trace-resolver.cc',
|
||||
'trace-doc.cc',
|
||||
'trace-source.cc',
|
||||
'type-traits-test.cc',
|
||||
]
|
||||
|
||||
if sys.platform == 'win32':
|
||||
|
||||
Reference in New Issue
Block a user