Home | History | Annotate | Download | only in i18n
      1 // Copyright (C) 2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /************************************************************************
      4  * Copyright (C) 1996-2008, International Business Machines Corporation *
      5  * and others. All Rights Reserved.                                     *
      6  ************************************************************************
      7  *  2003-nov-07   srl       Port from Java
      8  */
      9 
     10 #ifndef ASTRO_H
     11 #define ASTRO_H
     12 
     13 #include "unicode/utypes.h"
     14 
     15 #if !UCONFIG_NO_FORMATTING
     16 
     17 #include "gregoimp.h"  // for Math
     18 #include "unicode/unistr.h"
     19 
     20 U_NAMESPACE_BEGIN
     21 
     22 /**
     23  * <code>CalendarAstronomer</code> is a class that can perform the calculations to
     24  * determine the positions of the sun and moon, the time of sunrise and
     25  * sunset, and other astronomy-related data.  The calculations it performs
     26  * are in some cases quite complicated, and this utility class saves you
     27  * the trouble of worrying about them.
     28  * <p>
     29  * The measurement of time is a very important part of astronomy.  Because
     30  * astronomical bodies are constantly in motion, observations are only valid
     31  * at a given moment in time.  Accordingly, each <code>CalendarAstronomer</code>
     32  * object has a <code>time</code> property that determines the date
     33  * and time for which its calculations are performed.  You can set and
     34  * retrieve this property with {@link #setDate setDate}, {@link #getDate getDate}
     35  * and related methods.
     36  * <p>
     37  * Almost all of the calculations performed by this class, or by any
     38  * astronomer, are approximations to various degrees of accuracy.  The
     39  * calculations in this class are mostly modelled after those described
     40  * in the book
     41  * <a href="http://www.amazon.com/exec/obidos/ISBN=0521356997" target="_top">
     42  * Practical Astronomy With Your Calculator</a>, by Peter J.
     43  * Duffett-Smith, Cambridge University Press, 1990.  This is an excellent
     44  * book, and if you want a greater understanding of how these calculations
     45  * are performed it a very good, readable starting point.
     46  * <p>
     47  * <strong>WARNING:</strong> This class is very early in its development, and
     48  * it is highly likely that its API will change to some degree in the future.
     49  * At the moment, it basically does just enough to support {@link IslamicCalendar}
     50  * and {@link ChineseCalendar}.
     51  *
     52  * @author Laura Werner
     53  * @author Alan Liu
     54  * @internal
     55  */
     56 class U_I18N_API CalendarAstronomer : public UMemory {
     57 public:
     58   // some classes
     59 
     60 public:
     61   /**
     62    * Represents the position of an object in the sky relative to the ecliptic,
     63    * the plane of the earth's orbit around the Sun.
     64    * This is a spherical coordinate system in which the latitude
     65    * specifies the position north or south of the plane of the ecliptic.
     66    * The longitude specifies the position along the ecliptic plane
     67    * relative to the "First Point of Aries", which is the Sun's position in the sky
     68    * at the Vernal Equinox.
     69    * <p>
     70    * Note that Ecliptic objects are immutable and cannot be modified
     71    * once they are constructed.  This allows them to be passed and returned by
     72    * value without worrying about whether other code will modify them.
     73    *
     74    * @see CalendarAstronomer.Equatorial
     75    * @see CalendarAstronomer.Horizon
     76    * @internal
     77    */
     78   class U_I18N_API Ecliptic : public UMemory {
     79   public:
     80     /**
     81      * Constructs an Ecliptic coordinate object.
     82      * <p>
     83      * @param lat The ecliptic latitude, measured in radians.
     84      * @param lon The ecliptic longitude, measured in radians.
     85      * @internal
     86      */
     87     Ecliptic(double lat = 0, double lon = 0) {
     88       latitude = lat;
     89       longitude = lon;
     90     }
     91 
     92     /**
     93      * Setter for Ecliptic Coordinate object
     94      * @param lat The ecliptic latitude, measured in radians.
     95      * @param lon The ecliptic longitude, measured in radians.
     96      * @internal
     97      */
     98     void set(double lat, double lon) {
     99       latitude = lat;
    100       longitude = lon;
    101     }
    102 
    103     /**
    104      * Return a string representation of this object
    105      * @internal
    106      */
    107     UnicodeString toString() const;
    108 
    109     /**
    110      * The ecliptic latitude, in radians.  This specifies an object's
    111      * position north or south of the plane of the ecliptic,
    112      * with positive angles representing north.
    113      * @internal
    114      */
    115     double latitude;
    116 
    117     /**
    118      * The ecliptic longitude, in radians.
    119      * This specifies an object's position along the ecliptic plane
    120      * relative to the "First Point of Aries", which is the Sun's position
    121      * in the sky at the Vernal Equinox,
    122      * with positive angles representing east.
    123      * <p>
    124      * A bit of trivia: the first point of Aries is currently in the
    125      * constellation Pisces, due to the precession of the earth's axis.
    126      * @internal
    127      */
    128     double longitude;
    129   };
    130 
    131   /**
    132    * Represents the position of an
    133    * object in the sky relative to the plane of the earth's equator.
    134    * The <i>Right Ascension</i> specifies the position east or west
    135    * along the equator, relative to the sun's position at the vernal
    136    * equinox.  The <i>Declination</i> is the position north or south
    137    * of the equatorial plane.
    138    * <p>
    139    * Note that Equatorial objects are immutable and cannot be modified
    140    * once they are constructed.  This allows them to be passed and returned by
    141    * value without worrying about whether other code will modify them.
    142    *
    143    * @see CalendarAstronomer.Ecliptic
    144    * @see CalendarAstronomer.Horizon
    145    * @internal
    146    */
    147   class U_I18N_API Equatorial : public UMemory {
    148   public:
    149     /**
    150      * Constructs an Equatorial coordinate object.
    151      * <p>
    152      * @param asc The right ascension, measured in radians.
    153      * @param dec The declination, measured in radians.
    154      * @internal
    155      */
    156     Equatorial(double asc = 0, double dec = 0)
    157       : ascension(asc), declination(dec) { }
    158 
    159     /**
    160      * Setter
    161      * @param asc The right ascension, measured in radians.
    162      * @param dec The declination, measured in radians.
    163      * @internal
    164      */
    165     void set(double asc, double dec) {
    166       ascension = asc;
    167       declination = dec;
    168     }
    169 
    170     /**
    171      * Return a string representation of this object, with the
    172      * angles measured in degrees.
    173      * @internal
    174      */
    175     UnicodeString toString() const;
    176 
    177     /**
    178      * Return a string representation of this object with the right ascension
    179      * measured in hours, minutes, and seconds.
    180      * @internal
    181      */
    182     //String toHmsString() {
    183     //return radToHms(ascension) + "," + radToDms(declination);
    184     //}
    185 
    186     /**
    187      * The right ascension, in radians.
    188      * This is the position east or west along the equator
    189      * relative to the sun's position at the vernal equinox,
    190      * with positive angles representing East.
    191      * @internal
    192      */
    193     double ascension;
    194 
    195     /**
    196      * The declination, in radians.
    197      * This is the position north or south of the equatorial plane,
    198      * with positive angles representing north.
    199      * @internal
    200      */
    201     double declination;
    202   };
    203 
    204   /**
    205    * Represents the position of an  object in the sky relative to
    206    * the local horizon.
    207    * The <i>Altitude</i> represents the object's elevation above the horizon,
    208    * with objects below the horizon having a negative altitude.
    209    * The <i>Azimuth</i> is the geographic direction of the object from the
    210    * observer's position, with 0 representing north.  The azimuth increases
    211    * clockwise from north.
    212    * <p>
    213    * Note that Horizon objects are immutable and cannot be modified
    214    * once they are constructed.  This allows them to be passed and returned by
    215    * value without worrying about whether other code will modify them.
    216    *
    217    * @see CalendarAstronomer.Ecliptic
    218    * @see CalendarAstronomer.Equatorial
    219    * @internal
    220    */
    221   class U_I18N_API Horizon : public UMemory {
    222   public:
    223     /**
    224      * Constructs a Horizon coordinate object.
    225      * <p>
    226      * @param alt  The altitude, measured in radians above the horizon.
    227      * @param azim The azimuth, measured in radians clockwise from north.
    228      * @internal
    229      */
    230     Horizon(double alt=0, double azim=0)
    231       : altitude(alt), azimuth(azim) { }
    232 
    233     /**
    234      * Setter for Ecliptic Coordinate object
    235      * @param alt  The altitude, measured in radians above the horizon.
    236      * @param azim The azimuth, measured in radians clockwise from north.
    237      * @internal
    238      */
    239     void set(double alt, double azim) {
    240       altitude = alt;
    241       azimuth = azim;
    242     }
    243 
    244     /**
    245      * Return a string representation of this object, with the
    246      * angles measured in degrees.
    247      * @internal
    248      */
    249     UnicodeString toString() const;
    250 
    251     /**
    252      * The object's altitude above the horizon, in radians.
    253      * @internal
    254      */
    255     double altitude;
    256 
    257     /**
    258      * The object's direction, in radians clockwise from north.
    259      * @internal
    260      */
    261     double azimuth;
    262   };
    263 
    264 public:
    265   //-------------------------------------------------------------------------
    266   // Assorted private data used for conversions
    267   //-------------------------------------------------------------------------
    268 
    269   // My own copies of these so compilers are more likely to optimize them away
    270   static const double PI;
    271 
    272   /**
    273    * The average number of solar days from one new moon to the next.  This is the time
    274    * it takes for the moon to return the same ecliptic longitude as the sun.
    275    * It is longer than the sidereal month because the sun's longitude increases
    276    * during the year due to the revolution of the earth around the sun.
    277    * Approximately 29.53.
    278    *
    279    * @see #SIDEREAL_MONTH
    280    * @internal
    281    * @deprecated ICU 2.4. This class may be removed or modified.
    282    */
    283   static const double SYNODIC_MONTH;
    284 
    285   //-------------------------------------------------------------------------
    286   // Constructors
    287   //-------------------------------------------------------------------------
    288 
    289   /**
    290    * Construct a new <code>CalendarAstronomer</code> object that is initialized to
    291    * the current date and time.
    292    * @internal
    293    */
    294   CalendarAstronomer();
    295 
    296   /**
    297    * Construct a new <code>CalendarAstronomer</code> object that is initialized to
    298    * the specified date and time.
    299    * @internal
    300    */
    301   CalendarAstronomer(UDate d);
    302 
    303   /**
    304    * Construct a new <code>CalendarAstronomer</code> object with the given
    305    * latitude and longitude.  The object's time is set to the current
    306    * date and time.
    307    * <p>
    308    * @param longitude The desired longitude, in <em>degrees</em> east of
    309    *                  the Greenwich meridian.
    310    *
    311    * @param latitude  The desired latitude, in <em>degrees</em>.  Positive
    312    *                  values signify North, negative South.
    313    *
    314    * @see java.util.Date#getTime()
    315    * @internal
    316    */
    317   CalendarAstronomer(double longitude, double latitude);
    318 
    319   /**
    320    * Destructor
    321    * @internal
    322    */
    323   ~CalendarAstronomer();
    324 
    325   //-------------------------------------------------------------------------
    326   // Time and date getters and setters
    327   //-------------------------------------------------------------------------
    328 
    329   /**
    330    * Set the current date and time of this <code>CalendarAstronomer</code> object.  All
    331    * astronomical calculations are performed based on this time setting.
    332    *
    333    * @param aTime the date and time, expressed as the number of milliseconds since
    334    *              1/1/1970 0:00 GMT (Gregorian).
    335    *
    336    * @see #setDate
    337    * @see #getTime
    338    * @internal
    339    */
    340   void setTime(UDate aTime);
    341 
    342 
    343   /**
    344    * Set the current date and time of this <code>CalendarAstronomer</code> object.  All
    345    * astronomical calculations are performed based on this time setting.
    346    *
    347    * @param aTime the date and time, expressed as the number of milliseconds since
    348    *              1/1/1970 0:00 GMT (Gregorian).
    349    *
    350    * @see #getTime
    351    * @internal
    352    */
    353   void setDate(UDate aDate) { setTime(aDate); }
    354 
    355   /**
    356    * Set the current date and time of this <code>CalendarAstronomer</code> object.  All
    357    * astronomical calculations are performed based on this time setting.
    358    *
    359    * @param jdn   the desired time, expressed as a "julian day number",
    360    *              which is the number of elapsed days since
    361    *              1/1/4713 BC (Julian), 12:00 GMT.  Note that julian day
    362    *              numbers start at <em>noon</em>.  To get the jdn for
    363    *              the corresponding midnight, subtract 0.5.
    364    *
    365    * @see #getJulianDay
    366    * @see #JULIAN_EPOCH_MS
    367    * @internal
    368    */
    369   void setJulianDay(double jdn);
    370 
    371   /**
    372    * Get the current time of this <code>CalendarAstronomer</code> object,
    373    * represented as the number of milliseconds since
    374    * 1/1/1970 AD 0:00 GMT (Gregorian).
    375    *
    376    * @see #setTime
    377    * @see #getDate
    378    * @internal
    379    */
    380   UDate getTime();
    381 
    382   /**
    383    * Get the current time of this <code>CalendarAstronomer</code> object,
    384    * expressed as a "julian day number", which is the number of elapsed
    385    * days since 1/1/4713 BC (Julian), 12:00 GMT.
    386    *
    387    * @see #setJulianDay
    388    * @see #JULIAN_EPOCH_MS
    389    * @internal
    390    */
    391   double getJulianDay();
    392 
    393   /**
    394    * Return this object's time expressed in julian centuries:
    395    * the number of centuries after 1/1/1900 AD, 12:00 GMT
    396    *
    397    * @see #getJulianDay
    398    * @internal
    399    */
    400   double getJulianCentury();
    401 
    402   /**
    403    * Returns the current Greenwich sidereal time, measured in hours
    404    * @internal
    405    */
    406   double getGreenwichSidereal();
    407 
    408 private:
    409   double getSiderealOffset();
    410 public:
    411   /**
    412    * Returns the current local sidereal time, measured in hours
    413    * @internal
    414    */
    415   double getLocalSidereal();
    416 
    417   /**
    418    * Converts local sidereal time to Universal Time.
    419    *
    420    * @param lst   The Local Sidereal Time, in hours since sidereal midnight
    421    *              on this object's current date.
    422    *
    423    * @return      The corresponding Universal Time, in milliseconds since
    424    *              1 Jan 1970, GMT.
    425    */
    426   //private:
    427   double lstToUT(double lst);
    428 
    429   /**
    430    *
    431    * Convert from ecliptic to equatorial coordinates.
    432    *
    433    * @param ecliptic     The ecliptic
    434    * @param result       Fillin result
    435    * @return reference to result
    436    */
    437   Equatorial& eclipticToEquatorial(Equatorial& result, const Ecliptic& ecliptic);
    438 
    439   /**
    440    * Convert from ecliptic to equatorial coordinates.
    441    *
    442    * @param eclipLong     The ecliptic longitude
    443    * @param eclipLat      The ecliptic latitude
    444    *
    445    * @return              The corresponding point in equatorial coordinates.
    446    * @internal
    447    */
    448   Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong, double eclipLat);
    449 
    450   /**
    451    * Convert from ecliptic longitude to equatorial coordinates.
    452    *
    453    * @param eclipLong     The ecliptic longitude
    454    *
    455    * @return              The corresponding point in equatorial coordinates.
    456    * @internal
    457    */
    458   Equatorial& eclipticToEquatorial(Equatorial& result, double eclipLong) ;
    459 
    460   /**
    461    * @internal
    462    */
    463   Horizon& eclipticToHorizon(Horizon& result, double eclipLong) ;
    464 
    465   //-------------------------------------------------------------------------
    466   // The Sun
    467   //-------------------------------------------------------------------------
    468 
    469   /**
    470    * The longitude of the sun at the time specified by this object.
    471    * The longitude is measured in radians along the ecliptic
    472    * from the "first point of Aries," the point at which the ecliptic
    473    * crosses the earth's equatorial plane at the vernal equinox.
    474    * <p>
    475    * Currently, this method uses an approximation of the two-body Kepler's
    476    * equation for the earth and the sun.  It does not take into account the
    477    * perturbations caused by the other planets, the moon, etc.
    478    * @internal
    479    */
    480   double getSunLongitude();
    481 
    482   /**
    483    * TODO Make this public when the entire class is package-private.
    484    */
    485   /*public*/ void getSunLongitude(double julianDay, double &longitude, double &meanAnomaly);
    486 
    487   /**
    488    * The position of the sun at this object's current date and time,
    489    * in equatorial coordinates.
    490    * @param result fillin for the result
    491    * @internal
    492    */
    493   Equatorial& getSunPosition(Equatorial& result);
    494 
    495 public:
    496   /**
    497    * Constant representing the vernal equinox.
    498    * For use with {@link #getSunTime getSunTime}.
    499    * Note: In this case, "vernal" refers to the northern hemisphere's seasons.
    500    * @internal
    501    */
    502 //  static double VERNAL_EQUINOX();
    503 
    504   /**
    505    * Constant representing the summer solstice.
    506    * For use with {@link #getSunTime getSunTime}.
    507    * Note: In this case, "summer" refers to the northern hemisphere's seasons.
    508    * @internal
    509    */
    510   static double SUMMER_SOLSTICE();
    511 
    512   /**
    513    * Constant representing the autumnal equinox.
    514    * For use with {@link #getSunTime getSunTime}.
    515    * Note: In this case, "autumn" refers to the northern hemisphere's seasons.
    516    * @internal
    517    */
    518 //  static double AUTUMN_EQUINOX();
    519 
    520   /**
    521    * Constant representing the winter solstice.
    522    * For use with {@link #getSunTime getSunTime}.
    523    * Note: In this case, "winter" refers to the northern hemisphere's seasons.
    524    * @internal
    525    */
    526   static double WINTER_SOLSTICE();
    527 
    528   /**
    529    * Find the next time at which the sun's ecliptic longitude will have
    530    * the desired value.
    531    * @internal
    532    */
    533   UDate getSunTime(double desired, UBool next);
    534 
    535   /**
    536    * Returns the time (GMT) of sunrise or sunset on the local date to which
    537    * this calendar is currently set.
    538    *
    539    * NOTE: This method only works well if this object is set to a
    540    * time near local noon.  Because of variations between the local
    541    * official time zone and the geographic longitude, the
    542    * computation can flop over into an adjacent day if this object
    543    * is set to a time near local midnight.
    544    *
    545    * @internal
    546    */
    547   UDate getSunRiseSet(UBool rise);
    548 
    549   //-------------------------------------------------------------------------
    550   // The Moon
    551   //-------------------------------------------------------------------------
    552 
    553   /**
    554    * The position of the moon at the time set on this
    555    * object, in equatorial coordinates.
    556    * @internal
    557    * @return const reference to internal field of calendar astronomer. Do not use outside of the lifetime of this astronomer.
    558    */
    559   const Equatorial& getMoonPosition();
    560 
    561   /**
    562    * The "age" of the moon at the time specified in this object.
    563    * This is really the angle between the
    564    * current ecliptic longitudes of the sun and the moon,
    565    * measured in radians.
    566    *
    567    * @see #getMoonPhase
    568    * @internal
    569    */
    570   double getMoonAge();
    571 
    572   /**
    573    * Calculate the phase of the moon at the time set in this object.
    574    * The returned phase is a <code>double</code> in the range
    575    * <code>0 <= phase < 1</code>, interpreted as follows:
    576    * <ul>
    577    * <li>0.00: New moon
    578    * <li>0.25: First quarter
    579    * <li>0.50: Full moon
    580    * <li>0.75: Last quarter
    581    * </ul>
    582    *
    583    * @see #getMoonAge
    584    * @internal
    585    */
    586   double getMoonPhase();
    587 
    588   class U_I18N_API MoonAge : public UMemory {
    589   public:
    590     MoonAge(double l)
    591       :  value(l) { }
    592     void set(double l) { value = l; }
    593     double value;
    594   };
    595 
    596   /**
    597    * Constant representing a new moon.
    598    * For use with {@link #getMoonTime getMoonTime}
    599    * @internal
    600    */
    601   static const MoonAge NEW_MOON();
    602 
    603   /**
    604    * Constant representing the moon's first quarter.
    605    * For use with {@link #getMoonTime getMoonTime}
    606    * @internal
    607    */
    608 //  static const MoonAge FIRST_QUARTER();
    609 
    610   /**
    611    * Constant representing a full moon.
    612    * For use with {@link #getMoonTime getMoonTime}
    613    * @internal
    614    */
    615   static const MoonAge FULL_MOON();
    616 
    617   /**
    618    * Constant representing the moon's last quarter.
    619    * For use with {@link #getMoonTime getMoonTime}
    620    * @internal
    621    */
    622 //  static const MoonAge LAST_QUARTER();
    623 
    624   /**
    625    * Find the next or previous time at which the Moon's ecliptic
    626    * longitude will have the desired value.
    627    * <p>
    628    * @param desired   The desired longitude.
    629    * @param next      <tt>true</tt> if the next occurrance of the phase
    630    *                  is desired, <tt>false</tt> for the previous occurrance.
    631    * @internal
    632    */
    633   UDate getMoonTime(double desired, UBool next);
    634   UDate getMoonTime(const MoonAge& desired, UBool next);
    635 
    636   /**
    637    * Returns the time (GMT) of sunrise or sunset on the local date to which
    638    * this calendar is currently set.
    639    * @internal
    640    */
    641   UDate getMoonRiseSet(UBool rise);
    642 
    643   //-------------------------------------------------------------------------
    644   // Interpolation methods for finding the time at which a given event occurs
    645   //-------------------------------------------------------------------------
    646 
    647   // private
    648   class AngleFunc : public UMemory {
    649   public:
    650     virtual double eval(CalendarAstronomer&) = 0;
    651     virtual ~AngleFunc();
    652   };
    653   friend class AngleFunc;
    654 
    655   UDate timeOfAngle(AngleFunc& func, double desired,
    656                     double periodDays, double epsilon, UBool next);
    657 
    658   class CoordFunc : public UMemory {
    659   public:
    660     virtual void eval(Equatorial& result, CalendarAstronomer&) = 0;
    661     virtual ~CoordFunc();
    662   };
    663   friend class CoordFunc;
    664 
    665   double riseOrSet(CoordFunc& func, UBool rise,
    666                    double diameter, double refraction,
    667                    double epsilon);
    668 
    669   //-------------------------------------------------------------------------
    670   // Other utility methods
    671   //-------------------------------------------------------------------------
    672 private:
    673 
    674   /**
    675    * Return the obliquity of the ecliptic (the angle between the ecliptic
    676    * and the earth's equator) at the current time.  This varies due to
    677    * the precession of the earth's axis.
    678    *
    679    * @return  the obliquity of the ecliptic relative to the equator,
    680    *          measured in radians.
    681    */
    682   double eclipticObliquity();
    683 
    684   //-------------------------------------------------------------------------
    685   // Private data
    686   //-------------------------------------------------------------------------
    687 private:
    688   /**
    689    * Current time in milliseconds since 1/1/1970 AD
    690    * @see java.util.Date#getTime
    691    */
    692   UDate fTime;
    693 
    694   /* These aren't used yet, but they'll be needed for sunset calculations
    695    * and equatorial to horizon coordinate conversions
    696    */
    697   double fLongitude;
    698   double fLatitude;
    699   double fGmtOffset;
    700 
    701   //
    702   // The following fields are used to cache calculated results for improved
    703   // performance.  These values all depend on the current time setting
    704   // of this object, so the clearCache method is provided.
    705   //
    706 
    707   double    julianDay;
    708   double    julianCentury;
    709   double    sunLongitude;
    710   double    meanAnomalySun;
    711   double    moonLongitude;
    712   double    moonEclipLong;
    713   double    meanAnomalyMoon;
    714   double    eclipObliquity;
    715   double    siderealT0;
    716   double    siderealTime;
    717 
    718   void clearCache();
    719 
    720   Equatorial  moonPosition;
    721   UBool       moonPositionSet;
    722 
    723   /**
    724    * @internal
    725    */
    726 //  UDate local(UDate localMillis);
    727 };
    728 
    729 U_NAMESPACE_END
    730 
    731 struct UHashtable;
    732 
    733 U_NAMESPACE_BEGIN
    734 
    735 /**
    736  * Cache of month -> julian day
    737  * @internal
    738  */
    739 class CalendarCache : public UMemory {
    740 public:
    741   static int32_t get(CalendarCache** cache, int32_t key, UErrorCode &status);
    742   static void put(CalendarCache** cache, int32_t key, int32_t value, UErrorCode &status);
    743   virtual ~CalendarCache();
    744 private:
    745   CalendarCache(int32_t size, UErrorCode& status);
    746   static void createCache(CalendarCache** cache, UErrorCode& status);
    747   /**
    748    * not implemented
    749    */
    750   CalendarCache();
    751   UHashtable *fTable;
    752 };
    753 
    754 U_NAMESPACE_END
    755 
    756 #endif
    757 #endif
    758