/* * Copyright (C) 2008-2016 TrinityCore * Copyright (C) 2005-2009 MaNGOS * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef TRINITYCORE_COMMON_H #define TRINITYCORE_COMMON_H #include "Define.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "Debugging/Errors.h" #include "Threading/LockedQueue.h" #if PLATFORM == PLATFORM_WINDOWS # include # if defined(__INTEL_COMPILER) # if !defined(BOOST_ASIO_HAS_MOVE) # define BOOST_ASIO_HAS_MOVE # endif // !defined(BOOST_ASIO_HAS_MOVE) # endif // if defined(__INTEL_COMPILER) #else # include # include # include # include # include # include #endif #if COMPILER == COMPILER_MICROSOFT #include #define snprintf _snprintf #define atoll _atoi64 #define vsnprintf _vsnprintf #define llabs _abs64 #else #define stricmp strcasecmp #define strnicmp strncasecmp #endif inline float finiteAlways(float f) { return std::isfinite(f) ? f : 0.0f; } inline unsigned long atoul(char const* str) { return strtoul(str, nullptr, 10); } inline unsigned long long atoull(char const* str) { return strtoull(str, nullptr, 10); } #define STRINGIZE(a) #a enum TimeConstants { MINUTE = 60, HOUR = MINUTE*60, DAY = HOUR*24, WEEK = DAY*7, MONTH = DAY*30, YEAR = MONTH*12, IN_MILLISECONDS = 1000 }; enum AccountTypes { SEC_PLAYER = 0, SEC_MODERATOR = 1, SEC_GAMEMASTER = 2, SEC_ADMINISTRATOR = 3, SEC_CONSOLE = 4 // must be always last in list, accounts must have less security level always also }; enum LocaleConstant { LOCALE_enUS = 0, LOCALE_koKR = 1, LOCALE_frFR = 2, LOCALE_deDE = 3, LOCALE_zhCN = 4, LOCALE_zhTW = 5, LOCALE_esES = 6, LOCALE_esMX = 7, LOCALE_ruRU = 8, LOCALE_none = 9, LOCALE_ptBR = 10, LOCALE_itIT = 11, TOTAL_LOCALES }; const uint8 OLD_TOTAL_LOCALES = 9; /// @todo convert in simple system #define DEFAULT_LOCALE LOCALE_enUS #define MAX_LOCALES 11 extern "C" TC_COMMON_API char const* localeNames[TOTAL_LOCALES]; TC_COMMON_API LocaleConstant GetLocaleByName(const std::string& name); typedef std::vector StringVector; #pragma pack(push, 1) struct TC_COMMON_API LocalizedString { char const* Str[TOTAL_LOCALES]; }; #pragma pack(pop) // we always use stdlibc++ std::max/std::min, undefine some not C++ standard defines (Win API and some other platforms) #ifdef max #undef max #endif #ifdef min #undef min #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #define MAX_QUERY_LEN 32*1024 //! Optional helper class to wrap optional values within. template using Optional = boost::optional; namespace Trinity { //! std::make_unique implementation (TODO: remove this once C++14 is supported) template std::unique_ptr make_unique(Args&& ...args) { return std::unique_ptr(new T(std::forward(args)...)); } } //! Hash implementation for std::pair to allow using pairs in unordered_set or as key for unordered_map //! Individual types used in pair must be hashable by boost::hash namespace std { template struct hash> { public: size_t operator()(std::pair const& key) const { return boost::hash_value(key); } }; } #endif