no message

git-svn-id: svn://svn.code.sf.net/p/loki-lib/code/trunk@32 7ec92016-0320-0410-acc4-a06ded1c099a
This commit is contained in:
magmaikh 2002-08-11 05:56:25 +00:00
parent 82ee09b978
commit b233e001b3
15 changed files with 957 additions and 0 deletions

View file

@ -0,0 +1,136 @@
///////////////////////////////////////////////////////////////
//Generates forwarding headers using the information
//in the header.lst & vendor.lst files
//
//To create a header list from an existing directory of headers
//dir *.h /b > headers.lst
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;
struct Compiler
{
Compiler() {}
Compiler(const string& VersionTest, const string& SubDir) :
version_test(VersionTest), subdir(SubDir)
{}
string version_test;
string subdir;
};
typedef vector<Compiler> cv_t;
int main(int argc, char* argv[])
{
if(argc < 2)
{
cout <<"Usage: <Header List> [Version/Vender List]"<<endl;
return -1;
}
cv_t vendors;
char buf[1024];
string check;
string subdir;
fstream vendor_file;
if(argc >= 3)
{
vendor_file.open(argv[2], ios::in);
if(!vendor_file.is_open())
{
cout << "Unable to open vendor file: " << argv[2] << endl;
return -2;
}
else
{
vendors.reserve(10);
while(!vendor_file.eof())
{
check = "";
subdir = "";
vendor_file.getline(buf, 1024, '\n');
check = buf;
vendor_file.getline(buf, 1024, '\n');
subdir = buf;
vendor_file.getline(buf, 1024, '\n');
if(!(check.empty() || subdir.empty()))
vendors.push_back(Compiler(check, subdir));
else
{
cout << "Error parsing vendors, check:" << check << "\tsubdir:" << subdir << endl;
}
}
}
}
else //if(vendors.empty())
{
cout << "No vendor file provided, using defaults" << endl;
vendors.reserve(10);
vendors.push_back(Compiler("(_MSC_VER >= 1300)", "MSVC\\1300"));
vendors.push_back(Compiler("(_MSC_VER >= 1200)", "MSVC\\1200"));
vendors.push_back(Compiler("( (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 1)) )", "Reference"));
}
fstream header_list(argv[1]);
string header;
stringstream ss;
if(!header_list.is_open())
{
cout << "Invalid header list file, " << argv[1] << endl;
return -3;
}
while(!header_list.eof())
{
header_list >> header;
cout << header << endl;
fstream header_file(header.c_str(), ios::out);
if(!header_file.is_open())
{
cout << "Unable to open header file for output: " << header << endl;
}
else
{
ss.str("");
ss << "//Generated header: " << header << endl;
size_t n = ss.str().size();
for(size_t i=0; i<n; ++i)
header_file << "/";
header_file << endl;
header_file << ss.str();
header_file << "//Forwards to the appropriate code" << endl;
header_file << "// that works on the detected compiler" << endl;
header_file << endl << endl;
cv_t::iterator it=vendors.begin(), itEnd = vendors.end();
header_file << "#ifdef LOKI_USE_REFERENCE" << endl;
header_file << "#\tinclude \".\\Reference\\" << header << "\"" << endl;
header_file << "#else" << endl;
header_file << "#\tif " << it->version_test << endl;
header_file << "#\t\tinclude \".\\" << it->subdir;
header_file << "\\" << header << "\""<< endl;
++it;
for(; it!=itEnd; ++it)
{
header_file << "#elif " << it->version_test << endl;
header_file << "#\t\tinclude \".\\" << it->subdir;
header_file << "\\" << header << "\""<< endl;
}
header_file << "#\telse" << endl;
header_file << "\t\t//Define LOKI_USE_REFERENCE and get back to us on the results" << endl;
header_file << "#\t\terror Compiler not tested with Loki, #define LOKI_USE_REFERENCE" << endl;
header_file << "#\tendif" << endl;
header_file << "#endif" << endl;
}
}
#ifdef _MSC_VER
system("PAUSE");
#endif
return 0;
}

View file

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 7.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HeaderGen", "HeaderGen.vcproj", "{402B97D0-B8F8-4B89-97AC-F031849FD94E}"
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
ConfigName.0 = Debug
ConfigName.1 = Release
EndGlobalSection
GlobalSection(ProjectDependencies) = postSolution
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{402B97D0-B8F8-4B89-97AC-F031849FD94E}.Debug.ActiveCfg = Debug|Win32
{402B97D0-B8F8-4B89-97AC-F031849FD94E}.Debug.Build.0 = Debug|Win32
{402B97D0-B8F8-4B89-97AC-F031849FD94E}.Release.ActiveCfg = Release|Win32
{402B97D0-B8F8-4B89-97AC-F031849FD94E}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,129 @@
<?xml version="1.0" encoding = "Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.00"
Name="HeaderGen"
ProjectGUID="{402B97D0-B8F8-4B89-97AC-F031849FD94E}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/HeaderGen.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/HeaderGen.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
OmitFramePointers="TRUE"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="0"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/HeaderGen.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
</Configuration>
</Configurations>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File
RelativePath="HeaderGen.cpp">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc">
<File
RelativePath="C:\Program Files\Microsoft Visual Studio .NET\Vc7\include\fstream">
</File>
<File
RelativePath="C:\Program Files\Microsoft Visual Studio .NET\Vc7\include\iostream">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
<File
RelativePath="ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View file

@ -0,0 +1,21 @@
AbstractFactory.h
AssocVector.h
EmptyType.h
Factory.h
Functor.h
HierarchyGenerators.h
MultiMethods.h
NullType.h
Singleton.h
SmallObj.h
SmartPtr.h
static_check.h
Threads.h
Tuple.h
TypeInfo.h
Typelist.h
TypeManip.h
TypeTraits.h
Visitor.h
Singleton.cpp
SmallObj.cpp

View file

@ -0,0 +1,3 @@
Cheesy vector-header generation tool
Yes, I'm that lazy
MKH

View file

@ -0,0 +1,11 @@
(_MSC_VER >= 1300)
MSVC\1300
(_MSC_VER >= 1200)
MSVC\1200
( (__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 1)) )
Reference
(__BORLANDC__)
Borland

View file

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 7.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LokiRegressionTest", "LokiRegressionTest.vcproj", "{E7FC3709-2BA7-4EAB-AF6B-B3ABC9BE493B}"
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
ConfigName.0 = Debug
ConfigName.1 = Release
EndGlobalSection
GlobalSection(ProjectDependencies) = postSolution
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{E7FC3709-2BA7-4EAB-AF6B-B3ABC9BE493B}.Debug.ActiveCfg = Debug|Win32
{E7FC3709-2BA7-4EAB-AF6B-B3ABC9BE493B}.Debug.Build.0 = Debug|Win32
{E7FC3709-2BA7-4EAB-AF6B-B3ABC9BE493B}.Release.ActiveCfg = Release|Win32
{E7FC3709-2BA7-4EAB-AF6B-B3ABC9BE493B}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

View file

@ -0,0 +1,164 @@
<?xml version="1.0" encoding = "Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.00"
Name="LokiRegressionTest"
ProjectGUID="{E7FC3709-2BA7-4EAB-AF6B-B3ABC9BE493B}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
ForceConformanceInForLoopScope="TRUE"
RuntimeTypeInfo="TRUE"
UsePrecompiledHeader="0"
WarningLevel="4"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/LokiTest.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/LokiTest.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
OmitFramePointers="TRUE"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
StringPooling="TRUE"
RuntimeLibrary="4"
EnableFunctionLevelLinking="TRUE"
ForceConformanceInForLoopScope="TRUE"
RuntimeTypeInfo="TRUE"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/LokiTest.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
</Configuration>
</Configurations>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File
RelativePath="..\..\SDK\Engine\Loki\Loki.hpp">
</File>
<File
RelativePath="LokiTest.cpp">
</File>
<File
RelativePath="LokiTest.h">
</File>
<File
RelativePath="LokiTestTypes.h">
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc">
<File
RelativePath="LokiTest_TypeList.h">
</File>
<File
RelativePath="LokiTest_TypeManip.h">
</File>
<File
RelativePath="LokiTest_TypeTraits.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
<Filter
Name="Loki"
Filter="">
<File
RelativePath="..\..\SDK\Loki\NullType.h">
</File>
<File
RelativePath="..\..\SDK\Loki\VC7\TypeInfo.h">
</File>
<File
RelativePath="..\..\SDK\Loki\VC7\TypeList.h">
</File>
<File
RelativePath="..\..\SDK\Loki\VC7\TypeManip.h">
</File>
<File
RelativePath="..\..\SDK\Loki\VC7\TypeTraits.h">
</File>
</Filter>
<File
RelativePath="ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View file

@ -0,0 +1,81 @@
// LokiTest.cpp : Defines the entry point for the console application.
//
#include <conio.h>
#include <iostream>
#include <vector>
#include <string>
#include <cassert>
//#define LOKI_USE_REFERENCE
#include <Loki\static_check.h>
#include <Loki\NullType.h>
#include <Loki\TypeInfo.h>
#include <Loki\TypeManip.h>
#include <Loki\TypeList.h>
#include <Loki\TypeTraits.h>
//The test use macros so that you can comment out any test
// that result in compilation errors and continue testing
// the remaining components
//TODO break into seperate files, use boost methods to test
// successful & unsuccessful compilations
#include "LokiTestTypes.h"
#include "LokiTest_TypeManip.h"
#include "LokiTest_TypeList.h"
#include "LokiTest_TypeInfo.h"
#include "LokiTest_TypeTraits.h"
//LOKI_TEST_TYPE2TYPE_HEADER
LOKI_TEST_TYPE2TYPE_HEADER_BROKEN_PATTERN_MATCHING
int main(int argc, char* argv[])
{
argc;
argv;
//Compile-Time Assertions
STATIC_CHECK(true, ThisShouldCompile);
//STATIC_CHECK(false, ThisShouldNotCompile);
LOKI_TEST_NULLTYPE;
//Test TypeManip
LOKI_TEST_INT2TYPE;
//LOKI_TEST_TYPE2TYPE;
LOKI_TEST_TYPE2TYPE_BROKEN_PATTERN_MATCHING;
LOKI_TEST_SELECT;
#pragma warning(push)
#pragma warning(disable:4127) //constant conditionals
LOKI_TEST_CONVERSION;
#pragma warning(pop)
//TypeInfo
LOKI_TEST_TYPEINFO;
//TypeTraits
#pragma warning(push)
#pragma warning(disable:4127) //constant conditionals
{
//TODO figure out correct results
cout<<"Testing TypeTraits"<<endl;
DUMP_TRAITS(int);
DUMP_TRAITS(float);
DUMP_TRAITS(volatile unsigned int);
DUMP_TRAITS(const float);
cout<<"Are the const & volatile qualifers handled correctly?"<<endl;
cout<<endl<<endl;
}
#pragma warning(pop)
//Test TypeList
#pragma warning(push)
#pragma warning(disable:4127) //constant conditionals
LOKI_TEST_LENGTH;
#pragma warning(pop)
getch();
return 0;
}
//*/

View file

@ -0,0 +1,37 @@
#pragma once
#ifndef __LOKITESTTYPES_H
#define __LOKITESTTYPES_H
//Types to use in the test
namespace Loki
{
namespace RegressionTest
{
struct Complex
{
float r,i;
};
struct Complex_Convertable
{
Complex_Convertable(){}
Complex_Convertable(float x) : r(x), i(0) {}
float r,i;
};
struct TwoWay
{
TwoWay(double x) : r(x) {}
operator double(){return r;}
double r;
};
struct SuperClass
{
};
struct SubClass : SuperClass
{
};
typedef TYPELIST_1(Loki::NullType) tyNullList;
typedef TYPELIST_1(void) tyList1;
typedef TYPELIST_2(int, double) tyList2;
typedef TYPELIST_5(std::vector<int>, Loki::RegressionTest::Complex, void, int, double) tyList5;
}
}
#endif

View file

@ -0,0 +1,58 @@
namespace Loki
{
namespace Test
{
struct CTBaseType
{
};
struct CTDerivedType : CTBaseType
{
};
struct RTBaseType
{
virtual ~RTBaseType(){}
virtual const char*const name(){return "BaseType";}
};
struct RTDerivedType : RTBaseType
{
virtual const char*const name(){return "DerivedType";}
};
}//ns Test
}//ns Loki
//TODO Test the other operators and before
#define LOKI_TEST_TYPEINFO\
{\
cout<<"Testing TypeInfo"<<endl;\
Loki::TypeInfo type_CTDerived(typeid(Loki::Test::CTDerivedType));\
\
Loki::Test::CTDerivedType* pDerived=0; pDerived;\
if(typeid(*pDerived) == type_CTDerived)\
cout<<"Compile-time TypeInfo works"<<endl;\
else\
cout<<"Compile-time TypeInfo is ***BROKEN***"<<endl;\
\
try\
{\
Loki::TypeInfo type_RTDerived(typeid(Loki::Test::RTDerivedType));\
Loki::Test::RTBaseType* pBase = new Loki::Test::RTDerivedType;\
pBase;\
if(typeid(*pBase) == type_RTDerived)\
cout<<"Run-time TypeInfo works"<<endl;\
else\
{\
cout<<"Run-time TypeInfo is ***BROKEN***"<<endl;\
cout<<"Is RTTI enabled?"<<endl;\
cout<<"Compiler thinks pBase points to a ";\
cout<<typeid(*pBase).name()<<endl;\
}\
delete pBase;\
}\
catch(...)\
{\
cout<<"Run-time TypeInfo is ***BROKEN***"<<endl;\
cout<<"Run-time TypeInfo check threw - Is RTTI enabled?"<<endl;\
}\
cout<<endl<<endl;\
}

View file

@ -0,0 +1,79 @@
#define LOKI_TEST_LENGTH\
{\
cout<<"Testing Length"<<endl;\
cout<<"Length of List1: "<<Loki::TL::Length<Loki::RegressionTest::tyList1>::value<<endl;\
cout<<"Length of List2: "<<Loki::TL::Length<Loki::RegressionTest::tyList2>::value<<endl;\
cout<<"Length of List5: "<<Loki::TL::Length<Loki::RegressionTest::tyList5>::value<<endl;\
if ( (Loki::TL::Length<Loki::RegressionTest::tyList1>::value==1) &&\
(Loki::TL::Length<Loki::RegressionTest::tyList2>::value==2) &&\
(Loki::TL::Length<Loki::RegressionTest::tyList5>::value==5) )\
cout<<"Normal cases work"<<endl;\
else\
cout<<"Normal cases are ***BROKEN***"<<endl;\
cout<<"Length of NullType: "<<Loki::TL::Length<Loki::NullType>::value<<endl;\
cout<<"Length of NullList: "<<Loki::TL::Length<Loki::RegressionTest::tyNullList>::value<<endl;\
if ( (Loki::TL::Length<Loki::NullType>::value==0) &&\
(Loki::TL::Length<Loki::RegressionTest::tyNullList>::value==0) )\
cout<<"Pathological cases work"<<endl;\
else\
cout<<"Pathological cases are ***BROKEN***"<<endl;\
cout<<endl<<endl;\
}
/*
void TypeAt()
{
cout<<endl<<"Testing TypeAt"<<endl;
//typedef TypeAt<List2, -1>::Result FailsToCompile;
typedef TypeAt<List2, 0>::Result FirstType;
typedef TypeAt<List2, 1>::Result SecondType;
typedef TypeAt<List2, 2>::Result ThirdType;
typedef TypeAt<List2, 3>::Result FourthType;
typedef TypeAt<List2, 4>::Result FifthType;
cout<<typeid(FirstType).name()<<endl;
cout<<typeid(SecondType).name()<<endl;
cout<<typeid(ThirdType).name()<<endl;
cout<<typeid(FourthType).name()<<endl;
cout<<typeid(FifthType).name()<<endl;
}
/*
void IndexOf()
{
cout<<endl<<"Testing IndexOf"<<endl;
cout<<"IndexOf int: "<<IndexOf<List2, int>::value<<endl;
cout<<"IndexOf double: "<<IndexOf<List2, double>::value<<endl;
cout<<"IndexOf vector: "<<IndexOf<List2, vector<int> >::value<<endl;
cout<<"IndexOf Complex: "<<IndexOf<List2, Complex>::value<<endl;
cout<<"IndexOf long: "<<IndexOf<List2, long>::value<<endl;
}
/*
void Append()
{
cout <<endl<<"Testing Append" << endl;
typedef Append<NullType, NullType>::Result List0;
typedef Append<List0, bool>::Result List1;
typedef Append<List1, double>::Result List2;
typedef Append<List2, NullType>:: Result List3;
cout << Length<List0>::value << endl;
cout << Length<List1>::value << "\t";
cout << typeid(TypeAt<List1, Length<List1>::value -1 >::Result).name() << endl;
cout << Length<List2>::value << "\t";
cout << typeid(TypeAt<List2, Length<List2>::value -1>::Result).name() << endl;
cout << Length<List3>::value << "\t";
cout << typeid(TypeAt<List3, Length<List3>::value -1>::Result).name() << endl;
}
/*
void Erase()
{
cout <<endl<< "Testing Erase" << endl;
cout <<"Erase is broken, notice the size goes up"<<endl;
cout << Length<List1>::value << "\t"
<< typeid(TypeAt<List1, Length<List1>::value -1 >::Result).name() << endl;
cout << Length<List2>::value << "\t"
<< typeid(TypeAt<List2, Length<List2>::value -1>::Result).name() << endl;
cout << Length<List3>::value << "\t"
<< typeid(TypeAt<List3, Length<List3>::value -1>::Result).name() << endl;
}
*/

View file

@ -0,0 +1,164 @@
#include "LokiTestTypes.h"
using std::endl;
using std::cout;
//You're not using a C++ compiler if this fails.
//Requires #include <Loki\NullType.h>
#define LOKI_TEST_NULLTYPE\
{\
Loki::NullType nullTest;\
cout<<"Testing NullType"<<endl;\
cout<<"Sizeof nullType: "<<sizeof(nullTest)<<endl;\
cout<<endl<<endl;\
}
#define LOKI_TEST_SELECT\
{\
cout<<"Testing Select"<<endl;\
typedef Loki::Select<true, void, Loki::NullType>::Result TrueType;\
typedef Loki::Select<false, int, double>::Result FalseType;\
cout<<"True case: "<<typeid(TrueType).name()<<endl;\
cout<<"False case: "<<typeid(FalseType).name()<<endl;\
cout<<endl<<endl;\
}
//TODO Need more test cases for _STRICT varaints
//TODO What is the proper conversion results to/from void?
#define LOKI_TEST_CONVERSION\
{\
cout<<"Testing Conversion"<<endl;\
typedef Loki::Conversion<int, int> tySame;\
typedef Loki::Conversion<int, Loki::RegressionTest::Complex> tyNoCon;\
typedef Loki::Conversion<int, Loki::RegressionTest::Complex_Convertable> tyCon;\
typedef Loki::Conversion<int, Loki::RegressionTest::TwoWay> ty2Way;\
typedef Loki::Conversion<void, int> tyVoid;\
cout<< tySame::sameType<<" <int, int>::sameType" <<endl;\
cout<< tySame::exists<<" <int, int>::exists" <<endl;\
cout<< tySame::exists2Way<<" <int, int>::exists2Way" <<endl;\
if (tySame::sameType && tySame::exists && tySame::exists2Way)\
cout<<"Works for same type"<<endl;\
else\
cout<<"Same type is ***BROKEN***"<<endl;\
cout<<endl;\
\
cout<< tyNoCon::sameType<<" <int, Complex>::sameType" <<endl;\
cout<< tyNoCon::exists<<" <int, Complex>::exists" <<endl;\
cout<< tyNoCon::exists2Way<<" <int, Complex>::exists2Way" <<endl;\
if (!tyNoCon::sameType && !tyNoCon::exists && !tyNoCon::exists2Way)\
cout<<"Works for non-convertibles"<<endl;\
else\
cout<<"Non-convertibles is ***BROKEN***"<<endl;\
cout<<endl;\
\
cout<< tyCon::sameType<<" <int, Complex_Convertable>::sameType" <<endl;\
cout<< tyCon::exists<<" <int, Complex_Convertable>::exists" <<endl;\
cout<< tyCon::exists2Way<<" <int, Complex_Convertable>::exists2Way" <<endl;\
if (!tyCon::sameType && tyCon::exists && !tyCon::exists2Way)\
cout<<"Works for one-way convertible"<<endl;\
else\
cout<<"One-way convertible is ***BROKEN***"<<endl;\
cout<<endl;\
\
cout<< ty2Way::sameType<<" <int, TwoWay>::sameType" <<endl;\
cout<< ty2Way::exists<<" <int, TwoWay>::exists" <<endl;\
cout<< ty2Way::exists2Way<<" <int, TwoWay>::exists2Way" <<endl;\
if (!ty2Way::sameType && ty2Way::exists && ty2Way::exists2Way)\
cout<<"Works for two-way convertibles"<<endl;\
else\
cout<<"Two-way convertibles is ***BROKEN***"<<endl;\
cout<<endl;\
\
cout<< tyVoid::sameType<<" <void, int>::sameType" <<endl;\
cout<< tyVoid::exists<<" <void, int>::exists" <<endl;\
cout<< tyVoid::exists2Way<<" <void, int>::exists2Way" <<endl;\
if (!tyVoid::sameType && !tyVoid::exists && !tyVoid::exists2Way)\
cout<<"Works for void"<<endl;\
else\
cout<<"Void conversion is ***BROKEN***"<<endl;\
cout<<"What is the correct behavior here?"<<endl;\
cout<<endl;\
\
cout<< SUPERSUBCLASS(Loki::RegressionTest::SuperClass, Loki::RegressionTest::SubClass)<<" SuperSubClass Super&Sub"<<endl;\
cout<< SUPERSUBCLASS_STRICT(Loki::RegressionTest::SuperClass, Loki::RegressionTest::SubClass)<<" SuperSubClass_Strict Super&Sub"<<endl;\
cout<< SUPERSUBCLASS(void, Loki::RegressionTest::SubClass)<<" to void*"<<endl;\
cout<< SUPERSUBCLASS_STRICT(void, Loki::RegressionTest::SubClass)<<" _Strict to void*"<<endl;\
cout<< SUPERSUBCLASS(Loki::RegressionTest::SubClass, Loki::RegressionTest::SuperClass)<<" SubSuperClass Sub&Super"<<endl;\
cout<<endl<<endl;\
}
#define LOKI_TEST_INT2TYPE\
{\
cout<<"Testing Int2Type"<<endl;\
typedef Loki::Int2Type<0> tyZero;\
typedef Loki::Int2Type<1> tyOne;\
typedef Loki::Int2Type<-1> tyNegOne;\
cout<<" Zero: "<<typeid(tyZero).name()<<endl;\
cout<<" One: "<<typeid(tyOne).name()<<endl;\
cout<<"Neg One: "<<typeid(tyNegOne).name()<<endl;\
cout<<endl<<endl;\
}
//I think this example is an undesirable way to solve this
// problem, but we're just exercising Type2Type
//MSVC7 has a template pattern matching problem that prevents this
// example solution from compiling correctly.
// Type2Type does work, but the solution it was created for doesn't
#define LOKI_TEST_TYPE2TYPE_HEADER\
struct Widget\
{\
Widget(int x, int reserved)\
{\
assert(reserved==-1);\
}\
};\
struct NewWidget\
{\
NewWidget(int x)\
{}\
};\
template<class T, class U>\
T* Create(const U& arg, Loki::Type2Type<T>)\
{\
return new T(arg);\
}\
template<class U>\
Widget* Create(const U& arg, Loki::Type2Type<Widget>)\
{\
return new Widget(arg, -1);\
}
#define LOKI_TEST_TYPE2TYPE\
{\
cout<<"Testing Type2Type"<<endl;\
NewWidget* pNewWidget = Create(4, Loki::Type2Type<NewWidget>() );\
delete pNewWidget;\
Widget* pWidget = Create(100, Loki::Type2Type<Widget>() );\
delete pWidget;\
cout<<"Used Type2Type"<<endl;\
}
#define LOKI_TEST_TYPE2TYPE_HEADER_BROKEN_PATTERN_MATCHING\
struct Widget\
{\
Widget(int x, int reserved)\
{\
cc=x;\
assert(reserved==-1);\
}\
int cc;\
};\
template<class U>\
Widget* Create(const U& arg, Loki::Type2Type<Widget>)\
{\
return new Widget(arg, -1);\
}
#define LOKI_TEST_TYPE2TYPE_BROKEN_PATTERN_MATCHING\
{\
cout<<"Testing Type2Type"<<endl;\
Widget* pWidget = Create(100, Loki::Type2Type<Widget>() );\
delete pWidget;\
cout<<"Used Type2Type"<<endl;\
cout<<endl<<endl;\
}

View file

@ -0,0 +1,27 @@
#define DUMP_TRAIT(type, trait)\
if(Loki::TypeTraits<type>::trait)\
cout<<#trait<<", ";
#define DUMP_TRAITS(type)\
{\
cout<<"("<<#type<<") ";\
DUMP_TRAIT(type, isPointer);\
DUMP_TRAIT(type, isReference);\
DUMP_TRAIT(type, isMemberPointer);\
DUMP_TRAIT(type, isStdUnsignedInt);\
DUMP_TRAIT(type, isStdSignedInt);\
DUMP_TRAIT(type, isStdIntegral);\
DUMP_TRAIT(type, isStdFloat);\
DUMP_TRAIT(type, isStdArith);\
DUMP_TRAIT(type, isStdFundamental);\
DUMP_TRAIT(type, isUnsignedInt);\
DUMP_TRAIT(type, isSignedInt);\
DUMP_TRAIT(type, isIntegral);\
DUMP_TRAIT(type, isFloat);\
DUMP_TRAIT(type, isArith);\
DUMP_TRAIT(type, isFundamental);\
DUMP_TRAIT(type, isConst);\
DUMP_TRAIT(type, isVolatile);\
cout<<endl;\
}

View file

@ -0,0 +1,5 @@
Incomplete, needs work
Output should be purged, and the results automatically verified.
MKH