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
This commit is contained in:
Naios
2016-03-22 03:06:07 +01:00
parent 428908b8db
commit cd777f97a1
2 changed files with 30 additions and 16 deletions

View File

@@ -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)
{

View File

@@ -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);