Skip to content

Commit

Permalink
Added a helper struct for a constant pointer that carries the address…
Browse files Browse the repository at this point in the history
… in its type, allows for constexpr construction and implicitly converts to a pointer of the specified type.

It's not perfect, because template argument deduction sometimes fails where it didn't previously, but now the address is known at compile time, which allows for better and/or shorter code in several occasions by removing one level of indirection.
  • Loading branch information
AlexBx committed Feb 18, 2016
1 parent cd47b63 commit be428bc
Show file tree
Hide file tree
Showing 74 changed files with 132 additions and 285 deletions.
2 changes: 1 addition & 1 deletion AITriggerTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class NOVTABLE AITriggerTypeClass : public AbstractTypeClass
static const AbstractType AbsID = AbstractType::AITriggerType;

//Array
ABSTRACTTYPE_ARRAY(AITriggerTypeClass);
ABSTRACTTYPE_ARRAY(AITriggerTypeClass, 0xA8B200u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
4 changes: 3 additions & 1 deletion AbstractClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include <GeneralStructures.h>
#include <ArrayClasses.h>

#include <Helpers\CompileTime.h>

//forward declarations
class TechnoClass;
class HouseClass;
Expand Down Expand Up @@ -43,7 +45,7 @@ class NOVTABLE AbstractClass : public IPersistStream, public IRTTITypeInfo, publ
public:
static const AbstractType AbsID = AbstractType::Abstract;

static DynamicVectorClass<AbstractClass *>* const Array;
static constexpr constant_ptr<DynamicVectorClass<AbstractClass*>, 0xB0F720u> const Array{};

//static
const char* GetClassName() const
Expand Down
6 changes: 3 additions & 3 deletions AbstractTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
class CCINIClass;

//Macro for the static Array of every AbstractTypeClass!
#define ABSTRACTTYPE_ARRAY(class_name) public:\
static DynamicVectorClass<class_name*>* const Array;\
#define ABSTRACTTYPE_ARRAY(class_name, address) public:\
static constexpr constant_ptr<DynamicVectorClass<class_name*>, address> const Array{};\
static __declspec(noinline) class_name* __fastcall Find(const char* pID)\
{\
for(auto pItem : *Array)\
Expand Down Expand Up @@ -44,7 +44,7 @@ class NOVTABLE AbstractTypeClass : public AbstractClass
static const AbstractType AbsID = AbstractType::Abstract;

//Static
static DynamicVectorClass<AbstractTypeClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<AbstractTypeClass*>, 0xA8E968u> const Array{};

//Destructor
virtual ~AbstractTypeClass() RX;
Expand Down
2 changes: 1 addition & 1 deletion AircraftClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class NOVTABLE AircraftClass : public FootClass, public FlasherClass
static const AbstractType AbsID = AbstractType::Aircraft;

//Static
static DynamicVectorClass<AircraftClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<AircraftClass*>, 0xA8E390u> const Array{};

//IFlyControl
virtual int __stdcall Landing_Altitude() R0;
Expand Down
2 changes: 1 addition & 1 deletion AircraftTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class NOVTABLE AircraftTypeClass : public TechnoTypeClass
static const AbstractType AbsID = AbstractType::AircraftType;

//Array
ABSTRACTTYPE_ARRAY(AircraftTypeClass);
ABSTRACTTYPE_ARRAY(AircraftTypeClass, 0xA8B218u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion AlphaShapeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class NOVTABLE AlphaShapeClass : public AbstractClass
static const AbstractType AbsID = AbstractType::AlphaShape;

//Static
static DynamicVectorClass<AlphaShapeClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<AlphaShapeClass*>, 0x88A0F0u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion AnimClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class NOVTABLE AnimClass : public ObjectClass
static const AbstractType AbsID = AbstractType::Anim;

//Static
static DynamicVectorClass<AnimClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<AnimClass*>, 0xA8E9A8u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion AnimTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class NOVTABLE AnimTypeClass : public ObjectTypeClass
static const AbstractType AbsID = AbstractType::AnimType;

//Array
ABSTRACTTYPE_ARRAY(AnimTypeClass);
ABSTRACTTYPE_ARRAY(AnimTypeClass, 0x8B4150u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion BuildingClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class NOVTABLE BuildingClass : public TechnoClass
static const AbstractType AbsID = AbstractType::Building;

//Static
static DynamicVectorClass<BuildingClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<BuildingClass*>, 0xA8EB40u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion BuildingLightClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class NOVTABLE BuildingLightClass : public ObjectClass
static const AbstractType AbsID = AbstractType::BuildingLight;

//Static
static DynamicVectorClass<BuildingLightClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<BuildingLightClass*>, 0x8B4190u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion BuildingTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class NOVTABLE BuildingTypeClass : public TechnoTypeClass
static const AbstractType AbsID = AbstractType::BuildingType;

//Array
ABSTRACTTYPE_ARRAY(BuildingTypeClass);
ABSTRACTTYPE_ARRAY(BuildingTypeClass, 0xA83C68u);

static int &HeightInLeptons;

Expand Down
2 changes: 1 addition & 1 deletion BulletClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class NOVTABLE BulletClass : public ObjectClass
static const AbstractType AbsID = AbstractType::Bullet;

//Array
static DynamicVectorClass<BulletClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<BulletClass*>, 0xA8ED40u> const Array{};

static DynamicVectorClass<BulletClass*>& ScalableBullets;

Expand Down
2 changes: 1 addition & 1 deletion BulletTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class NOVTABLE BulletTypeClass : public ObjectTypeClass
static const AbstractType AbsID = AbstractType::BulletType;

//Array
ABSTRACTTYPE_ARRAY(BulletTypeClass);
ABSTRACTTYPE_ARRAY(BulletTypeClass, 0xA83C80u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
6 changes: 3 additions & 3 deletions CaptureManagerClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ struct ControlNode
class NOVTABLE CaptureManagerClass : public AbstractClass
{
public:

static DynamicVectorClass<CaptureManagerClass *>* const Array;

static const AbstractType AbsID = AbstractType::CaptureManager;

//Static
static constexpr constant_ptr<DynamicVectorClass<CaptureManagerClass*>, 0x89E0F0u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;

Expand Down
4 changes: 3 additions & 1 deletion ColorScheme.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
#include <ArrayClasses.h>
#include <GeneralStructures.h>

#include <Helpers/CompileTime.h>

class LightConvertClass;

class ColorScheme
Expand All @@ -26,7 +28,7 @@ class ColorScheme
};

//global array
static DynamicVectorClass<ColorScheme*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<ColorScheme*>, 0xB054D0u> const Array{};
/*
* trap! most schemes are duplicated - ShadeCount 1 and ShadeCount 53
*/
Expand Down
4 changes: 3 additions & 1 deletion CommandClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
#include <GeneralDefinitions.h>
#include <ArrayClasses.h>

#include <Helpers/CompileTime.h>

class NOVTABLE CommandClass
{
public:
// static
static DynamicVectorClass<CommandClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<CommandClass*>, 0x87F658u> const Array{};

//CommandClass
virtual ~CommandClass() = default;
Expand Down
5 changes: 3 additions & 2 deletions ConvertClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <Blitters.h>

#include <FileFormats/SHP.h>
#include <Helpers/CompileTime.h>

struct ColorStruct;
class DSurface;
Expand All @@ -21,7 +22,7 @@ class ConvertClass
{
public:
//global array
static DynamicVectorClass<ConvertClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<ConvertClass*>, 0x89ECF8u> const Array{};

static ConvertClass* FindOrAllocate(const char * FileName);

Expand Down Expand Up @@ -84,7 +85,7 @@ class LightConvertClass : public ConvertClass
{
public:
//global array
static DynamicVectorClass<LightConvertClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<LightConvertClass*>, 0x87F698u> const Array{};

//Destructor
virtual ~LightConvertClass() RX;
Expand Down
2 changes: 1 addition & 1 deletion DiskLaserClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class NOVTABLE DiskLaserClass : public AbstractClass
static const AbstractType AbsID = AbstractType::DiskLaser;

// static
static DynamicVectorClass<DiskLaserClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<DiskLaserClass*>, 0x8A0208u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion EBolt.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class UnitClass;
class EBolt
{
public:
static DynamicVectorClass<EBolt*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<EBolt*>, 0x8A0E88u> const Array{};

//Constructor, Destructor
EBolt()
Expand Down
2 changes: 1 addition & 1 deletion EMPulseClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class NOVTABLE EMPulseClass : public AbstractClass
static const AbstractType AbsID = AbstractType::EMPulse;

//Static
static DynamicVectorClass<EMPulseClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<EMPulseClass*>, 0x8A3870u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion FactoryClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class NOVTABLE FactoryClass : public AbstractClass
public:
static const AbstractType AbsID = AbstractType::Factory;

static DynamicVectorClass<FactoryClass *> * const Array;
static constexpr constant_ptr<DynamicVectorClass<FactoryClass*>, 0xA83E30u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion FootClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class NOVTABLE FootClass : public TechnoClass
public:
static const auto AbsDerivateID = AbstractFlags::Foot;

static DynamicVectorClass<FootClass *>* const Array;
static constexpr constant_ptr<DynamicVectorClass<FootClass*>, 0x8B3DC0u> const Array{};

//IPersistStream
//Destructor
Expand Down
33 changes: 33 additions & 0 deletions Helpers/CompileTime.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#pragma once

// defines a compile time pointer to a known memory address
template <typename T, unsigned int Address>
struct constant_ptr {
using value_type = T*;

constexpr constant_ptr() noexcept = default;
private:
// mere presence "fixes" C2100: illegal indirection
constexpr constant_ptr(noinit_t) noexcept {}
public:

value_type get() const noexcept {
return reinterpret_cast<value_type>(Address);
}

operator value_type() const noexcept {
return get();
}

value_type operator()() const noexcept {
return get();
}

value_type operator->() const noexcept {
return get();
}

T& operator*() const noexcept {
return *get();
}
};
2 changes: 1 addition & 1 deletion HouseClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class NOVTABLE HouseClass : public AbstractClass, public IHouse, public IPublicH
enum {PlayerAtA = 4475, PlayerAtB, PlayerAtC, PlayerAtD, PlayerAtE, PlayerAtF, PlayerAtG, PlayerAtH};

//Static
static DynamicVectorClass<HouseClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<HouseClass*>, 0xA80228u> const Array{};

static HouseClass *&Player;
static HouseClass *&Observer;
Expand Down
2 changes: 1 addition & 1 deletion HouseTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class NOVTABLE HouseTypeClass : public AbstractTypeClass
static const AbstractType AbsID = AbstractType::HouseType;

//Array
ABSTRACTTYPE_ARRAY(HouseTypeClass);
ABSTRACTTYPE_ARRAY(HouseTypeClass, 0xA83C98u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion InfantryClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class NOVTABLE InfantryClass : public FootClass
static const AbstractType AbsID = AbstractType::Infantry;

//Static
static DynamicVectorClass<InfantryClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<InfantryClass*>, 0xA83DE8u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion InfantryTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class NOVTABLE InfantryTypeClass : public TechnoTypeClass
static const AbstractType AbsID = AbstractType::InfantryType;

//Array
ABSTRACTTYPE_ARRAY(InfantryTypeClass);
ABSTRACTTYPE_ARRAY(InfantryTypeClass, 0xA8E348u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion IonBlastClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
class IonBlastClass
{
public:
static DynamicVectorClass<IonBlastClass *>* const Array;
static constexpr constant_ptr<DynamicVectorClass<IonBlastClass*>, 0xAA0118u> const Array{};

static void UpdateAll()
{ JMP_STD(0x53D310); }
Expand Down
2 changes: 1 addition & 1 deletion IsometricTileClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class NOVTABLE IsometricTileClass : public ObjectClass
static const AbstractType AbsID = AbstractType::Isotile;

//Array
static DynamicVectorClass<IsometricTileClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<IsometricTileClass*>, 0x87F750u> Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) override R0;
Expand Down
2 changes: 1 addition & 1 deletion IsometricTileTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class NOVTABLE IsometricTileTypeClass : public ObjectTypeClass
static const AbstractType AbsID = AbstractType::IsotileType;

//Array
static DynamicVectorClass<IsometricTileTypeClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<IsometricTileTypeClass*>, 0xA8ED28u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
4 changes: 3 additions & 1 deletion LineTrail.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include <GeneralDefinitions.h>

#include <Helpers/CompileTime.h>

struct LineTrailNode
{
CoordStruct Position;
Expand All @@ -11,7 +13,7 @@ struct LineTrailNode
class LineTrail
{
public:
static DynamicVectorClass<LineTrail*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<LineTrail*>, 0xABCB78u> const Array{};

//Constructor, Destructor
LineTrail()
Expand Down
2 changes: 1 addition & 1 deletion OverlayClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class NOVTABLE OverlayClass : public ObjectClass
static const AbstractType AbsID = AbstractType::Overlay;

//Static
static DynamicVectorClass<OverlayClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<OverlayClass*>, 0xA8EC50u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion OverlayTypeClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class NOVTABLE OverlayTypeClass : public ObjectTypeClass
static const AbstractType AbsID = AbstractType::OverlayType;

//Array
ABSTRACTTYPE_ARRAY(OverlayTypeClass);
ABSTRACTTYPE_ARRAY(OverlayTypeClass, 0xA83D80u);

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
2 changes: 1 addition & 1 deletion ParasiteClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class NOVTABLE ParasiteClass : public AbstractClass
public:
static const AbstractType AbsID = AbstractType::Parasite;

static DynamicVectorClass<ParasiteClass*>* const Array;
static constexpr constant_ptr<DynamicVectorClass<ParasiteClass*>, 0xAC4910u> const Array{};

//IPersist
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
Expand Down
Loading

0 comments on commit be428bc

Please sign in to comment.