rewrite the TypeTraits and add some tests

This commit is contained in:
Mathieu Lacage
2007-09-28 09:27:57 +02:00
parent c1717498f4
commit 4d1ab8f4ba
3 changed files with 159 additions and 27 deletions

View 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 */

View File

@@ -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;
};

View File

@@ -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':