bool convert(const String &input, ULONGLONG &outResult, size_t size, bool ignoreWhiteSpace, size_t base) { ZS_THROW_INVALID_USAGE_IF((0 == size) || (size > sizeof(QWORD))) CSTR str = input; if (NULL == str) return false; if (ignoreWhiteSpace) skipSpace(str); bool hadSign = false; bool positive = isPositive(str, hadSign); if (!positive) return false; base = shouldForceBase(str, base, hadSign); ULONGLONG result = 0; BYTE digit = 0; while ((digit = gDigitToValue[*str]) < base) { ULONGLONG lastResult = result; result *= base; result += static_cast<ULONGLONG>(digit); if (result < lastResult) return false; // value had to flip ++str; } if (result > gMaxULongLongs[size-1]) return false; if (ignoreWhiteSpace) skipSpace(str); if (0 != *str) return false; outResult = result; return true; }
String convert(ULONGLONG value, size_t base) { ZS_THROW_INVALID_USAGE_IF((base < 2) || (base > (10+26))) boost::shared_array<char> buffer(new char[sizeof(ULONGLONG)*8+2]); memset(buffer.get(), 0, sizeof(char)*((sizeof(ULONGLONG)*8)+2)); STR end = (buffer.get() + (sizeof(ULONGLONG)*8)); STR dest = end; *dest = 0; while (value > 0) { --dest; *dest = gDigits[value % base]; value /= base; } if (dest == end) *dest = '0'; return String(dest); }
//----------------------------------------------------------------------- String convert(ULONGLONG value, size_t base) { ZS_THROW_INVALID_USAGE_IF((base < 2) || (base > (10+26))); char buffer[sizeof(ULONGLONG)*8+2]; char *startPos = &(buffer[0]); memset(startPos, 0, sizeof(buffer)); STR end = (startPos + (sizeof(ULONGLONG)*8)); STR dest = end; *dest = 0; while (value > 0) { --dest; *dest = gDigits[value % base]; value /= base; } if (dest == end) *dest = '0'; return String(dest); }
//----------------------------------------------------------------------- void setup(IClientDelegatePtr delegate) { AutoLock lock(mLock); ZS_THROW_INVALID_USAGE_IF(mClient) // already setup? mClient = Client::create(delegate); }