Skip to content

Commit be428bc

Browse files
committed
Added a helper struct for a constant pointer that carries the address 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.
1 parent cd47b63 commit be428bc

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+132
-285
lines changed

AITriggerTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class NOVTABLE AITriggerTypeClass : public AbstractTypeClass
2525
static const AbstractType AbsID = AbstractType::AITriggerType;
2626

2727
//Array
28-
ABSTRACTTYPE_ARRAY(AITriggerTypeClass);
28+
ABSTRACTTYPE_ARRAY(AITriggerTypeClass, 0xA8B200u);
2929

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

AbstractClass.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
#include <GeneralStructures.h>
66
#include <ArrayClasses.h>
77

8+
#include <Helpers\CompileTime.h>
9+
810
//forward declarations
911
class TechnoClass;
1012
class HouseClass;
@@ -43,7 +45,7 @@ class NOVTABLE AbstractClass : public IPersistStream, public IRTTITypeInfo, publ
4345
public:
4446
static const AbstractType AbsID = AbstractType::Abstract;
4547

46-
static DynamicVectorClass<AbstractClass *>* const Array;
48+
static constexpr constant_ptr<DynamicVectorClass<AbstractClass*>, 0xB0F720u> const Array{};
4749

4850
//static
4951
const char* GetClassName() const

AbstractTypeClass.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
class CCINIClass;
1111

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

4646
//Static
47-
static DynamicVectorClass<AbstractTypeClass*>* const Array;
47+
static constexpr constant_ptr<DynamicVectorClass<AbstractTypeClass*>, 0xA8E968u> const Array{};
4848

4949
//Destructor
5050
virtual ~AbstractTypeClass() RX;

AircraftClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class NOVTABLE AircraftClass : public FootClass, public FlasherClass
2020
static const AbstractType AbsID = AbstractType::Aircraft;
2121

2222
//Static
23-
static DynamicVectorClass<AircraftClass*>* const Array;
23+
static constexpr constant_ptr<DynamicVectorClass<AircraftClass*>, 0xA8E390u> const Array{};
2424

2525
//IFlyControl
2626
virtual int __stdcall Landing_Altitude() R0;

AircraftTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class NOVTABLE AircraftTypeClass : public TechnoTypeClass
88
static const AbstractType AbsID = AbstractType::AircraftType;
99

1010
//Array
11-
ABSTRACTTYPE_ARRAY(AircraftTypeClass);
11+
ABSTRACTTYPE_ARRAY(AircraftTypeClass, 0xA8B218u);
1212

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

AlphaShapeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class NOVTABLE AlphaShapeClass : public AbstractClass
1515
static const AbstractType AbsID = AbstractType::AlphaShape;
1616

1717
//Static
18-
static DynamicVectorClass<AlphaShapeClass*>* const Array;
18+
static constexpr constant_ptr<DynamicVectorClass<AlphaShapeClass*>, 0x88A0F0u> const Array{};
1919

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

AnimClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class NOVTABLE AnimClass : public ObjectClass
2121
static const AbstractType AbsID = AbstractType::Anim;
2222

2323
//Static
24-
static DynamicVectorClass<AnimClass*>* const Array;
24+
static constexpr constant_ptr<DynamicVectorClass<AnimClass*>, 0xA8E9A8u> const Array{};
2525

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

AnimTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class NOVTABLE AnimTypeClass : public ObjectTypeClass
1717
static const AbstractType AbsID = AbstractType::AnimType;
1818

1919
//Array
20-
ABSTRACTTYPE_ARRAY(AnimTypeClass);
20+
ABSTRACTTYPE_ARRAY(AnimTypeClass, 0x8B4150u);
2121

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

BuildingClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class NOVTABLE BuildingClass : public TechnoClass
1818
static const AbstractType AbsID = AbstractType::Building;
1919

2020
//Static
21-
static DynamicVectorClass<BuildingClass*>* const Array;
21+
static constexpr constant_ptr<DynamicVectorClass<BuildingClass*>, 0xA8EB40u> const Array{};
2222

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

BuildingLightClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class NOVTABLE BuildingLightClass : public ObjectClass
99
static const AbstractType AbsID = AbstractType::BuildingLight;
1010

1111
//Static
12-
static DynamicVectorClass<BuildingLightClass*>* const Array;
12+
static constexpr constant_ptr<DynamicVectorClass<BuildingLightClass*>, 0x8B4190u> const Array{};
1313

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

BuildingTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class NOVTABLE BuildingTypeClass : public TechnoTypeClass
3030
static const AbstractType AbsID = AbstractType::BuildingType;
3131

3232
//Array
33-
ABSTRACTTYPE_ARRAY(BuildingTypeClass);
33+
ABSTRACTTYPE_ARRAY(BuildingTypeClass, 0xA83C68u);
3434

3535
static int &HeightInLeptons;
3636

BulletClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class NOVTABLE BulletClass : public ObjectClass
2828
static const AbstractType AbsID = AbstractType::Bullet;
2929

3030
//Array
31-
static DynamicVectorClass<BulletClass*>* const Array;
31+
static constexpr constant_ptr<DynamicVectorClass<BulletClass*>, 0xA8ED40u> const Array{};
3232

3333
static DynamicVectorClass<BulletClass*>& ScalableBullets;
3434

BulletTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class NOVTABLE BulletTypeClass : public ObjectTypeClass
2121
static const AbstractType AbsID = AbstractType::BulletType;
2222

2323
//Array
24-
ABSTRACTTYPE_ARRAY(BulletTypeClass);
24+
ABSTRACTTYPE_ARRAY(BulletTypeClass, 0xA83C80u);
2525

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

CaptureManagerClass.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ struct ControlNode
1919
class NOVTABLE CaptureManagerClass : public AbstractClass
2020
{
2121
public:
22-
23-
static DynamicVectorClass<CaptureManagerClass *>* const Array;
24-
2522
static const AbstractType AbsID = AbstractType::CaptureManager;
2623

24+
//Static
25+
static constexpr constant_ptr<DynamicVectorClass<CaptureManagerClass*>, 0x89E0F0u> const Array{};
26+
2727
//IPersist
2828
virtual HRESULT __stdcall GetClassID(CLSID* pClassID) R0;
2929

ColorScheme.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <ArrayClasses.h>
88
#include <GeneralStructures.h>
99

10+
#include <Helpers/CompileTime.h>
11+
1012
class LightConvertClass;
1113

1214
class ColorScheme
@@ -26,7 +28,7 @@ class ColorScheme
2628
};
2729

2830
//global array
29-
static DynamicVectorClass<ColorScheme*>* const Array;
31+
static constexpr constant_ptr<DynamicVectorClass<ColorScheme*>, 0xB054D0u> const Array{};
3032
/*
3133
* trap! most schemes are duplicated - ShadeCount 1 and ShadeCount 53
3234
*/

CommandClass.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
#include <GeneralDefinitions.h>
1616
#include <ArrayClasses.h>
1717

18+
#include <Helpers/CompileTime.h>
19+
1820
class NOVTABLE CommandClass
1921
{
2022
public:
2123
// static
22-
static DynamicVectorClass<CommandClass*>* const Array;
24+
static constexpr constant_ptr<DynamicVectorClass<CommandClass*>, 0x87F658u> const Array{};
2325

2426
//CommandClass
2527
virtual ~CommandClass() = default;

ConvertClass.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <Blitters.h>
1212

1313
#include <FileFormats/SHP.h>
14+
#include <Helpers/CompileTime.h>
1415

1516
struct ColorStruct;
1617
class DSurface;
@@ -21,7 +22,7 @@ class ConvertClass
2122
{
2223
public:
2324
//global array
24-
static DynamicVectorClass<ConvertClass*>* const Array;
25+
static constexpr constant_ptr<DynamicVectorClass<ConvertClass*>, 0x89ECF8u> const Array{};
2526

2627
static ConvertClass* FindOrAllocate(const char * FileName);
2728

@@ -84,7 +85,7 @@ class LightConvertClass : public ConvertClass
8485
{
8586
public:
8687
//global array
87-
static DynamicVectorClass<LightConvertClass*>* const Array;
88+
static constexpr constant_ptr<DynamicVectorClass<LightConvertClass*>, 0x87F698u> const Array{};
8889

8990
//Destructor
9091
virtual ~LightConvertClass() RX;

DiskLaserClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class NOVTABLE DiskLaserClass : public AbstractClass
1616
static const AbstractType AbsID = AbstractType::DiskLaser;
1717

1818
// static
19-
static DynamicVectorClass<DiskLaserClass*>* const Array;
19+
static constexpr constant_ptr<DynamicVectorClass<DiskLaserClass*>, 0x8A0208u> const Array{};
2020

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

EBolt.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class UnitClass;
1111
class EBolt
1212
{
1313
public:
14-
static DynamicVectorClass<EBolt*>* const Array;
14+
static constexpr constant_ptr<DynamicVectorClass<EBolt*>, 0x8A0E88u> const Array{};
1515

1616
//Constructor, Destructor
1717
EBolt()

EMPulseClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class NOVTABLE EMPulseClass : public AbstractClass
1212
static const AbstractType AbsID = AbstractType::EMPulse;
1313

1414
//Static
15-
static DynamicVectorClass<EMPulseClass*>* const Array;
15+
static constexpr constant_ptr<DynamicVectorClass<EMPulseClass*>, 0x8A3870u> const Array{};
1616

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

FactoryClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class NOVTABLE FactoryClass : public AbstractClass
1616
public:
1717
static const AbstractType AbsID = AbstractType::Factory;
1818

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

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

FootClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class NOVTABLE FootClass : public TechnoClass
1717
public:
1818
static const auto AbsDerivateID = AbstractFlags::Foot;
1919

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

2222
//IPersistStream
2323
//Destructor

Helpers/CompileTime.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
// defines a compile time pointer to a known memory address
4+
template <typename T, unsigned int Address>
5+
struct constant_ptr {
6+
using value_type = T*;
7+
8+
constexpr constant_ptr() noexcept = default;
9+
private:
10+
// mere presence "fixes" C2100: illegal indirection
11+
constexpr constant_ptr(noinit_t) noexcept {}
12+
public:
13+
14+
value_type get() const noexcept {
15+
return reinterpret_cast<value_type>(Address);
16+
}
17+
18+
operator value_type() const noexcept {
19+
return get();
20+
}
21+
22+
value_type operator()() const noexcept {
23+
return get();
24+
}
25+
26+
value_type operator->() const noexcept {
27+
return get();
28+
}
29+
30+
T& operator*() const noexcept {
31+
return *get();
32+
}
33+
};

HouseClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ class NOVTABLE HouseClass : public AbstractClass, public IHouse, public IPublicH
140140
enum {PlayerAtA = 4475, PlayerAtB, PlayerAtC, PlayerAtD, PlayerAtE, PlayerAtF, PlayerAtG, PlayerAtH};
141141

142142
//Static
143-
static DynamicVectorClass<HouseClass*>* const Array;
143+
static constexpr constant_ptr<DynamicVectorClass<HouseClass*>, 0xA80228u> const Array{};
144144

145145
static HouseClass *&Player;
146146
static HouseClass *&Observer;

HouseTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class NOVTABLE HouseTypeClass : public AbstractTypeClass
1717
static const AbstractType AbsID = AbstractType::HouseType;
1818

1919
//Array
20-
ABSTRACTTYPE_ARRAY(HouseTypeClass);
20+
ABSTRACTTYPE_ARRAY(HouseTypeClass, 0xA83C98u);
2121

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

InfantryClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class NOVTABLE InfantryClass : public FootClass
1313
static const AbstractType AbsID = AbstractType::Infantry;
1414

1515
//Static
16-
static DynamicVectorClass<InfantryClass*>* const Array;
16+
static constexpr constant_ptr<DynamicVectorClass<InfantryClass*>, 0xA83DE8u> const Array{};
1717

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

InfantryTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class NOVTABLE InfantryTypeClass : public TechnoTypeClass
3838
static const AbstractType AbsID = AbstractType::InfantryType;
3939

4040
//Array
41-
ABSTRACTTYPE_ARRAY(InfantryTypeClass);
41+
ABSTRACTTYPE_ARRAY(InfantryTypeClass, 0xA8E348u);
4242

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

IonBlastClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
class IonBlastClass
1212
{
1313
public:
14-
static DynamicVectorClass<IonBlastClass *>* const Array;
14+
static constexpr constant_ptr<DynamicVectorClass<IonBlastClass*>, 0xAA0118u> const Array{};
1515

1616
static void UpdateAll()
1717
{ JMP_STD(0x53D310); }

IsometricTileClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class NOVTABLE IsometricTileClass : public ObjectClass
1111
static const AbstractType AbsID = AbstractType::Isotile;
1212

1313
//Array
14-
static DynamicVectorClass<IsometricTileClass*>* const Array;
14+
static constexpr constant_ptr<DynamicVectorClass<IsometricTileClass*>, 0x87F750u> Array{};
1515

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

IsometricTileTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class NOVTABLE IsometricTileTypeClass : public ObjectTypeClass
88
static const AbstractType AbsID = AbstractType::IsotileType;
99

1010
//Array
11-
static DynamicVectorClass<IsometricTileTypeClass*>* const Array;
11+
static constexpr constant_ptr<DynamicVectorClass<IsometricTileTypeClass*>, 0xA8ED28u> const Array{};
1212

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

LineTrail.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include <GeneralDefinitions.h>
44

5+
#include <Helpers/CompileTime.h>
6+
57
struct LineTrailNode
68
{
79
CoordStruct Position;
@@ -11,7 +13,7 @@ struct LineTrailNode
1113
class LineTrail
1214
{
1315
public:
14-
static DynamicVectorClass<LineTrail*>* const Array;
16+
static constexpr constant_ptr<DynamicVectorClass<LineTrail*>, 0xABCB78u> const Array{};
1517

1618
//Constructor, Destructor
1719
LineTrail()

OverlayClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class NOVTABLE OverlayClass : public ObjectClass
4242
static const AbstractType AbsID = AbstractType::Overlay;
4343

4444
//Static
45-
static DynamicVectorClass<OverlayClass*>* const Array;
45+
static constexpr constant_ptr<DynamicVectorClass<OverlayClass*>, 0xA8EC50u> const Array{};
4646

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

OverlayTypeClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class NOVTABLE OverlayTypeClass : public ObjectTypeClass
1515
static const AbstractType AbsID = AbstractType::OverlayType;
1616

1717
//Array
18-
ABSTRACTTYPE_ARRAY(OverlayTypeClass);
18+
ABSTRACTTYPE_ARRAY(OverlayTypeClass, 0xA83D80u);
1919

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

ParasiteClass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class NOVTABLE ParasiteClass : public AbstractClass
1010
public:
1111
static const AbstractType AbsID = AbstractType::Parasite;
1212

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

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

0 commit comments

Comments
 (0)