From 4d1ab8f4badb403ac1e279d006ec45de2cb25092 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Fri, 28 Sep 2007 09:27:57 +0200 Subject: [PATCH] rewrite the TypeTraits and add some tests --- src/core/type-traits-test.cc | 40 ++++++++++ src/core/type-traits.h | 145 ++++++++++++++++++++++++++++------- src/core/wscript | 1 + 3 files changed, 159 insertions(+), 27 deletions(-) create mode 100644 src/core/type-traits-test.cc diff --git a/src/core/type-traits-test.cc b/src/core/type-traits-test.cc new file mode 100644 index 000000000..93e310bf4 --- /dev/null +++ b/src/core/type-traits-test.cc @@ -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::ReferencedType ir; + //TypeTraits::NonConstType uci; + NS_TEST_ASSERT_EQUAL (TypeTraits::IsPointerToMember, 1); + NS_TEST_ASSERT_EQUAL (TypeTraits::IsPointerToMember, 1); + NS_TEST_ASSERT_EQUAL (TypeTraits::IsPointerToMember, 1); + NS_TEST_ASSERT_EQUAL (TypeTraits::IsPointerToMember, 1); + NS_TEST_ASSERT_EQUAL (TypeTraits::PointerToMemberTraits::nArgs, 0); + NS_TEST_ASSERT_EQUAL (TypeTraits::PointerToMemberTraits::nArgs, 1); + + return result; +} + +static TypeTraitsTest g_typeTraitsTest; + +} // namespace ns3 + +#endif /* RUN_SELF_TESTS */ + diff --git a/src/core/type-traits.h b/src/core/type-traits.h index df52a2670..d26df8c13 100644 --- a/src/core/type-traits.h +++ b/src/core/type-traits.h @@ -1,36 +1,127 @@ #ifndef TYPE_TRAITS_H #define TYPE_TRAITS_H -template -struct TypeTraits; - template struct TypeTraits { - typedef T ReferencedType; - typedef T NonConstType; -}; - -template -struct TypeTraits -{ - typedef T ReferencedType; - typedef T NonConstType; -}; - - -template -struct TypeTraits -{ - typedef T ReferencedType; - typedef T & NonConstType; -}; - -template -struct TypeTraits -{ - typedef T ReferencedType; - typedef T & NonConstType; +private: + struct NullType {}; + template struct UnConst + { + typedef U Result; + }; + template struct UnConst + { + typedef U Result; + }; + template struct ReferenceTraits + { + enum {IsReference = 0}; + typedef U ReferencedType; + }; + template struct ReferenceTraits + { + enum {IsReference = 1}; + typedef U ReferencedType; + }; + template struct PointerTraits + { + enum {IsPointer = 0}; + typedef U PointeeType; + }; + template struct PointerTraits + { + enum {IsPointer = 1}; + typedef U PointeeType; + }; + template struct FunctionPtrTraits + { + enum {IsFunctionPointer = 0}; + }; + template + struct FunctionPtrTraits + { + enum {IsFunctionPointer = 1}; + typedef U ReturnType; + }; + template + struct FunctionPtrTraits + { + enum {IsFunctionPointer = 1}; + typedef U ReturnType; + typedef V1 Arg1Type; + }; + template + struct FunctionPtrTraits + { + enum {IsFunctionPointer = 1}; + typedef U ReturnType; + typedef V1 Arg1Type; + typedef V2 Arg2Type; + }; + template struct PtrToMemberTraits + { + enum {IsPointerToMember = 0}; + }; + template + struct PtrToMemberTraits + { + enum {IsPointerToMember = 1}; + enum {nArgs = 0}; + typedef U ReturnType; + }; + template + struct PtrToMemberTraits + { + enum {IsPointerToMember = 1}; + enum {nArgs = 0}; + typedef U ReturnType; + }; + template + struct PtrToMemberTraits + { + enum {IsPointerToMember = 1}; + enum {nArgs = 1}; + typedef U ReturnType; + typedef W1 Arg1Type; + }; + template + struct PtrToMemberTraits + { + enum {IsPointerToMember = 1}; + enum {nArgs = 1}; + typedef U ReturnType; + typedef W1 Arg1Type; + }; + template + struct PtrToMemberTraits + { + enum {IsPointerToMember = 1}; + enum {nArgs = 2}; + typedef U ReturnType; + typedef W1 Arg1Type; + typedef W2 Arg2Type; + }; + template + struct PtrToMemberTraits + { + enum {IsPointerToMember = 1}; + enum {nArgs = 2}; + typedef U ReturnType; + typedef W1 Arg1Type; + typedef W2 Arg2Type; + }; + +public: + typedef typename UnConst::Result NonConstType; + typedef typename ReferenceTraits::ReferencedType ReferencedType; + typedef typename PointerTraits::PointeeType PointeeType; + enum {IsPointerToMember = PtrToMemberTraits::IsPointerToMember}; + enum {IsPointer = PointerTraits::IsPointer}; + enum {IsReference = ReferenceTraits::IsReference}; + enum {IsFunctionPointer = FunctionPtrTraits::IsFunctionPointer}; + typedef PtrToMemberTraits PointerToMemberTraits; + typedef FunctionPtrTraits FunctionPointerTraits; }; diff --git a/src/core/wscript b/src/core/wscript index 5806f254b..c69bb018c 100644 --- a/src/core/wscript +++ b/src/core/wscript @@ -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':