From 58407c743845d2cc1aa5705f2d25cfa2b035651c Mon Sep 17 00:00:00 2001 From: janwas Date: Mon, 30 Jun 2008 17:31:09 +0000 Subject: [PATCH] workaround for invalidId issue (fixes windows build) class static const member apparently sometimes requires external linkage and enum causes conversion warnings, so go with file-scope constants. This was SVN commit r6161. --- source/graphics/Unit.cpp | 8 ++------ source/graphics/Unit.h | 9 ++++++++- source/graphics/UnitManager.cpp | 2 +- source/ps/Player.h | 3 ++- source/simulation/Entity.cpp | 2 +- .../atlas/GameInterface/Handlers/ObjectHandlers.cpp | 6 +++--- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/source/graphics/Unit.cpp b/source/graphics/Unit.cpp index 6d48538281..ba3cf13c00 100644 --- a/source/graphics/Unit.cpp +++ b/source/graphics/Unit.cpp @@ -13,15 +13,11 @@ #include "ps/Player.h" #include "simulation/Entity.h" -// Initialized in class declaration, but still needs a translation unit to -// define the storage location for it... for cases where the compiler can't (or -// doesn't) inline the constant value directly. -const size_t CUnit::invalidId; CUnit::CUnit(CObjectEntry* object, CEntity* entity, CObjectManager& objectManager, const std::set& actorSelections) : m_Object(object), m_Model(object->m_Model->Clone()), m_Entity(entity), -m_ID(invalidId), m_ActorSelections(actorSelections), m_PlayerID(CPlayer::invalidId), +m_ID(invalidUnitId), m_ActorSelections(actorSelections), m_PlayerID(invalidPlayerId), m_ObjectManager(objectManager) { m_Animation = new CUnitAnimation(*this); @@ -210,7 +206,7 @@ void CUnit::ReloadObject() // Copy the old instance-specific settings from the old model to the new instance newModel->SetTransform(m_Model->GetTransform()); - if (m_PlayerID != CPlayer::invalidId) + if (m_PlayerID != invalidPlayerId) newModel->SetPlayerID(m_PlayerID); newModel->CopyAnimationFrom(m_Model); diff --git a/source/graphics/Unit.h b/source/graphics/Unit.h index edf17a87d2..804b1ba7d8 100644 --- a/source/graphics/Unit.h +++ b/source/graphics/Unit.h @@ -12,6 +12,14 @@ class CEntity; class CSkeletonAnim; class CUnitAnimation; +// note: we can't declare as static const size_t invalidId = size_t(~0) in +// the class because it seems to be a grey area in the C++ standard whether +// or not the constant is propagated or needs an external definition. +// an enum causes conversion warnings in MSC, so we go with a file-scope +// constant. +const size_t invalidUnitId = ~size_t(0); + + ///////////////////////////////////////////////////////////////////////////////////////////// // CUnit: simple "actor" definition - defines a sole object within the world class CUnit : boost::noncopyable @@ -74,7 +82,6 @@ public: // Most units have a hopefully-unique ID number, so they can be referred to // persistently despite saving/loading maps. Default for new units is -1; should // usually be set to CUnitManager::GetNewID() after creation. - static const size_t invalidId = ~(size_t)0; size_t GetID() const { return m_ID; } void SetID(size_t id) { m_ID = id; } diff --git a/source/graphics/UnitManager.cpp b/source/graphics/UnitManager.cpp index 10e8d41491..309faff05b 100644 --- a/source/graphics/UnitManager.cpp +++ b/source/graphics/UnitManager.cpp @@ -138,7 +138,7 @@ CUnit* CUnitManager::CreateUnit(const CStr& actorName, CEntity* entity, const st // FindByID CUnit* CUnitManager::FindByID(size_t id) const { - if (id == CUnit::invalidId) + if (id == invalidUnitId) return NULL; for (size_t i = 0; i < m_Units.size(); ++i) diff --git a/source/ps/Player.h b/source/ps/Player.h index fc04c8bfa7..7c1651ca81 100644 --- a/source/ps/Player.h +++ b/source/ps/Player.h @@ -21,6 +21,8 @@ enum EDiplomaticStance DIPLOMACY_ALLIED }; +const size_t invalidPlayerId = ~size_t(0); // rationale: see Unit.h + class CPlayer : public CSynchedJSObject { public: @@ -46,7 +48,6 @@ public: bool ValidateCommand(CNetMessage *pMsg); - static const size_t invalidId = ~(size_t)0; inline size_t GetPlayerID() const { return m_PlayerID; } inline void SetPlayerID(size_t id) diff --git a/source/simulation/Entity.cpp b/source/simulation/Entity.cpp index 4de804c411..556ee042da 100644 --- a/source/simulation/Entity.cpp +++ b/source/simulation/Entity.cpp @@ -152,7 +152,7 @@ CEntity::~CEntity() void CEntity::LoadBase() { - size_t previous_unit_id = CUnit::invalidId; + size_t previous_unit_id = invalidUnitId; if( m_actor ) { diff --git a/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp b/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp index 166cc0d15c..1b479f8321 100644 --- a/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp +++ b/source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp @@ -241,7 +241,7 @@ END_COMMAND(SetObjectSettings); ////////////////////////////////////////////////////////////////////////// -static size_t g_PreviewUnitID = CUnit::invalidId; +static size_t g_PreviewUnitID = invalidUnitId; static CStrW g_PreviewUnitName; static bool g_PreviewUnitFloating; @@ -306,7 +306,7 @@ MESSAGEHANDLER(ObjectPreview) previewUnit = NULL; } - g_PreviewUnitID = CUnit::invalidId; + g_PreviewUnitID = invalidUnitId; bool isEntity; CStrW name; @@ -519,7 +519,7 @@ QUERYHANDLER(PickObject) if (target) msg->id = target->GetID(); else - msg->id = CUnit::invalidId; + msg->id = invalidUnitId; if (target) {