X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Futil.h;h=d787141b0f26556ccd30dfe54023639a38da9091;hb=6b7a89c10d2488e4600592e40db0a2fbb62115b2;hp=167dd0b571581fdb564cff5fd4bc7f951121dddc;hpb=b3190037d970f1bedf6e9e5748cebdfe1fc84cd3;p=novacoin.git diff --git a/src/util.h b/src/util.h index 167dd0b..d787141 100644 --- a/src/util.h +++ b/src/util.h @@ -1,11 +1,11 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UTIL_H #define BITCOIN_UTIL_H -#include + #include "uint256.h" #ifndef WIN32 @@ -17,19 +17,27 @@ #include #include #include +#include +#include #ifndef Q_MOC_RUN #include #include #include -#include -#include #endif #include +#if defined(__USE_MINGW_ANSI_STDIO) +#undef __USE_MINGW_ANSI_STDIO // This constant forces MinGW to conduct stupid behavior +#endif +#include + #include "netbase.h" // for AddTimeData +static const int32_t nOneHour = 60 * 60; +static const int32_t nOneDay = 24 * 60 * 60; +static const int64_t nOneWeek = 7 * 24 * 60 * 60; static const int64_t COIN = 1000000; static const int64_t CENT = 10000; @@ -38,12 +46,6 @@ static const int64_t CENT = 10000; #define END(a) ((char*)&((&(a))[1])) #define UBEGIN(a) ((unsigned char*)&(a)) #define UEND(a) ((unsigned char*)&((&(a))[1])) -#define ARRAYLEN(array) (sizeof(array)/sizeof((array)[0])) - -#define UVOIDBEGIN(a) ((void*)&(a)) -#define CVOIDBEGIN(a) ((const void*)&(a)) -#define UINTBEGIN(a) ((uint32_t*)&(a)) -#define CUINTBEGIN(a) ((const uint32_t*)&(a)) #ifndef THROW_WITH_STACKTRACE #define THROW_WITH_STACKTRACE(exception) \ @@ -54,6 +56,18 @@ static const int64_t CENT = 10000; void LogStackTrace(); #endif +#if defined(_MSC_VER) || defined(__MSVCRT__) + /* Silence compiler warnings on Windows + related to MinGWs inttypes.h */ + #undef PRIu64 + #undef PRId64 + #undef PRIx64 + + #define PRIu64 "I64u" + #define PRId64 "I64d" + #define PRIx64 "I64x" + +#endif /* Format characters for (s)size_t and ptrdiff_t */ #if defined(_MSC_VER) || defined(__MSVCRT__) @@ -75,9 +89,6 @@ void LogStackTrace(); #define PRIpdd "td" #endif -// This is needed because the foreach macro can't get over the comma in pair -#define PAIRTYPE(t1, t2) std::pair - // Align by increasing pointer, must have extra space at end of buffer template T* alignup(T* p) @@ -104,9 +115,7 @@ T* alignup(T* p) #define MAX_PATH 1024 inline void Sleep(int64_t n) { - /*Boost has a year 2038 problem— if the request sleep time is past epoch+2^31 seconds the sleep returns instantly. - So we clamp our sleeps here to 10 years and hope that boost is fixed by 2028.*/ - boost::thread::sleep(boost::get_system_time() + boost::posix_time::milliseconds(n>315576000000LL?315576000000LL:n)); + this_thread::sleep_for(std::chrono::milliseconds(n)); } #endif @@ -181,8 +190,8 @@ void ParseString(const std::string& str, char c, std::vector& v); std::string FormatMoney(int64_t n, bool fPlus=false); bool ParseMoney(const std::string& str, int64_t& nRet); bool ParseMoney(const char* pszIn, int64_t& nRet); -std::vector ParseHex(const char* psz); -std::vector ParseHex(const std::string& str); +std::vector ParseHex(const char *str); +inline std::vector ParseHex(const std::string& str) { return ParseHex(str.c_str()); } bool IsHex(const std::string& str); std::vector DecodeBase64(const char* p, bool* pfInvalid = NULL); std::string DecodeBase64(const std::string& str); @@ -217,10 +226,14 @@ void ShrinkDebugFile(); int GetRandInt(int nMax); uint64_t GetRand(uint64_t nMax); uint256 GetRandHash(); +void FillRand(uint8_t *buffer, size_t nCount); int64_t GetTime(); -void SetMockTime(int64_t nMockTimeIn); +int64_t GetTimeMillis(); +int64_t GetTimeMicros(); + int64_t GetAdjustedTime(); int64_t GetTimeOffset(); +int64_t GetNodesOffset(); std::string FormatFullVersion(); std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments); void AddTimeData(const CNetAddr& ip, int64_t nTime); @@ -230,36 +243,39 @@ void runCommand(std::string strCommand); +inline std::string i64tostr(int64_t n) +{ + return strprintf("%" PRId64, n); +} +inline int64_t strtoll(const char* psz) +{ + return strtoll(psz, NULL, 10); +} +inline int64_t strtoll(const std::string& str) +{ + return strtoll(str.c_str(), NULL, 10); +} - -inline std::string i64tostr(int64_t n) +inline int32_t strtol(const char* psz) { - return strprintf("%" PRId64, n); + return strtol(psz, NULL, 10); } -inline std::string itostr(int n) +inline int32_t strtol(const std::string& str) { - return strprintf("%d", n); + return strtol(str.c_str(), NULL, 10); } -inline int64_t atoi64(const char* psz) +inline uint32_t strtoul(const char* psz) { -#ifdef _MSC_VER - return _atoi64(psz); -#else - return strtoll(psz, NULL, 10); -#endif + return strtoul(psz, NULL, 10); } -inline int64_t atoi64(const std::string& str) +inline uint32_t strtoul(const std::string& str) { -#ifdef _MSC_VER - return _atoi64(str.c_str()); -#else - return strtoll(str.c_str(), NULL, 10); -#endif + return strtoul(str.c_str(), NULL, 10); } inline int atoi(const std::string& str) @@ -277,11 +293,6 @@ inline int64_t roundint64(double d) return (int64_t)(d > 0 ? d + 0.5 : d - 0.5); } -inline int64_t abs64(int64_t n) -{ - return (n >= 0 ? n : -n); -} - inline std::string leftTrim(std::string src, char chr) { std::string::size_type pos = src.find_first_not_of(chr, 0); @@ -342,19 +353,16 @@ inline int64_t GetPerformanceCounter() inline int64_t GetTimeMillis() { - return (boost::posix_time::ptime(boost::posix_time::microsec_clock::universal_time()) - - boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds(); + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } -inline std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime) +inline int64_t GetTimeMicros() { - time_t n = nTime; - struct tm* ptmTime = gmtime(&n); - char pszTime[200]; - strftime(pszTime, sizeof(pszTime), pszFormat, ptmTime); - return pszTime; + return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); } +std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime); + static const std::string strTimestampFormat = "%Y-%m-%d %H:%M:%S UTC"; inline std::string DateTimeStrFormat(int64_t nTime) { @@ -388,7 +396,7 @@ inline bool IsSwitchChar(char c) std::string GetArg(const std::string& strArg, const std::string& strDefault); /** - * Return integer argument or default value + * Return 64-bit integer argument or default value * * @param strArg Argument to get (e.g. "-foo") * @param default (e.g. 1) @@ -397,6 +405,24 @@ std::string GetArg(const std::string& strArg, const std::string& strDefault); int64_t GetArg(const std::string& strArg, int64_t nDefault); /** + * Return 32-bit integer argument or default value + * + * @param strArg Argument to get (e.g. "-foo") + * @param default (e.g. 1) + * @return command-line argument (0 if invalid number) or default value + */ +int32_t GetArgInt(const std::string& strArg, int32_t nDefault); + +/** + * Return 32-bit unsigned integer argument or default value + * + * @param strArg Argument to get (e.g. "-foo") + * @param default (e.g. 1) + * @return command-line argument (0 if invalid number) or default value + */ +uint32_t GetArgUInt(const std::string& strArg, uint32_t nDefault); + +/** * Return boolean argument or default value * * @param strArg Argument to get (e.g. "-foo") @@ -471,7 +497,7 @@ public: T median() const { - int size = vSorted.size(); + size_t size = vSorted.size(); assert(size>0); if(size & 1) // Odd number of elements { @@ -485,7 +511,7 @@ public: int size() const { - return vValues.size(); + return static_cast(vValues.size()); } std::vector sorted () const