ATDecimalOrDerived::Ptr ItemFactoryImpl::createNonNegativeInteger(const MAPM value, const DynamicContext* context) { if(value.is_integer() && value.sign() >= 0) { return new ATDecimalOrDerivedImpl(SchemaSymbols::fgURI_SCHEMAFORSCHEMA, SchemaSymbols::fgDT_NONNEGATIVEINTEGER, value, context); } return createDecimalOrDerived( SchemaSymbols::fgURI_SCHEMAFORSCHEMA, SchemaSymbols::fgDT_NONNEGATIVEINTEGER, value, context); }
ATFloatOrDerivedImpl:: ATFloatOrDerivedImpl(const XMLCh* typeURI, const XMLCh* typeName, const MAPM value, const StaticContext* context): ATFloatOrDerived(), _typeName(typeName), _typeURI(typeURI) { _float = value; _state = NUM; if (value.sign() < 0) _state = NEG_NUM; checkFloatLimits(_state, _float); }
MAPM DateUtils::convertDMY2Absolute(MAPM day, MAPM month, MAPM year) { MAPM prevYear = year - 1; if(year.sign() < 0) ++prevYear; MAPM absolute = ( prevYear * 365 ) + prevYear.integer_divide(4) - prevYear.integer_divide(100) + prevYear.integer_divide(400); if(isLeapYear(year)) absolute+=days_before_month_leap[asInt(month)-1]; else absolute+=days_before_month[asInt(month)-1]; absolute+= day; return absolute - 1; }
void DateUtils::formatNumber(const MAPM &value, int minDigits, XMLBuffer &buffer) { char obuf[1024]; value.toIntegerString(obuf); char *str = obuf; if(value.sign() < 0) { ++str; buffer.append(chDash); } size_t length = strlen(str); for(int i = (int)length; i < minDigits; ++i) { buffer.append(chDigit_0); } buffer.append(X(str)); }
void DateUtils::convertAbsolute2DMY(MAPM absolute, MAPM& day, MAPM& month, MAPM& year) { absolute += 1; bool bc = absolute.sign() <= 0; bool fix = false; MAPM div, rem; absolute.integer_div_rem(days_in_400_years, div, rem); year = div * 400; absolute = rem; absolute.integer_div_rem(days_in_100_years, div, rem); if(div <= -4) fix = true; if(div >= 4) { div -= 1; rem += days_in_100_years; } year += div * 100; absolute = rem; absolute.integer_div_rem(days_in_4_years, div, rem); year += div * 4; absolute = rem; absolute.integer_div_rem(days_in_1_years, div, rem); if(div <= -4) fix = true; if(div >= 4) { div -= 1; rem += days_in_1_years; } year += div; absolute = rem; if(bc) { if(fix && absolute.sign() == 0) { // Correct off by one error in year calculations // due to negative leap years absolute += 1; } else { --year; absolute += daysInYear(year); } } else { if(absolute.sign() != 0) { ++year; } } month = 12; day = 31; int *days = isLeapYear(year) ? days_before_month_leap : days_before_month; for(int i = 11; i >= 0; --i) { if(absolute > days[i]) { month = i + 1; day = absolute - days[i]; break; } } }
typename IntegerImpl<T>::value_type IntegerImpl<T>::ftoi( MAPM const &d ) { MAPM const temp( d.sign() >= 0 ? d.floor() : d.ceil() ); unique_ptr<char[]> const buf( new char[ temp.exponent() + 3 ] ); temp.toIntegerString( buf.get() ); return ztd::aton<value_type>( buf.get() ); }