aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaios <naios-dev@live.de>2016-03-22 03:06:07 +0100
committerNaios <naios-dev@live.de>2016-03-24 02:33:04 +0100
commitcd777f97a182c582221bf5194e4075d92c532679 (patch)
tree55886ac7ed071235a01cc24473bce9b7ba9a2958
parent428908b8dbeee69f43e23a086f29d99bbdf05563 (diff)
Core/Game: Fix the clang build when building shared libraries
* Hackfix to solve an unresolved issue in clang that the visibility flag is ignored in some explicit template specializations. * See https://llvm.org/bugs/show_bug.cgi?id=24815 * See https://llvm.org/bugs/show_bug.cgi?id=23667
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp18
-rw-r--r--src/server/game/Achievements/AchievementMgr.h28
2 files changed, 30 insertions, 16 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index f1801100b25..219745e0444 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -488,13 +488,7 @@ void AchievementMgr<Guild>::ResetAchievementCriteria(AchievementCriteriaTypes /*
// Not needed
}
-template<class T>
-void AchievementMgr<T>::DeleteFromDB(ObjectGuid /*guid*/)
-{
-}
-
-template<>
-void AchievementMgr<Player>::DeleteFromDB(ObjectGuid guid)
+void DeletePlayerAchievementsFromDB(ObjectGuid guid)
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
@@ -509,8 +503,7 @@ void AchievementMgr<Player>::DeleteFromDB(ObjectGuid guid)
CharacterDatabase.CommitTransaction(trans);
}
-template<>
-void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid guid)
+void DeleteGuildAchievementsFromDB(ObjectGuid guid)
{
SQLTransaction trans = CharacterDatabase.BeginTransaction();
@@ -525,16 +518,11 @@ void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid guid)
CharacterDatabase.CommitTransaction(trans);
}
-template TRINITY_GAME_API
-void AchievementMgr<Player>::DeleteFromDB(ObjectGuid /*guid*/);
-
-template TRINITY_GAME_API
-void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid /*guid*/);
-
template<class T>
void AchievementMgr<T>::SaveToDB(SQLTransaction& /*trans*/)
{
}
+
template<>
void AchievementMgr<Player>::SaveToDB(SQLTransaction& trans)
{
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 2d4aef490c4..678aa0bcc93 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -284,15 +284,41 @@ enum ProgressType
PROGRESS_HIGHEST
};
+// Hackfix to solve an unresolved issue in clang that the visibility
+// flag is ignored in some explicit template specializations,
+// which prevents clang from exporting the `DeleteFromDB` symbol.
+// https://llvm.org/bugs/show_bug.cgi?id=24815
+// https://llvm.org/bugs/show_bug.cgi?id=23667
+TC_GAME_API void DeletePlayerAchievementsFromDB(ObjectGuid guid);
+TC_GAME_API void DeleteGuildAchievementsFromDB(ObjectGuid guid);
+
+template<typename T>
+struct AchievementMgrDeleterBase;
+
+template<>
+struct AchievementMgrDeleterBase<Player>
+{
+ static void DeleteFromDB(ObjectGuid lowguid) { DeletePlayerAchievementsFromDB(lowguid); }
+};
+
+template<>
+struct AchievementMgrDeleterBase<Guild>
+{
+ static void DeleteFromDB(ObjectGuid lowguid) { DeleteGuildAchievementsFromDB(lowguid); }
+};
+
template<class T>
class TC_GAME_API AchievementMgr
+ : public AchievementMgrDeleterBase<T>
{
public:
AchievementMgr(T* owner);
~AchievementMgr();
void Reset();
- static void DeleteFromDB(ObjectGuid lowguid);
+
+ using AchievementMgrDeleterBase<T>::DeleteFromDB;
+
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
void SaveToDB(SQLTransaction& trans);
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);