e81a11d Merge pull request #25 from daiyl0320/master 35c3b37 add retry mechanism to ConnectTracker and modify Listen backlog to 128 in rabit_traker.py c71ed6f try deply doxygen 62e5647 try deply doxygen 732f1c6 try 2fa6e02 ok 0537665 minor 7b59dcb minor 5934950 new doc f538187 ok 44b6049 new doc 387339b add more 9d4397a chg 2879a48 chg 30e3110 ok 9ff0301 add link translation 6b629c2 k 32e1955 ok 8f4839d fix 93137b2 ok 7eeeb79 reload recommonmark a8f00cc minor 19b0f01 ok dd01184 minor c1cdc19 minor fcf0f43 try rst cbc21ae try 62ddfa7 tiny aefc05c final change 2aee9b4 minor fe4e7c2 ok 8001983 change to subtitle 5ca33e4 ok 88f7d24 update guide 29d43ab add code fe8bb3b minor hack for readthedocs 229c71d Merge branch 'master' of ssh://github.com/dmlc/rabit 7424218 ok d1d45bb Update README.md 1e8813f Update README.md 1ccc990 Update README.md 0323e06 remove readme 679a835 remove theme 7ea5b7c remove numpydoc to napoleon b73e2be Merge branch 'master' of ssh://github.com/dmlc/rabit 1742283 ok 1838e25 Update python-requirements.txt bc4e957 ok fba6fc2 ok 0251101 ok d50b905 ok d4f2509 ok cdf401a ok fef0ef2 new doc cef360d ok c125d2a ok 270a49e add requirments 744f901 get the basic doc 1cb5cad Merge branch 'master' of ssh://github.com/dmlc/rabit 8cc07ba minor d74f126 Update .travis.yml 52b3dcd Update .travis.yml 099581b Update .travis.yml 1258046 Update .travis.yml 7addac9 Update Makefile 0ea7adf Update .travis.yml f858856 Update travis_script.sh d8eac4a Update README.md 3cc49ad lint and travis ceedf4e fix fd8920c fix win32 8bbed35 modify 9520b90 Merge pull request #14 from dmlc/hjk41 df14bb1 fix type f441dc7 replace tab with blankspace 2467942 remove unnecessary include 181ef47 defined long long and ulonglong 1582180 use int32_t to define int and int64_t to define long. in VC long is 32bit e0b7da0 fix git-subtree-dir: subtree/rabit git-subtree-split: e81a11dd7ee3cff87a38a42901315821df018bae
192 lines
4.8 KiB
C++
192 lines
4.8 KiB
C++
/*!
|
|
* Copyright (c) 2014 by Contributors
|
|
* \file utils.h
|
|
* \brief simple utils to support the code
|
|
* \author Tianqi Chen
|
|
*/
|
|
#ifndef RABIT_UTILS_H_
|
|
#define RABIT_UTILS_H_
|
|
#define _CRT_SECURE_NO_WARNINGS
|
|
#include <cstdio>
|
|
#include <string>
|
|
#include <cstdlib>
|
|
#include <vector>
|
|
|
|
#ifndef RABIT_STRICT_CXX98_
|
|
#include <cstdarg>
|
|
#endif
|
|
|
|
#if !defined(__GNUC__)
|
|
#define fopen64 std::fopen
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
// NOTE: sprintf_s is not equivalent to snprintf,
|
|
// they are equivalent when success, which is sufficient for our case
|
|
#define snprintf sprintf_s
|
|
#define vsnprintf vsprintf_s
|
|
#else
|
|
#ifdef _FILE_OFFSET_BITS
|
|
#if _FILE_OFFSET_BITS == 32
|
|
#pragma message("Warning: FILE OFFSET BITS defined to be 32 bit")
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef __APPLE__
|
|
#define off64_t off_t
|
|
#define fopen64 std::fopen
|
|
#endif
|
|
|
|
extern "C" {
|
|
#include <sys/types.h>
|
|
}
|
|
#endif
|
|
|
|
#ifdef _MSC_VER
|
|
typedef unsigned char uint8_t;
|
|
typedef unsigned __int16 uint16_t;
|
|
typedef unsigned __int32 uint32_t;
|
|
typedef unsigned __int64 uint64_t;
|
|
typedef __int64 int64_t;
|
|
#else
|
|
#include <inttypes.h>
|
|
#endif
|
|
|
|
namespace rabit {
|
|
/*! \brief namespace for helper utils of the project */
|
|
namespace utils {
|
|
|
|
/*! \brief error message buffer length */
|
|
const int kPrintBuffer = 1 << 12;
|
|
|
|
#ifndef RABIT_CUSTOMIZE_MSG_
|
|
/*!
|
|
* \brief handling of Assert error, caused by inappropriate input
|
|
* \param msg error message
|
|
*/
|
|
inline void HandleAssertError(const char *msg) {
|
|
fprintf(stderr, "AssertError:%s\n", msg);
|
|
exit(-1);
|
|
}
|
|
/*!
|
|
* \brief handling of Check error, caused by inappropriate input
|
|
* \param msg error message
|
|
*/
|
|
inline void HandleCheckError(const char *msg) {
|
|
fprintf(stderr, "%s\n", msg);
|
|
exit(-1);
|
|
}
|
|
inline void HandlePrint(const char *msg) {
|
|
printf("%s", msg);
|
|
}
|
|
inline void HandleLogPrint(const char *msg) {
|
|
fprintf(stderr, "%s", msg);
|
|
fflush(stderr);
|
|
}
|
|
#else
|
|
#ifndef RABIT_STRICT_CXX98_
|
|
// include declarations, some one must implement this
|
|
void HandleAssertError(const char *msg);
|
|
void HandleCheckError(const char *msg);
|
|
void HandlePrint(const char *msg);
|
|
#endif
|
|
#endif
|
|
#ifdef RABIT_STRICT_CXX98_
|
|
// these function pointers are to be assigned
|
|
extern "C" void (*Printf)(const char *fmt, ...);
|
|
extern "C" int (*SPrintf)(char *buf, size_t size, const char *fmt, ...);
|
|
extern "C" void (*Assert)(int exp, const char *fmt, ...);
|
|
extern "C" void (*Check)(int exp, const char *fmt, ...);
|
|
extern "C" void (*Error)(const char *fmt, ...);
|
|
#else
|
|
/*! \brief printf, prints messages to the console */
|
|
inline void Printf(const char *fmt, ...) {
|
|
std::string msg(kPrintBuffer, '\0');
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsnprintf(&msg[0], kPrintBuffer, fmt, args);
|
|
va_end(args);
|
|
HandlePrint(msg.c_str());
|
|
}
|
|
/*! \brief portable version of snprintf */
|
|
inline int SPrintf(char *buf, size_t size, const char *fmt, ...) {
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
int ret = vsnprintf(buf, size, fmt, args);
|
|
va_end(args);
|
|
return ret;
|
|
}
|
|
|
|
/*! \brief assert a condition is true, use this to handle debug information */
|
|
inline void Assert(bool exp, const char *fmt, ...) {
|
|
if (!exp) {
|
|
std::string msg(kPrintBuffer, '\0');
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsnprintf(&msg[0], kPrintBuffer, fmt, args);
|
|
va_end(args);
|
|
HandleAssertError(msg.c_str());
|
|
}
|
|
}
|
|
|
|
/*!\brief same as assert, but this is intended to be used as a message for users */
|
|
inline void Check(bool exp, const char *fmt, ...) {
|
|
if (!exp) {
|
|
std::string msg(kPrintBuffer, '\0');
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsnprintf(&msg[0], kPrintBuffer, fmt, args);
|
|
va_end(args);
|
|
HandleCheckError(msg.c_str());
|
|
}
|
|
}
|
|
|
|
/*! \brief report error message, same as check */
|
|
inline void Error(const char *fmt, ...) {
|
|
{
|
|
std::string msg(kPrintBuffer, '\0');
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
vsnprintf(&msg[0], kPrintBuffer, fmt, args);
|
|
va_end(args);
|
|
HandleCheckError(msg.c_str());
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/*! \brief replace fopen, report error when the file open fails */
|
|
inline std::FILE *FopenCheck(const char *fname, const char *flag) {
|
|
std::FILE *fp = fopen64(fname, flag);
|
|
Check(fp != NULL, "can not open file \"%s\"\n", fname);
|
|
return fp;
|
|
}
|
|
} // namespace utils
|
|
// easy utils that can be directly accessed in xgboost
|
|
/*! \brief get the beginning address of a vector */
|
|
template<typename T>
|
|
inline T *BeginPtr(std::vector<T> &vec) { // NOLINT(*)
|
|
if (vec.size() == 0) {
|
|
return NULL;
|
|
} else {
|
|
return &vec[0];
|
|
}
|
|
}
|
|
/*! \brief get the beginning address of a vector */
|
|
template<typename T>
|
|
inline const T *BeginPtr(const std::vector<T> &vec) { // NOLINT(*)
|
|
if (vec.size() == 0) {
|
|
return NULL;
|
|
} else {
|
|
return &vec[0];
|
|
}
|
|
}
|
|
inline char* BeginPtr(std::string &str) { // NOLINT(*)
|
|
if (str.length() == 0) return NULL;
|
|
return &str[0];
|
|
}
|
|
inline const char* BeginPtr(const std::string &str) {
|
|
if (str.length() == 0) return NULL;
|
|
return &str[0];
|
|
}
|
|
} // namespace rabit
|
|
#endif // RABIT_UTILS_H_
|