#ifndef BITCOIN_UTIL_H
#define BITCOIN_UTIL_H
-
-#include "uint256.h"
-
#ifndef WIN32
#include <sys/types.h>
#include <sys/time.h>
#include <map>
#include <vector>
#include <string>
+#include <chrono>
+#include <thread>
#ifndef Q_MOC_RUN
#include <boost/thread.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/path.hpp>
-#include <boost/date_time/gregorian/gregorian_types.hpp>
-#include <boost/date_time/posix_time/posix_time_types.hpp>
#endif
#include <stdarg.h>
#endif
#include <inttypes.h>
-#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;
#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) \
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__)
#define PRIpdd "td"
#endif
-// This is needed because the foreach macro can't get over the comma in pair<t1, t2>
-#define PAIRTYPE(t1, t2) std::pair<t1, t2>
-
// Align by increasing pointer, must have extra space at end of buffer
template <size_t nBytes, typename T>
T* alignup(T* p)
extern bool fCommandLine;
extern std::string strMiscWarning;
extern bool fTestNet;
-extern bool fNoListen;
extern bool fLogTimestamps;
extern bool fReopenDebugLog;
*/
#define printf OutputDebugStringF
-void LogException(std::exception* pex, const char* pszThread);
void PrintException(std::exception* pex, const char* pszThread);
void PrintExceptionContinue(std::exception* pex, const char* pszThread);
void ParseString(const std::string& str, char c, std::vector<std::string>& 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<unsigned char> ParseHex(const char* psz);
-std::vector<unsigned char> ParseHex(const std::string& str);
+std::vector<uint8_t> ParseHex(const char *str);
+inline std::vector<uint8_t> ParseHex(const std::string& str) { return ParseHex(str.c_str()); }
bool IsHex(const std::string& str);
std::vector<unsigned char> DecodeBase64(const char* p, bool* pfInvalid = NULL);
std::string DecodeBase64(const std::string& str);
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 GetAdjustedTime();
-int64_t GetTimeOffset();
+int64_t GetTimeMillis();
+int64_t GetTimeMicros();
+
std::string FormatFullVersion();
std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector<std::string>& comments);
-void AddTimeData(const CNetAddr& ip, int64_t nTime);
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)
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);
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::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
+}
+
+inline int64_t GetTimeMicros()
+{
+ return std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
}
std::string DateTimeStrFormat(const char* pszFormat, int64_t nTime);
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)
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")
return accumulator == 0;
}
-/** Median filter over a stream of values.
- * Returns the median of the last N numbers
- */
-template <typename T> class CMedianFilter
-{
-private:
- std::vector<T> vValues;
- std::vector<T> vSorted;
- unsigned int nSize;
-public:
- CMedianFilter(unsigned 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;
- }
- }
-
- int size() const
- {
- return vValues.size();
- }
-
- std::vector<T> sorted () const
- {
- return vSorted;
- }
-};
-
bool NewThread(void(*pfn)(void*), void* parg);
#ifdef WIN32