www.pudn.com > Loki.rar > Test_TypeList.cpp


#include  
#include  
#include "Typelist.h" 
 
using namespace ::Loki; 
 
typedef struct IncompType *IncompPtr; 
 
struct A1 {}; 
struct B1 : A1 {}; 
 
struct A2 {}; 
struct B2 : A2 {}; 
 
struct C1 : B1 {}; 
struct C2 : B2 {}; 
struct D1 : C1, C2 {}; 
 
namespace  
{ 
 
template 
struct PrintTypelist 
{ 
    PrintTypelist() 
    { 
        typedef typename TList::Head Head; 
        typedef typename TList::Tail Tail; 
 
        printf("%s ,", typeid(Head).name()); 
 
        PrintTypelist(); 
    } 
}; 
 
template<> 
struct PrintTypelist 
{ 
    PrintTypelist() 
    { 
        printf("\n"); 
    } 
}; 
 
 
void Test_Length() 
{ 
    typedef TL::MakeTypeList::Result typelist_t; 
 
    printf("%u\n", TL::Length::value); 
} 
 
 
void Test_TypeAt() 
{ 
    typedef TL::MakeTypeList::Result typelist_t; 
 
    printf("%s, ", typeid(TL::TypeAt::Result).name()); 
    printf("%s, ", typeid(TL::TypeAt::Result).name()); 
    printf("%s, ", typeid(TL::TypeAt::Result).name()); 
    printf("%s, ", typeid(TL::TypeAt::Result).name()); 
    printf("%s, ", typeid(TL::TypeAt::Result).name()); 
     
    printf("\n"); 
} 
 
void Test_IndexOf() 
{ 
    typedef TL::MakeTypeList::Result typelist_t; 
 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
    printf("%u, ", TL::IndexOf::value); 
 
    printf("\n"); 
} 
 
void Test_TypeAtNonStrict() 
{ 
    typedef TL::MakeTypeList::Result typelist_t; 
 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
    printf("%s, ", typeid(TL::TypeAtNonStrict::Result).name()); 
     
    printf("\n"); 
} 
 
void Test_Append() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
    typedef TL::MakeTypeList::Result typelist2_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_Erase() 
{ 
    typedef TL::MakeTypeList::Result typelist_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_EraseAll() 
{ 
    typedef TL::MakeTypeList::Result typelist_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_NoDuplicates() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
    typedef TL::MakeTypeList::Result              typelist2_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_Replace() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_ReplaceAll() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_Reverse() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
 
    PrintTypelist::Result>(); 
} 
 
void Test_MostDerived() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
 
    printf("%s, ", typeid(TL::MostDerived::Result).name()); 
    printf("%s, ", typeid(TL::MostDerived::Result).name()); 
    printf("%s, ", typeid(TL::MostDerived::Result).name()); 
     
    printf("\n"); 
} 
 
void Test_DerivedToFront() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
    typedef TL::MakeTypeList::Result typelist2_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
void Test_DerivedToFrontAll() 
{ 
    typedef TL::MakeTypeList::Result typelist1_t; 
    typedef TL::MakeTypeList::Result typelist2_t; 
 
    PrintTypelist::Result>(); 
    PrintTypelist::Result>(); 
} 
 
} // anon namespace 
 
int 
main() 
{ 
    Test_Length(); 
    Test_TypeAt(); 
    Test_TypeAtNonStrict(); 
    Test_IndexOf(); 
    Test_Append();     
    Test_Erase(); 
    Test_EraseAll(); 
    Test_NoDuplicates(); 
    Test_Replace(); 
    Test_ReplaceAll(); 
    Test_Reverse(); 
    Test_MostDerived(); 
    Test_DerivedToFront(); 
    Test_DerivedToFrontAll(); 
}