/*
Реализация спецификаций CLDC версии 1.1 (JSR-139), MIDP версии 2.1 (JSR-118)
и других спецификаций для функционирования компактных приложений на языке
Java (мидлетов) в среде программного обеспечения Малик Эмулятор.
Copyright © 2016, 2019 Малик Разработчик
Это свободная программа: вы можете перераспространять ее и/или изменять
ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
в каком она была опубликована Фондом свободного программного обеспечения;
либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной,
но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
общественной лицензии GNU.
Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
вместе с этой программой. Если это не так, см.
<https://www.gnu.org/licenses/>.
*/
package java.util;
import malik.emulator.time.*;
public abstract class Calendar extends Object
{
public static final int YEAR = 1;
public static final int MONTH = 2;
public static final int DATE = 5;
public static final int DAY_OF_MONTH = 5;
public static final int DAY_OF_WEEK = 7;
public static final int AM_PM = 9;
public static final int HOUR = 10;
public static final int HOUR_OF_DAY = 11;
public static final int MINUTE = 12;
public static final int SECOND = 13;
public static final int MILLISECOND = 14;
public static final int MONDAY = 2;
public static final int TUESDAY = 3;
public static final int WEDNESDAY = 4;
public static final int THURSDAY = 5;
public static final int FRIDAY = 6;
public static final int SATURDAY = 7;
public static final int SUNDAY = 1;
public static final int JANUARY = 0;
public static final int FEBRUARY = 1;
public static final int MARCH = 2;
public static final int APRIL = 3;
public static final int MAY = 4;
public static final int JUNE = 5;
public static final int JULY = 6;
public static final int AUGUST = 7;
public static final int SEPTEMBER = 8;
public static final int OCTOBER = 9;
public static final int NOVEMBER = 10;
public static final int DECEMBER = 11;
public static final int AM = 0;
public static final int PM = 1;
private static final int FIELDS = 15;
public static Calendar getInstance()
{
return new GregorianCalendar();
}
public static Calendar getInstance(TimeZone zone)
{
Calendar result;
(result = getInstance()).setTimeZone(zone);
return result;
}
protected long time;
protected boolean[] isSet;
protected int[] fields;
private boolean isTimeSet;
private TimeZone zone;
protected Calendar()
{
TimeZone z;
if((z = TimeZone.getDefault()) == null)
{
throw new RuntimeException("Calendar: " +
"не удалось найти часовой пояс, используемый по умолчанию.");
}
this.fields = new int[FIELDS];
this.isSet = new boolean[FIELDS];
this.zone = z;
setTimeInMillis(System.currentTimeMillis());
}
public boolean equals(Object ref)
{
Calendar c;
return ref == this || ref instanceof Calendar &&
getTimeInMillis() == (c = (Calendar) ref).getTimeInMillis() &&
getTimeZone().equals(c.getTimeZone());
}
public int hashCode()
{
long t;
return ((int) ((t = getTimeInMillis()) ^ (t >>> 32))) ^ getTimeZone().hashCode();
}
public void setTimeZone(TimeZone zone)
{
this.zone = zone;
getTimeInMillis();
computeFields();
}
public boolean before(Object when)
{
return when instanceof Calendar && getTimeInMillis() < ((Calendar) when).getTimeInMillis();
}
public boolean after(Object when)
{
return when instanceof Calendar && getTimeInMillis() > ((Calendar) when).getTimeInMillis();
}
public TimeZone getTimeZone()
{
return zone;
}
public final void set(int field, int value)
{
isTimeSet = false;
isSet[field] = true;
fields[field] = value;
}
public final void setTime(Date time)
{
setTimeInMillis(time.getTime());
}
public final int get(int field)
{
switch(field)
{
default:
break;
case DAY_OF_WEEK:
case AM_PM:
case HOUR:
case HOUR_OF_DAY:
getTimeInMillis();
computeFields();
break;
}
return fields[field];
}
public final Date getTime()
{
return new Date(getTimeInMillis());
}
protected abstract void computeFields();
protected abstract void computeTime();
protected void setTimeInMillis(long millis)
{
isTimeSet = true;
fields[DAY_OF_WEEK] = 0;
time = millis;
computeFields();
}
protected long getTimeInMillis()
{
if(!isTimeSet)
{
computeTime();
isTimeSet = true;
}
return time;
}
}