X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Futil.h;h=467b4178aa1d87dca9b7c0443f1c0235cc038493;hb=17382b40fae13629d0a7c77806bd9e73972f061d;hp=3d7ef108b478ee250c09447889b6b6b32b1508be;hpb=82dc6426b4cbf769ace7976c2a40d160b8d76f08;p=novacoin.git diff --git a/src/util.h b/src/util.h index 3d7ef10..467b417 100644 --- a/src/util.h +++ b/src/util.h @@ -1,5 +1,6 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2011 The Bitcoin developers +// Copyright (c) 2012 The PPCoin developers // Distributed under the MIT/X11 software license, see the accompanying // file license.txt or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UTIL_H @@ -7,7 +8,7 @@ #include "uint256.h" -#ifndef __WXMSW__ +#ifndef WIN32 #include #include #include @@ -65,7 +66,7 @@ typedef unsigned long long uint64; #endif // This is needed because the foreach macro can't get over the comma in pair -#define PAIRTYPE(t1, t2) pair +#define PAIRTYPE(t1, t2) std::pair // Align by increasing pointer, must have extra space at end of buffer template @@ -81,7 +82,7 @@ T* alignup(T* p) return u.ptr; } -#ifdef __WXMSW__ +#ifdef WIN32 #define MSG_NOSIGNAL 0 #define MSG_DONTWAIT 0 #ifndef UINT64_MAX @@ -123,7 +124,7 @@ inline int myclosesocket(SOCKET& hSocket) { if (hSocket == INVALID_SOCKET) return WSAENOTSOCK; -#ifdef __WXMSW__ +#ifdef WIN32 int ret = closesocket(hSocket); #else int ret = close(hSocket); @@ -132,17 +133,21 @@ inline int myclosesocket(SOCKET& hSocket) return ret; } #define closesocket(s) myclosesocket(s) - -#ifndef GUI +#if !defined(QT_GUI) inline const char* _(const char* psz) { return psz; } #endif - - - +#ifndef THROW_WITH_STACKTRACE +#define THROW_WITH_STACKTRACE(exception) \ +{ \ + LogStackTrace(); \ + throw (exception); \ +} +void LogStackTrace(); +#endif @@ -169,8 +174,8 @@ void RandAddSeed(); void RandAddSeedPerfmon(); int OutputDebugStringF(const char* pszFormat, ...); int my_snprintf(char* buffer, size_t limit, const char* format, ...); -std::string strprintf(const char* format, ...); -bool error(const char* format, ...); +std::string strprintf(const std::string &format, ...); +bool error(const std::string &format, ...); void LogException(std::exception* pex, const char* pszThread); void PrintException(std::exception* pex, const char* pszThread); void PrintExceptionContinue(std::exception* pex, const char* pszThread); @@ -180,6 +185,10 @@ bool ParseMoney(const std::string& str, int64& nRet); bool ParseMoney(const char* pszIn, int64& nRet); std::vector ParseHex(const char* psz); std::vector ParseHex(const std::string& str); +std::vector DecodeBase64(const char* p, bool* pfInvalid = NULL); +std::string DecodeBase64(const std::string& str); +std::string EncodeBase64(const unsigned char* pch, size_t len); +std::string EncodeBase64(const std::string& str); void ParseParameters(int argc, char* argv[]); const char* wxGetTranslation(const char* psz); bool WildcardMatch(const char* psz, const char* mask); @@ -190,7 +199,7 @@ std::string GetConfigFile(); std::string GetPidFile(); void CreatePidFile(std::string pidFile, pid_t pid); void ReadConfigFile(std::map& mapSettingsRet, std::map >& mapMultiSettingsRet); -#ifdef __WXMSW__ +#ifdef WIN32 std::string MyGetSpecialFolderPath(int nFolder, bool fCreate); #endif std::string GetDefaultDataDir(); @@ -199,6 +208,7 @@ void ShrinkDebugFile(); int GetRandInt(int nMax); uint64 GetRand(uint64 nMax); int64 GetTime(); +void SetMockTime(int64 nMockTimeIn); int64 GetAdjustedTime(); void AddTimeData(unsigned int ip, int64 nTime); std::string FormatFullVersion(); @@ -240,19 +250,20 @@ public: pcs = &csIn; pcs->Enter(pszName, pszFile, nLine); } + + operator bool() const + { + return true; + } + ~CCriticalBlock() { pcs->Leave(); } }; -// WARNING: This will catch continue and break! -// break is caught with an assertion, but there's no way to detect continue. -// I'd rather be careful than suffer the other more error prone syntax. -// The compiler will optimise away all this loop junk. #define CRITICAL_BLOCK(cs) \ - for (bool fcriticalblockonce=true; fcriticalblockonce; assert(("break caught by CRITICAL_BLOCK!" && !fcriticalblockonce)), fcriticalblockonce=false) \ - for (CCriticalBlock criticalblock(cs, #cs, __FILE__, __LINE__); fcriticalblockonce; fcriticalblockonce=false) + if (CCriticalBlock criticalblock = CCriticalBlock(cs, #cs, __FILE__, __LINE__)) class CTryCriticalBlock { @@ -264,6 +275,12 @@ public: { pcs = (csIn.TryEnter(pszName, pszFile, nLine) ? &csIn : NULL); } + + operator bool() const + { + return Entered(); + } + ~CTryCriticalBlock() { if (pcs) @@ -271,18 +288,21 @@ public: pcs->Leave(); } } - bool Entered() { return pcs != NULL; } + bool Entered() const { return pcs != NULL; } }; #define TRY_CRITICAL_BLOCK(cs) \ - for (bool fcriticalblockonce=true; fcriticalblockonce; assert(("break caught by TRY_CRITICAL_BLOCK!" && !fcriticalblockonce)), fcriticalblockonce=false) \ - for (CTryCriticalBlock criticalblock(cs, #cs, __FILE__, __LINE__); fcriticalblockonce && (fcriticalblockonce = criticalblock.Entered()); fcriticalblockonce=false) + if (CTryCriticalBlock criticalblock = CTryCriticalBlock(cs, #cs, __FILE__, __LINE__)) +// This is exactly like std::string, but with a custom allocator. +// (secure_allocator<> is defined in serialize.h) +typedef std::basic_string, secure_allocator > SecureString; + @@ -387,7 +407,7 @@ inline void PrintHex(const std::vector& vch, const char* pszForma inline int64 GetPerformanceCounter() { int64 nCounter = 0; -#ifdef __WXMSW__ +#ifdef WIN32 QueryPerformanceCounter((LARGE_INTEGER*)&nCounter); #else timeval t; @@ -421,7 +441,7 @@ void skipspaces(T& it) inline bool IsSwitchChar(char c) { -#ifdef __WXMSW__ +#ifdef WIN32 return c == '-' || c == '/'; #else return c == '-'; @@ -464,7 +484,7 @@ inline bool GetBoolArg(const std::string& strArg) inline void heapchk() { -#ifdef __WXMSW__ +#ifdef WIN32 /// for debugging //if (_heapchk() != _HEAPOK) // DebugBreak(); @@ -567,6 +587,51 @@ inline uint160 Hash160(const std::vector& vch) } +// Median filter over a stream of values +// Returns the median of the last N numbers +template class CMedianFilter +{ +private: + std::vector vValues; + std::vector vSorted; + int nSize; +public: + CMedianFilter(int size, T initial_value): + nSize(size) + { + vValues.reserve(size); + vValues.push_back(initial_value); + vSorted = vValues; + } + + void input(T value) + { + if(vValues.size() == nSize) + { + vValues.erase(vValues.begin()); + } + vValues.push_back(value); + + vSorted.resize(vValues.size()); + std::copy(vValues.begin(), vValues.end(), vSorted.begin()); + std::sort(vSorted.begin(), vSorted.end()); + } + + T median() const + { + int size = vSorted.size(); + assert(size>0); + if(size & 1) // Odd number of elements + { + return vSorted[size/2]; + } + else // Even number of elements + { + return (vSorted[size/2-1] + vSorted[size/2]) / 2; + } + } +}; + @@ -578,7 +643,7 @@ inline uint160 Hash160(const std::vector& vch) // Note: It turns out we might have been able to use boost::thread // by using TerminateThread(boost::thread.native_handle(), 0); -#ifdef __WXMSW__ +#ifdef WIN32 typedef HANDLE pthread_t; inline pthread_t CreateThread(void(*pfn)(void*), void* parg, bool fWantHandle=false) @@ -660,10 +725,10 @@ inline void ExitThread(size_t nExitCode) inline bool AffinityBugWorkaround(void(*pfn)(void*)) { -#ifdef __WXMSW__ +#ifdef WIN32 // Sometimes after a few hours affinity gets stuck on one processor - DWORD dwProcessAffinityMask = -1; - DWORD dwSystemAffinityMask = -1; + DWORD_PTR dwProcessAffinityMask = -1; + DWORD_PTR dwSystemAffinityMask = -1; GetProcessAffinityMask(GetCurrentProcess(), &dwProcessAffinityMask, &dwSystemAffinityMask); DWORD dwPrev1 = SetThreadAffinityMask(GetCurrentThread(), dwProcessAffinityMask); DWORD dwPrev2 = SetThreadAffinityMask(GetCurrentThread(), dwProcessAffinityMask); @@ -678,4 +743,10 @@ inline bool AffinityBugWorkaround(void(*pfn)(void*)) return false; } +inline uint32_t ByteReverse(uint32_t value) +{ + value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8); + return (value<<16) | (value>>16); +} + #endif