Mercurial > projects > dwt-addons
diff dwtx/dwtxhelper/mangoicu/UCalendar.d @ 92:f05207c07a98
changed filetype to unix
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Mon, 07 Jul 2008 15:54:03 +0200 |
parents | 11e8159caf7a |
children |
line wrap: on
line diff
--- a/dwtx/dwtxhelper/mangoicu/UCalendar.d Mon Jul 07 15:53:07 2008 +0200 +++ b/dwtx/dwtxhelper/mangoicu/UCalendar.d Mon Jul 07 15:54:03 2008 +0200 @@ -1,666 +1,666 @@ -/******************************************************************************* - - @file UCalendar.d - - Copyright (c) 2004 Kris Bell - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for damages - of any kind arising from the use of this software. - - Permission is hereby granted to anyone to use this software for any - purpose, including commercial applications, and to alter it and/or - redistribute it freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment within documentation of - said product would be appreciated but is not required. - - 2. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - - 3. This notice may not be removed or altered from any distribution - of the source. - - 4. Derivative works are permitted, but they must carry this notice - in full and credit the original source. - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - @version Initial version, November 2004 - @author Kris - - Note that this package and documentation is built around the ICU - project (http://oss.software.ibm.com/icu/). Below is the license - statement as specified by that software: - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - ICU License - ICU 1.8.1 and later - - COPYRIGHT AND PERMISSION NOTICE - - Copyright (c) 1995-2003 International Business Machines Corporation and - others. - - All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, and/or sell copies of the Software, and to permit persons - to whom the Software is furnished to do so, provided that the above - copyright notice(s) and this permission notice appear in all copies of - the Software and that both the above copyright notice(s) and this - permission notice appear in supporting documentation. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT - OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL - INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING - FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, - NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION - WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - Except as contained in this notice, the name of a copyright holder - shall not be used in advertising or otherwise to promote the sale, use - or other dealings in this Software without prior written authorization - of the copyright holder. - - ---------------------------------------------------------------------- - - All trademarks and registered trademarks mentioned herein are the - property of their respective owners. - -*******************************************************************************/ - -module dwtx.dwtxhelper.mangoicu.UCalendar; - -private import dwtx.dwtxhelper.mangoicu.ICU, - dwtx.dwtxhelper.mangoicu.UString; - -public import dwtx.dwtxhelper.mangoicu.ULocale, - dwtx.dwtxhelper.mangoicu.UTimeZone; - -/******************************************************************************* - - UCalendar is used for converting between a UDate object and - a set of integer fields such as Year, Month, Day, - Hour, and so on. (A UDate object represents a specific instant - in time with millisecond precision. See UDate for information about - the UDate) - - Types of UCalendar interpret a UDate according to the rules of a - specific calendar system. UCalendar supports Traditional & Gregorian. - - A UCalendar object can produce all the time field values needed to - implement the date-time formatting for a particular language and - calendar style (for example, Japanese-Gregorian, Japanese-Traditional). - - When computing a UDate from time fields, two special circumstances - may arise: there may be insufficient information to compute the UDate - (such as only year and month but no day in the month), or there may be - inconsistent information (such as "Tuesday, July 15, 1996" -- July 15, - 1996 is actually a Monday). - - Insufficient information. The calendar will use default information - to specify the missing fields. This may vary by calendar; for the - Gregorian calendar, the default for a field is the same as that of - the start of the epoch: i.e., Year = 1970, Month = January, - Date = 1, etc. - - Inconsistent information. If fields conflict, the calendar will give - preference to fields set more recently. For example, when determining - the day, the calendar will look for one of the following combinations - of fields. The most recent combination, as determined by the most - recently set single field, will be used. - - See http://oss.software.ibm.com/icu/apiref/udat_8h.html for full - details. - -*******************************************************************************/ - -class UCalendar : ICU -{ - package Handle handle; - - typedef double UDate; - - //Possible types of UCalendars - public enum Type - { - Traditional, - Gregorian - } - - // Possible fields in a UCalendar - public enum DateFields - { - Era, - Year, - Month, - WeekOfYear, - WeekOfMonth, - Date, - DayOfYear, - DayOfWeek, - DayOfWeekInMonth, - AmPm, - Hour, - HourOfDay, - Minute, - Second, - Millisecond, - ZoneOffset, - DstOffset, - YearWoy, - DowLocal, - ExtendedYear, - JulianDay, - MillisecondsInDay, - FieldCount, - DayOfMonth = Date - } - - // Possible days of the week in a UCalendar - public enum DaysOfWeek - { - Sunday = 1, - Monday, - Tuesday, - Wednesday, - Thursday, - Friday, - Saturday - } - - // Possible months in a UCalendar - public enum Months - { - January, - February, - March, - April, - May, - June, - July, - August, - September, - October, - November, - December, - UnDecimber - } - - // Possible AM/PM values in a UCalendar - public enum AMPMs - { - AM, - PM - } - - // Possible formats for a UCalendar's display name - public enum DisplayNameType - { - Standard, - ShortStandard, - DST, - ShortDST - } - - // Possible limit values for a UCalendar - public enum Limit - { - Minimum, - Maximum, - GreatestMinimum, - LeastMaximum, - ActualMinimum, - ActualMaximum - } - - // Types of UCalendar attributes - private enum Attribute - { - Lenient, // unused: set from UDateFormat instead - FirstDayOfWeek, - MinimalDaysInFirstWeek - } - - /*********************************************************************** - - Open a UCalendar. A UCalendar may be used to convert a - millisecond value to a year, month, and day - - ***********************************************************************/ - - this (inout UTimeZone zone, inout ULocale locale, Type type = Type.Traditional) - { - UErrorCode e; - - handle = ucal_open (zone.name.ptr, zone.name.length, toString(locale.name), type, e); - testError (e, "failed to open calendar"); - } - - /*********************************************************************** - - Internal only: Open a UCalendar with the given handle - - ***********************************************************************/ - - package this (Handle handle) - { - this.handle = handle; - } - - /*********************************************************************** - - Close this UCalendar - - ***********************************************************************/ - - ~this () - { - ucal_close (handle); - } - - /*********************************************************************** - - Set the TimeZone used by a UCalendar - - ***********************************************************************/ - - void setTimeZone (inout UTimeZone zone) - { - UErrorCode e; - - ucal_setTimeZone (handle, zone.name.ptr, zone.name.length, e); - testError (e, "failed to set calendar time zone"); - } - - /*********************************************************************** - - Get display name of the TimeZone used by this UCalendar - - ***********************************************************************/ - - void getTimeZoneName (UString s, inout ULocale locale, DisplayNameType type=DisplayNameType.Standard) - { - uint format (wchar* dst, uint length, inout ICU.UErrorCode e) - { - return ucal_getTimeZoneDisplayName (handle, type, toString(locale.name), dst, length, e); - } - - s.format (&format, "failed to get time zone name"); - } - - /*********************************************************************** - - Determine if a UCalendar is currently in daylight savings - time - - ***********************************************************************/ - - bool inDaylightTime () - { - UErrorCode e; - - auto x = ucal_inDaylightTime (handle, e); - testError (e, "failed to test calendar daylight time"); - return x != 0; - } - - /*********************************************************************** - - Get the current date and time - - ***********************************************************************/ - - UDate getNow () - { - return ucal_getNow (); - } - - /*********************************************************************** - - Get a UCalendar's current time in millis. The time is - represented as milliseconds from the epoch - - ***********************************************************************/ - - UDate getMillis () - { - UErrorCode e; - - auto x = ucal_getMillis (handle, e); - testError (e, "failed to get time"); - return x; - } - - /*********************************************************************** - - Set a UCalendar's current time in millis. The time is - represented as milliseconds from the epoch - - ***********************************************************************/ - - void setMillis (UDate date) - { - UErrorCode e; - - ucal_setMillis (handle, date, e); - testError (e, "failed to set time"); - } - - /*********************************************************************** - - Set a UCalendar's current date - - ***********************************************************************/ - - void setDate (uint year, Months month, uint date) - { - UErrorCode e; - - ucal_setDate (handle, year, month, date, e); - testError (e, "failed to set date"); - } - - /*********************************************************************** - - Set a UCalendar's current date - - ***********************************************************************/ - - void setDateTime (uint year, Months month, uint date, uint hour, uint minute, uint second) - { - UErrorCode e; - - ucal_setDateTime (handle, year, month, date, hour, minute, second, e); - testError (e, "failed to set date/time"); - } - - /*********************************************************************** - - Returns TRUE if the given Calendar object is equivalent - to this one - - ***********************************************************************/ - - bool isEquivalent (UCalendar when) - { - return ucal_equivalentTo (handle, when.handle) != 0; - } - - /*********************************************************************** - - Compares the Calendar time - - ***********************************************************************/ - - bool isEqual (UCalendar when) - { - return (this is when || getMillis == when.getMillis); - } - - /*********************************************************************** - - Returns true if this Calendar's current time is before - "when"'s current time - - ***********************************************************************/ - - bool isBefore (UCalendar when) - { - return (this !is when || getMillis < when.getMillis); - } - - /*********************************************************************** - - Returns true if this Calendar's current time is after - "when"'s current time - - ***********************************************************************/ - - bool isAfter (UCalendar when) - { - return (this !is when || getMillis > when.getMillis); - } - - /*********************************************************************** - - Add a specified signed amount to a particular field in a - UCalendar - - ***********************************************************************/ - - void add (DateFields field, uint amount) - { - UErrorCode e; - - ucal_add (handle, field, amount, e); - testError (e, "failed to add to calendar"); - } - - /*********************************************************************** - - Add a specified signed amount to a particular field in a - UCalendar - - ***********************************************************************/ - - void roll (DateFields field, uint amount) - { - UErrorCode e; - - ucal_roll (handle, field, amount, e); - testError (e, "failed to roll calendar"); - } - - /*********************************************************************** - - Get the current value of a field from a UCalendar - - ***********************************************************************/ - - uint get (DateFields field) - { - UErrorCode e; - - auto x = ucal_get (handle, field, e); - testError (e, "failed to get calendar field"); - return x; - } - - /*********************************************************************** - - Set the value of a field in a UCalendar - - ***********************************************************************/ - - void set (DateFields field, uint value) - { - ucal_set (handle, field, value); - } - - /*********************************************************************** - - Determine if a field in a UCalendar is set - - ***********************************************************************/ - - bool isSet (DateFields field) - { - return ucal_isSet (handle, field) != 0; - } - - /*********************************************************************** - - Clear a field in a UCalendar - - ***********************************************************************/ - - void clearField (DateFields field) - { - ucal_clearField (handle, field); - } - - /*********************************************************************** - - Clear all fields in a UCalendar - - ***********************************************************************/ - - void clear () - { - ucal_clear (handle); - } - - /*********************************************************************** - - Determine a limit for a field in a UCalendar. A limit is a - maximum or minimum value for a field - - ***********************************************************************/ - - uint getLimit (DateFields field, Limit type) - { - UErrorCode e; - - auto x = ucal_getLimit (handle, field, type, e); - testError (e, "failed to get calendar limit"); - return x; - } - - /*********************************************************************** - - ***********************************************************************/ - - uint getDaysInFirstWeek () - { - return ucal_getAttribute (handle, Attribute.MinimalDaysInFirstWeek); - } - - /*********************************************************************** - - ***********************************************************************/ - - uint getFirstDayOfWeek () - { - return ucal_getAttribute (handle, Attribute.FirstDayOfWeek); - } - - /*********************************************************************** - - ***********************************************************************/ - - void setDaysInFirstWeek (uint value) - { - ucal_setAttribute (handle, Attribute.MinimalDaysInFirstWeek, value); - } - - /*********************************************************************** - - ***********************************************************************/ - - void setFirstDayOfWeek (uint value) - { - ucal_setAttribute (handle, Attribute.FirstDayOfWeek, value); - } - - - /*********************************************************************** - - Bind the ICU functions from a shared library. This is - complicated by the issues regarding D and DLLs on the - Windows platform - - ***********************************************************************/ - - private static void* library; - - /*********************************************************************** - - ***********************************************************************/ - - private static extern (C) - { - Handle function (wchar*, uint, char*, Type, inout UErrorCode) ucal_open; - void function (Handle) ucal_close; - UDate function () ucal_getNow; - UDate function (Handle, inout UErrorCode) ucal_getMillis; - void function (Handle, UDate, inout UErrorCode) ucal_setMillis; - void function (Handle, uint, uint, uint, inout UErrorCode) ucal_setDate; - void function (Handle, uint, uint, uint, uint, uint, uint, inout UErrorCode) ucal_setDateTime; - byte function (Handle, Handle) ucal_equivalentTo; - void function (Handle, uint, uint, inout UErrorCode) ucal_add; - void function (Handle, uint, uint, inout UErrorCode) ucal_roll; - uint function (Handle, uint, inout UErrorCode) ucal_get; - void function (Handle, uint, uint) ucal_set; - byte function (Handle, uint) ucal_isSet; - void function (Handle, uint) ucal_clearField; - void function (Handle) ucal_clear; - uint function (Handle, uint, uint, inout UErrorCode) ucal_getLimit; - void function (Handle, wchar*, uint, inout UErrorCode) ucal_setTimeZone; - byte function (Handle, uint) ucal_inDaylightTime; - uint function (Handle, uint) ucal_getAttribute; - void function (Handle, uint, uint) ucal_setAttribute; - uint function (Handle, uint, char*, wchar*, uint, inout UErrorCode) ucal_getTimeZoneDisplayName; - } - - /*********************************************************************** - - ***********************************************************************/ - - static FunctionLoader.Bind[] targets = - [ - {cast(void**) &ucal_open, "ucal_open"}, - {cast(void**) &ucal_close, "ucal_close"}, - {cast(void**) &ucal_getNow, "ucal_getNow"}, - {cast(void**) &ucal_getMillis, "ucal_getMillis"}, - {cast(void**) &ucal_setMillis, "ucal_setMillis"}, - {cast(void**) &ucal_setDate, "ucal_setDate"}, - {cast(void**) &ucal_setDateTime, "ucal_setDateTime"}, - {cast(void**) &ucal_equivalentTo, "ucal_equivalentTo"}, - {cast(void**) &ucal_add, "ucal_add"}, - {cast(void**) &ucal_roll, "ucal_roll"}, - {cast(void**) &ucal_get, "ucal_get"}, - {cast(void**) &ucal_set, "ucal_set"}, - {cast(void**) &ucal_clearField, "ucal_clearField"}, - {cast(void**) &ucal_clear, "ucal_clear"}, - {cast(void**) &ucal_getLimit, "ucal_getLimit"}, - {cast(void**) &ucal_setTimeZone, "ucal_setTimeZone"}, - {cast(void**) &ucal_inDaylightTime, "ucal_inDaylightTime"}, - {cast(void**) &ucal_getAttribute, "ucal_getAttribute"}, - {cast(void**) &ucal_setAttribute, "ucal_setAttribute"}, - {cast(void**) &ucal_isSet, "ucal_isSet"}, - {cast(void**) &ucal_getTimeZoneDisplayName, "ucal_getTimeZoneDisplayName"}, - ]; - - /*********************************************************************** - - ***********************************************************************/ - - static this () - { - library = FunctionLoader.bind (icuin, targets); - } - - /*********************************************************************** - - ***********************************************************************/ - - static ~this () - { - FunctionLoader.unbind (library); - } - -} +/******************************************************************************* + + @file UCalendar.d + + Copyright (c) 2004 Kris Bell + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for damages + of any kind arising from the use of this software. + + Permission is hereby granted to anyone to use this software for any + purpose, including commercial applications, and to alter it and/or + redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must + not claim that you wrote the original software. If you use this + software in a product, an acknowledgment within documentation of + said product would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must + not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any distribution + of the source. + + 4. Derivative works are permitted, but they must carry this notice + in full and credit the original source. + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + @version Initial version, November 2004 + @author Kris + + Note that this package and documentation is built around the ICU + project (http://oss.software.ibm.com/icu/). Below is the license + statement as specified by that software: + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + ICU License - ICU 1.8.1 and later + + COPYRIGHT AND PERMISSION NOTICE + + Copyright (c) 1995-2003 International Business Machines Corporation and + others. + + All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, and/or sell copies of the Software, and to permit persons + to whom the Software is furnished to do so, provided that the above + copyright notice(s) and this permission notice appear in all copies of + the Software and that both the above copyright notice(s) and this + permission notice appear in supporting documentation. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL + INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING + FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, use + or other dealings in this Software without prior written authorization + of the copyright holder. + + ---------------------------------------------------------------------- + + All trademarks and registered trademarks mentioned herein are the + property of their respective owners. + +*******************************************************************************/ + +module dwtx.dwtxhelper.mangoicu.UCalendar; + +private import dwtx.dwtxhelper.mangoicu.ICU, + dwtx.dwtxhelper.mangoicu.UString; + +public import dwtx.dwtxhelper.mangoicu.ULocale, + dwtx.dwtxhelper.mangoicu.UTimeZone; + +/******************************************************************************* + + UCalendar is used for converting between a UDate object and + a set of integer fields such as Year, Month, Day, + Hour, and so on. (A UDate object represents a specific instant + in time with millisecond precision. See UDate for information about + the UDate) + + Types of UCalendar interpret a UDate according to the rules of a + specific calendar system. UCalendar supports Traditional & Gregorian. + + A UCalendar object can produce all the time field values needed to + implement the date-time formatting for a particular language and + calendar style (for example, Japanese-Gregorian, Japanese-Traditional). + + When computing a UDate from time fields, two special circumstances + may arise: there may be insufficient information to compute the UDate + (such as only year and month but no day in the month), or there may be + inconsistent information (such as "Tuesday, July 15, 1996" -- July 15, + 1996 is actually a Monday). + + Insufficient information. The calendar will use default information + to specify the missing fields. This may vary by calendar; for the + Gregorian calendar, the default for a field is the same as that of + the start of the epoch: i.e., Year = 1970, Month = January, + Date = 1, etc. + + Inconsistent information. If fields conflict, the calendar will give + preference to fields set more recently. For example, when determining + the day, the calendar will look for one of the following combinations + of fields. The most recent combination, as determined by the most + recently set single field, will be used. + + See http://oss.software.ibm.com/icu/apiref/udat_8h.html for full + details. + +*******************************************************************************/ + +class UCalendar : ICU +{ + package Handle handle; + + typedef double UDate; + + //Possible types of UCalendars + public enum Type + { + Traditional, + Gregorian + } + + // Possible fields in a UCalendar + public enum DateFields + { + Era, + Year, + Month, + WeekOfYear, + WeekOfMonth, + Date, + DayOfYear, + DayOfWeek, + DayOfWeekInMonth, + AmPm, + Hour, + HourOfDay, + Minute, + Second, + Millisecond, + ZoneOffset, + DstOffset, + YearWoy, + DowLocal, + ExtendedYear, + JulianDay, + MillisecondsInDay, + FieldCount, + DayOfMonth = Date + } + + // Possible days of the week in a UCalendar + public enum DaysOfWeek + { + Sunday = 1, + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday + } + + // Possible months in a UCalendar + public enum Months + { + January, + February, + March, + April, + May, + June, + July, + August, + September, + October, + November, + December, + UnDecimber + } + + // Possible AM/PM values in a UCalendar + public enum AMPMs + { + AM, + PM + } + + // Possible formats for a UCalendar's display name + public enum DisplayNameType + { + Standard, + ShortStandard, + DST, + ShortDST + } + + // Possible limit values for a UCalendar + public enum Limit + { + Minimum, + Maximum, + GreatestMinimum, + LeastMaximum, + ActualMinimum, + ActualMaximum + } + + // Types of UCalendar attributes + private enum Attribute + { + Lenient, // unused: set from UDateFormat instead + FirstDayOfWeek, + MinimalDaysInFirstWeek + } + + /*********************************************************************** + + Open a UCalendar. A UCalendar may be used to convert a + millisecond value to a year, month, and day + + ***********************************************************************/ + + this (inout UTimeZone zone, inout ULocale locale, Type type = Type.Traditional) + { + UErrorCode e; + + handle = ucal_open (zone.name.ptr, zone.name.length, toString(locale.name), type, e); + testError (e, "failed to open calendar"); + } + + /*********************************************************************** + + Internal only: Open a UCalendar with the given handle + + ***********************************************************************/ + + package this (Handle handle) + { + this.handle = handle; + } + + /*********************************************************************** + + Close this UCalendar + + ***********************************************************************/ + + ~this () + { + ucal_close (handle); + } + + /*********************************************************************** + + Set the TimeZone used by a UCalendar + + ***********************************************************************/ + + void setTimeZone (inout UTimeZone zone) + { + UErrorCode e; + + ucal_setTimeZone (handle, zone.name.ptr, zone.name.length, e); + testError (e, "failed to set calendar time zone"); + } + + /*********************************************************************** + + Get display name of the TimeZone used by this UCalendar + + ***********************************************************************/ + + void getTimeZoneName (UString s, inout ULocale locale, DisplayNameType type=DisplayNameType.Standard) + { + uint format (wchar* dst, uint length, inout ICU.UErrorCode e) + { + return ucal_getTimeZoneDisplayName (handle, type, toString(locale.name), dst, length, e); + } + + s.format (&format, "failed to get time zone name"); + } + + /*********************************************************************** + + Determine if a UCalendar is currently in daylight savings + time + + ***********************************************************************/ + + bool inDaylightTime () + { + UErrorCode e; + + auto x = ucal_inDaylightTime (handle, e); + testError (e, "failed to test calendar daylight time"); + return x != 0; + } + + /*********************************************************************** + + Get the current date and time + + ***********************************************************************/ + + UDate getNow () + { + return ucal_getNow (); + } + + /*********************************************************************** + + Get a UCalendar's current time in millis. The time is + represented as milliseconds from the epoch + + ***********************************************************************/ + + UDate getMillis () + { + UErrorCode e; + + auto x = ucal_getMillis (handle, e); + testError (e, "failed to get time"); + return x; + } + + /*********************************************************************** + + Set a UCalendar's current time in millis. The time is + represented as milliseconds from the epoch + + ***********************************************************************/ + + void setMillis (UDate date) + { + UErrorCode e; + + ucal_setMillis (handle, date, e); + testError (e, "failed to set time"); + } + + /*********************************************************************** + + Set a UCalendar's current date + + ***********************************************************************/ + + void setDate (uint year, Months month, uint date) + { + UErrorCode e; + + ucal_setDate (handle, year, month, date, e); + testError (e, "failed to set date"); + } + + /*********************************************************************** + + Set a UCalendar's current date + + ***********************************************************************/ + + void setDateTime (uint year, Months month, uint date, uint hour, uint minute, uint second) + { + UErrorCode e; + + ucal_setDateTime (handle, year, month, date, hour, minute, second, e); + testError (e, "failed to set date/time"); + } + + /*********************************************************************** + + Returns TRUE if the given Calendar object is equivalent + to this one + + ***********************************************************************/ + + bool isEquivalent (UCalendar when) + { + return ucal_equivalentTo (handle, when.handle) != 0; + } + + /*********************************************************************** + + Compares the Calendar time + + ***********************************************************************/ + + bool isEqual (UCalendar when) + { + return (this is when || getMillis == when.getMillis); + } + + /*********************************************************************** + + Returns true if this Calendar's current time is before + "when"'s current time + + ***********************************************************************/ + + bool isBefore (UCalendar when) + { + return (this !is when || getMillis < when.getMillis); + } + + /*********************************************************************** + + Returns true if this Calendar's current time is after + "when"'s current time + + ***********************************************************************/ + + bool isAfter (UCalendar when) + { + return (this !is when || getMillis > when.getMillis); + } + + /*********************************************************************** + + Add a specified signed amount to a particular field in a + UCalendar + + ***********************************************************************/ + + void add (DateFields field, uint amount) + { + UErrorCode e; + + ucal_add (handle, field, amount, e); + testError (e, "failed to add to calendar"); + } + + /*********************************************************************** + + Add a specified signed amount to a particular field in a + UCalendar + + ***********************************************************************/ + + void roll (DateFields field, uint amount) + { + UErrorCode e; + + ucal_roll (handle, field, amount, e); + testError (e, "failed to roll calendar"); + } + + /*********************************************************************** + + Get the current value of a field from a UCalendar + + ***********************************************************************/ + + uint get (DateFields field) + { + UErrorCode e; + + auto x = ucal_get (handle, field, e); + testError (e, "failed to get calendar field"); + return x; + } + + /*********************************************************************** + + Set the value of a field in a UCalendar + + ***********************************************************************/ + + void set (DateFields field, uint value) + { + ucal_set (handle, field, value); + } + + /*********************************************************************** + + Determine if a field in a UCalendar is set + + ***********************************************************************/ + + bool isSet (DateFields field) + { + return ucal_isSet (handle, field) != 0; + } + + /*********************************************************************** + + Clear a field in a UCalendar + + ***********************************************************************/ + + void clearField (DateFields field) + { + ucal_clearField (handle, field); + } + + /*********************************************************************** + + Clear all fields in a UCalendar + + ***********************************************************************/ + + void clear () + { + ucal_clear (handle); + } + + /*********************************************************************** + + Determine a limit for a field in a UCalendar. A limit is a + maximum or minimum value for a field + + ***********************************************************************/ + + uint getLimit (DateFields field, Limit type) + { + UErrorCode e; + + auto x = ucal_getLimit (handle, field, type, e); + testError (e, "failed to get calendar limit"); + return x; + } + + /*********************************************************************** + + ***********************************************************************/ + + uint getDaysInFirstWeek () + { + return ucal_getAttribute (handle, Attribute.MinimalDaysInFirstWeek); + } + + /*********************************************************************** + + ***********************************************************************/ + + uint getFirstDayOfWeek () + { + return ucal_getAttribute (handle, Attribute.FirstDayOfWeek); + } + + /*********************************************************************** + + ***********************************************************************/ + + void setDaysInFirstWeek (uint value) + { + ucal_setAttribute (handle, Attribute.MinimalDaysInFirstWeek, value); + } + + /*********************************************************************** + + ***********************************************************************/ + + void setFirstDayOfWeek (uint value) + { + ucal_setAttribute (handle, Attribute.FirstDayOfWeek, value); + } + + + /*********************************************************************** + + Bind the ICU functions from a shared library. This is + complicated by the issues regarding D and DLLs on the + Windows platform + + ***********************************************************************/ + + private static void* library; + + /*********************************************************************** + + ***********************************************************************/ + + private static extern (C) + { + Handle function (wchar*, uint, char*, Type, inout UErrorCode) ucal_open; + void function (Handle) ucal_close; + UDate function () ucal_getNow; + UDate function (Handle, inout UErrorCode) ucal_getMillis; + void function (Handle, UDate, inout UErrorCode) ucal_setMillis; + void function (Handle, uint, uint, uint, inout UErrorCode) ucal_setDate; + void function (Handle, uint, uint, uint, uint, uint, uint, inout UErrorCode) ucal_setDateTime; + byte function (Handle, Handle) ucal_equivalentTo; + void function (Handle, uint, uint, inout UErrorCode) ucal_add; + void function (Handle, uint, uint, inout UErrorCode) ucal_roll; + uint function (Handle, uint, inout UErrorCode) ucal_get; + void function (Handle, uint, uint) ucal_set; + byte function (Handle, uint) ucal_isSet; + void function (Handle, uint) ucal_clearField; + void function (Handle) ucal_clear; + uint function (Handle, uint, uint, inout UErrorCode) ucal_getLimit; + void function (Handle, wchar*, uint, inout UErrorCode) ucal_setTimeZone; + byte function (Handle, uint) ucal_inDaylightTime; + uint function (Handle, uint) ucal_getAttribute; + void function (Handle, uint, uint) ucal_setAttribute; + uint function (Handle, uint, char*, wchar*, uint, inout UErrorCode) ucal_getTimeZoneDisplayName; + } + + /*********************************************************************** + + ***********************************************************************/ + + static FunctionLoader.Bind[] targets = + [ + {cast(void**) &ucal_open, "ucal_open"}, + {cast(void**) &ucal_close, "ucal_close"}, + {cast(void**) &ucal_getNow, "ucal_getNow"}, + {cast(void**) &ucal_getMillis, "ucal_getMillis"}, + {cast(void**) &ucal_setMillis, "ucal_setMillis"}, + {cast(void**) &ucal_setDate, "ucal_setDate"}, + {cast(void**) &ucal_setDateTime, "ucal_setDateTime"}, + {cast(void**) &ucal_equivalentTo, "ucal_equivalentTo"}, + {cast(void**) &ucal_add, "ucal_add"}, + {cast(void**) &ucal_roll, "ucal_roll"}, + {cast(void**) &ucal_get, "ucal_get"}, + {cast(void**) &ucal_set, "ucal_set"}, + {cast(void**) &ucal_clearField, "ucal_clearField"}, + {cast(void**) &ucal_clear, "ucal_clear"}, + {cast(void**) &ucal_getLimit, "ucal_getLimit"}, + {cast(void**) &ucal_setTimeZone, "ucal_setTimeZone"}, + {cast(void**) &ucal_inDaylightTime, "ucal_inDaylightTime"}, + {cast(void**) &ucal_getAttribute, "ucal_getAttribute"}, + {cast(void**) &ucal_setAttribute, "ucal_setAttribute"}, + {cast(void**) &ucal_isSet, "ucal_isSet"}, + {cast(void**) &ucal_getTimeZoneDisplayName, "ucal_getTimeZoneDisplayName"}, + ]; + + /*********************************************************************** + + ***********************************************************************/ + + static this () + { + library = FunctionLoader.bind (icuin, targets); + } + + /*********************************************************************** + + ***********************************************************************/ + + static ~this () + { + FunctionLoader.unbind (library); + } + +}