UBool Calendar::isEquivalentTo(const Calendar& other) const { return getDynamicClassID() == other.getDynamicClassID() && fLenient == other.fLenient && fFirstDayOfWeek == other.fFirstDayOfWeek && fMinimalDaysInFirstWeek == other.fMinimalDaysInFirstWeek && *fZone == *other.fZone; }
Calendar* Calendar::createInstance(TimeZone* zone, const Locale& aLocale, UErrorCode& success) { UObject* u = getService()->get(aLocale, LocaleKey::KIND_ANY, success); Calendar* c = NULL; if(U_FAILURE(success) || !u) { delete zone; if(U_SUCCESS(success)) { // Propagate some kind of err success = U_INTERNAL_PROGRAM_ERROR; } return NULL; } if(u->getDynamicClassID() == UnicodeString::getStaticClassID()) { // It's a unicode string telling us what type of calendar to load ("gregorian", etc) char tmp[200]; const UnicodeString& str = *(UnicodeString*)u; // Extract a char* out of it.. int32_t len = str.length(); if(len > sizeof(tmp)-1) { len = sizeof(tmp)-1; } str.extract(0,len,tmp); tmp[len]=0; #ifdef U_DEBUG_CALSVC // fprintf(stderr, "createInstance(%s) told to look at %s..\n", (const char*)aLocale.getName(), tmp); #endif // Create a Locale over this string Locale l(tmp); delete u; u = NULL; c = (Calendar*)getService()->get(l, LocaleKey::KIND_ANY, success); if(U_FAILURE(success) || !c) { delete zone; if(U_SUCCESS(success)) { success = U_INTERNAL_PROGRAM_ERROR; // Propagate some err } return NULL; } if(c->getDynamicClassID() == UnicodeString::getStaticClassID()) { // recursed! Second lookup returned a UnicodeString. // Perhaps DefaultCalendar{} was set to another locale. success = U_MISSING_RESOURCE_ERROR; // requested a calendar type which could NOT be found. delete c; delete zone; return NULL; } #ifdef U_DEBUG_CALSVC fprintf(stderr, "setting to locale %s\n", (const char*)aLocale.getName()); #endif c->setWeekCountData(aLocale, success); // set the correct locale (this was an indirected calendar) } else { // a calendar was returned - we assume the factory did the right thing. c = (Calendar*)u; } // Now, reset calendar to default state: c->adoptTimeZone(zone); // Set the correct time zone c->setTimeInMillis(getNow(), success); // let the new calendar have the current time. return c; }