summaryrefslogtreecommitdiff
path: root/Client/ThirdParty/StaticConstructor
diff options
context:
space:
mode:
Diffstat (limited to 'Client/ThirdParty/StaticConstructor')
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.cpp43
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.h36
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyTemplate.h48
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.cpp76
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.sln20
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.vcproj229
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.cpp8
-rw-r--r--Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.h24
-rw-r--r--Client/ThirdParty/StaticConstructor/include/StaticConstructor.h126
9 files changed, 610 insertions, 0 deletions
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.cpp b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.cpp
new file mode 100644
index 0000000..3ea12a3
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.cpp
@@ -0,0 +1,43 @@
+// MyClass.cpp
+//
+#include "stdafx.h"
+#include "MyClass.h"
+
+
+// Initialization of protected static data members:
+void* MyClass::mpStaticMemory = NULL;
+const double MyClass::mPI = 3.141592;
+std::string MyClass::mStaticStr = "Init Value";
+
+
+// Invoke the StaticConstructor & StaticDestructor of the class:
+// Make sure you put this AFTER the initialization of the static data members!
+INVOKE_STATIC_CONSTRUCTOR(MyClass);
+
+
+// Default Constructor:
+MyClass::MyClass()
+{
+// PI = 5.0; // Cannot be done, as PI is const
+ mStaticStr = "Modified by Default Constructor";
+}
+
+// Destructor:
+MyClass::~MyClass()
+{
+ mStaticStr = "Modified by Default Destructor";
+}
+
+// Static Constructor:
+void MyClass::StaticConstructor()
+{
+ mStaticStr = "Modified by Static Constructor";
+ mpStaticMemory = new double[10];
+}
+
+// Static Destructor:
+void MyClass::StaticDestructor()
+{
+ delete[] mpStaticMemory;
+}
+
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.h b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.h
new file mode 100644
index 0000000..5f86f22
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyClass.h
@@ -0,0 +1,36 @@
+// MyClass.h
+//
+#include <string>
+#include <StaticConstructor.h>
+
+
+class MyClass
+{
+protected:
+ // Declaration of protected static data members:
+ // Cannot be initialized here (C++ language limitation)
+ static void* mpStaticMemory;
+ static const double mPI;
+ static std::string mStaticStr;
+
+public:
+ // Static function members to get the static data members (to unify the Tests):
+ static const double& PI() { return mPI; };
+ static std::string& StaticStr() { return mStaticStr; };
+
+public:
+ // Default Constructor:
+ MyClass();
+
+ // Destructor:
+ virtual ~MyClass();
+
+ // Static Constructor:
+ // (Should be called by INVOKE_STATIC_CONSTRUCTOR macro in the CPP file)
+ STATIC_CONSTRUCTOR();
+
+ // Static Destructor:
+ // (Should be called by INVOKE_STATIC_CONSTRUCTOR macro in the CPP file)
+ STATIC_DESTRUCTOR();
+};
+
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyTemplate.h b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyTemplate.h
new file mode 100644
index 0000000..a0a147c
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/MyTemplate.h
@@ -0,0 +1,48 @@
+// MyTemplate.h
+//
+#include <string>
+#include <StaticConstructor.h>
+
+
+template <typename Type>
+class MyTemplate
+{
+protected:
+ // Declaration and initialization of protected static Data-Function member:
+ STATIC_DF_MEMBER(Type*, pStaticMemory, NULL);
+
+public:
+ // Declaration and initialization of public static Data-Function members:
+ STATIC_DF_MEMBER(const double, PI, 3.141592);
+ STATIC_DF_MEMBER(std::string, StaticStr, "Init Value");
+
+public:
+ // Default Constructor:
+ MyTemplate()
+ {
+ // PI() = 5.0; // Cannot be done, as PI is const
+ StaticStr() = "Modified by Default Constructor";
+ }
+
+ // Destructor:
+ virtual ~MyTemplate()
+ {
+ StaticStr() = "Modified by Default Destructor";
+ }
+
+ // Static Constructor:
+ // (Should be called by INVOKE_STATIC_CONSTRUCTOR macro in one CPP file)
+ STATIC_CONSTRUCTOR()
+ {
+ StaticStr() = "Modified by Static Constructor";
+ pStaticMemory() = new Type[10];
+ }
+
+ // Static Destructor:
+ // (Should be called by INVOKE_STATIC_CONSTRUCTOR macro in one CPP file)
+ STATIC_DESTRUCTOR()
+ {
+ delete[] pStaticMemory();
+ }
+};
+
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.cpp b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.cpp
new file mode 100644
index 0000000..26ff046
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.cpp
@@ -0,0 +1,76 @@
+// StaticConstructorSample.cpp : Defines the entry point for the console application.
+//
+#include "stdafx.h"
+#include <iostream>
+#include <string>
+
+// Sample Files:
+#include "MyClass.h"
+#include "MyTemplate.h"
+
+
+// Sample code for StartUp
+STATIC_STARTUP_CODE()
+{
+ std::cout << "Starting up..." << std::endl;
+}
+
+// Sample code for FinishUp
+STATIC_FINISHUP_CODE()
+{
+ std::cout << "Finishing up..." << std::endl;
+}
+
+
+// Template for testing each Type:
+template <typename Type>
+void TestType(const std::string& strType)
+{
+ using namespace std;
+
+ // Static Constructor should have been already invoked:
+ cout << "Show static data members before creating any instance of " << strType << ":" << endl;
+ cout << "String: " << Type::StaticStr() << endl;
+ cout << "PI: " << Type::PI() << endl;
+
+ // Temporary block:
+ // Destructor of local variable will be called at the end of this block.
+ {
+ Type myObj;
+ cout << "Show static data members after creating an instance of " << strType << ":" << endl;
+ cout << "String: " << myObj.StaticStr() << endl;
+ cout << "PI: " << myObj.PI() << endl;
+ }
+
+ cout << "Show static data members after destroying the instance of " << strType << ":" << endl;
+ cout << "String: " << Type::StaticStr() << endl;
+ cout << "PI: " << Type::PI() << endl;
+ cout << endl;
+}
+
+
+// Declaration of alias (class names) for the template instaces:
+typedef MyTemplate<int> MyTemplateInt;
+typedef MyTemplate<double> MyTemplateDouble;
+
+// Invoke the StaticConstructor & StaticDestructor for each one of the template instances:
+// Should be called with alias (class names) for the template instaces.
+INVOKE_STATIC_CONSTRUCTOR(MyTemplateInt);
+INVOKE_STATIC_CONSTRUCTOR(MyTemplateDouble);
+
+
+// Main:
+int _tmain(int argc, _TCHAR* argv[])
+{
+ // Static Constructors have already been called before entering this function...
+
+ // Run the same tests for each one of the classes:
+ TestType<MyClass>("MyClass");
+ TestType<MyTemplateInt>("MyTemplateInt");
+ TestType<MyTemplateDouble>("MyTemplateDouble");
+
+ // Static Destructors will be called after exiting this function...
+ return 0;
+}
+
+
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.sln b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.sln
new file mode 100644
index 0000000..265f06c
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StaticConstructorSample", "StaticConstructorSample.vcproj", "{41329043-C008-486E-99A9-BC1A0B4DF9A5}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {41329043-C008-486E-99A9-BC1A0B4DF9A5}.Debug|Win32.ActiveCfg = Debug|Win32
+ {41329043-C008-486E-99A9-BC1A0B4DF9A5}.Debug|Win32.Build.0 = Debug|Win32
+ {41329043-C008-486E-99A9-BC1A0B4DF9A5}.Release|Win32.ActiveCfg = Release|Win32
+ {41329043-C008-486E-99A9-BC1A0B4DF9A5}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.vcproj b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.vcproj
new file mode 100644
index 0000000..0f66ceb
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/StaticConstructorSample.vcproj
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="StaticConstructorSample"
+ ProjectGUID="{41329043-C008-486E-99A9-BC1A0B4DF9A5}"
+ RootNamespace="StaticConstructorSample"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="196613"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\include"
+ PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="3"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="2"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+ IntermediateDirectory="$(ConfigurationName)"
+ ConfigurationType="1"
+ CharacterSet="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ EnableIntrinsicFunctions="true"
+ AdditionalIncludeDirectories="..\include"
+ PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+ RuntimeLibrary="2"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="2"
+ WarningLevel="3"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="include"
+ >
+ <File
+ RelativePath="..\include\StaticConstructor.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Sample Files"
+ >
+ <File
+ RelativePath=".\MyClass.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\MyClass.h"
+ >
+ </File>
+ <File
+ RelativePath=".\MyTemplate.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Project Files"
+ >
+ <File
+ RelativePath=".\StaticConstructorSample.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\stdafx.cpp"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ UsePrecompiledHeader="1"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\stdafx.h"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.cpp b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.cpp
new file mode 100644
index 0000000..88d97ab
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.cpp
@@ -0,0 +1,8 @@
+// stdafx.cpp : source file that includes just the standard includes
+// StaticConstructorSample.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
+// TODO: reference any additional headers you need in STDAFX.H
+// and not in this file
diff --git a/Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.h b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.h
new file mode 100644
index 0000000..022bc3b
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/StaticConstructorSample/stdafx.h
@@ -0,0 +1,24 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#pragma once
+
+// The following macros define the minimum required platform. The minimum required platform
+// is the earliest version of Windows, Internet Explorer etc. that has the necessary features to run
+// your application. The macros work by enabling all features available on platform versions up to and
+// including the version specified.
+
+// Modify the following defines if you have to target a platform prior to the ones specified below.
+// Refer to MSDN for the latest info on corresponding values for different platforms.
+#ifndef _WIN32_WINNT // Specifies that the minimum required platform is Windows Vista.
+#define _WIN32_WINNT 0x0600 // Change this to the appropriate value to target other versions of Windows.
+#endif
+
+// STL includes
+#include <stdio.h>
+#include <tchar.h>
+
+
+// TODO: reference additional headers your program requires here
diff --git a/Client/ThirdParty/StaticConstructor/include/StaticConstructor.h b/Client/ThirdParty/StaticConstructor/include/StaticConstructor.h
new file mode 100644
index 0000000..22310bd
--- /dev/null
+++ b/Client/ThirdParty/StaticConstructor/include/StaticConstructor.h
@@ -0,0 +1,126 @@
+//////////////////////////////////////////////////////////////////////////////
+// AUTHOR: Hugo González Castro
+// TITLE: Static Constructor in C++
+// DESCRIPTION: An easy way to implement static constructors and
+// static destructors in standard C++.
+// VERSION: v1.2 - 2011/11/27
+// LICENSE: CPOL (Code Project Open License).
+// Please, do not remove nor modify this header.
+// URL: http://www.codeproject.com/KB/cpp/StaticConstructor.aspx
+//////////////////////////////////////////////////////////////////////////////
+#ifndef _STATIC_CONSTRUCTOR_H_
+#define _STATIC_CONSTRUCTOR_H_
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// DECLARATIONS (macros to use):
+//////////////////////////////////////////////////////////////////////////////
+
+
+// REQUIRED macro to invoke the static constructor/destructor of a class:
+// place the call to this macro out of the definition of the class, in a .CPP file
+// (avoid using it in .H files unless they are included only once).
+// Make sure you put this AFTER the initialization of the static data members!
+// For templates, should be called with alias (typedef) for the template instaces.
+//////////////////////////////////////////////////////////////////////////////
+#define INVOKE_STATIC_CONSTRUCTOR(ClassName) \
+ INVOKE_STATIC_CONSTRUCTOR_EXPANDED(ClassName)
+
+
+// OPTIONAL macros to help to declare the header of the static constructor/destructor:
+// place the calls to these macros inside the definition of the class/template, in a .H file
+//////////////////////////////////////////////////////////////////////////////
+#define STATIC_CONSTRUCTOR() static void StaticConstructor()
+#define STATIC_DESTRUCTOR() static void StaticDestructor()
+
+
+// OPTIONAL macro to declare static Data-Function members with inline initialization:
+// place the call to this macro inside the definition of the class/template.
+//////////////////////////////////////////////////////////////////////////////
+// STATIC DF MEMBER (static Data-Function member):
+// "a static function member with a static local (data) variable declared inside".
+// The TypeName can be or not a CONST type.
+//////////////////////////////////////////////////////////////////////////////
+#define STATIC_DF_MEMBER(TypeName, DFMemberName, InitValue) \
+ STATIC_DF_MEMBER_EXPANDED(TypeName, DFMemberName, InitValue)
+
+
+// OPTIONAL macros to run code at startup and finishup. Place outside classes.
+// Place the static code inside {} after one of these macros.
+//////////////////////////////////////////////////////////////////////////////
+#define STATIC_STARTUP_CODE() STATIC_STARTUP_CODE_EXPANDED()
+#define STATIC_FINISHUP_CODE() STATIC_FINISHUP_CODE_EXPANDED()
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// IMPLEMENTATION (do not directly use these macros):
+//////////////////////////////////////////////////////////////////////////////
+
+
+// Definition of special class to invoke
+// the static constructor/destructor from
+// its own non-static constructor/destructor.
+template<typename ClassName>
+class StaticInvoker
+{
+public:
+ // Default Constructor:
+ StaticInvoker()
+ {
+ // Call to the static constructor of ClassName:
+ ClassName::StaticConstructor();
+ }
+
+ // Destructor:
+ virtual ~StaticInvoker()
+ {
+ // Call to the static destructor of ClassName:
+ ClassName::StaticDestructor();
+ }
+};
+
+
+// Macro with expanded name:
+#define INVOKE_STATIC_CONSTRUCTOR_EXPANDED(ClassName) \
+ /* Single instance of this invoker class, so its constructor is called only once */ \
+ StaticInvoker<ClassName> staticInvokerOf_##ClassName;
+
+
+// STATIC DF MEMBER (static Data-Function member):
+// "a static function member with a static local (data) variable declared inside".
+// The TypeName can be or not a CONST type.
+#define STATIC_DF_MEMBER_EXPANDED(TypeName, DFMemberName, InitValue) \
+ static TypeName& DFMemberName() \
+ { \
+ static TypeName DFMemberName(InitValue); \
+ return DFMemberName; \
+ }
+
+
+// Expanded macro to run code at startup.
+#define STATIC_STARTUP_CODE_EXPANDED() \
+ class StartUpCode \
+ { \
+ public: \
+ StartUpCode(); \
+ }; \
+ StartUpCode myStartUpCode; \
+ StartUpCode::StartUpCode()
+
+
+// Expanded macro to run code at finishup.
+#define STATIC_FINISHUP_CODE_EXPANDED() \
+ class FinishUpCode \
+ { \
+ public: \
+ FinishUpCode() {}; \
+ virtual ~FinishUpCode(); \
+ }; \
+ FinishUpCode myFinishUpCode; \
+ FinishUpCode::~FinishUpCode()
+
+
+
+#endif // _STATIC_CONSTRUCTOR_H_