92
|
1 /*******************************************************************************
|
|
2
|
|
3 @file UCalendar.d
|
|
4
|
|
5 Copyright (c) 2004 Kris Bell
|
|
6
|
|
7 This software is provided 'as-is', without any express or implied
|
|
8 warranty. In no event will the authors be held liable for damages
|
|
9 of any kind arising from the use of this software.
|
|
10
|
|
11 Permission is hereby granted to anyone to use this software for any
|
|
12 purpose, including commercial applications, and to alter it and/or
|
|
13 redistribute it freely, subject to the following restrictions:
|
|
14
|
|
15 1. The origin of this software must not be misrepresented; you must
|
|
16 not claim that you wrote the original software. If you use this
|
|
17 software in a product, an acknowledgment within documentation of
|
|
18 said product would be appreciated but is not required.
|
|
19
|
|
20 2. Altered source versions must be plainly marked as such, and must
|
|
21 not be misrepresented as being the original software.
|
|
22
|
|
23 3. This notice may not be removed or altered from any distribution
|
|
24 of the source.
|
|
25
|
|
26 4. Derivative works are permitted, but they must carry this notice
|
|
27 in full and credit the original source.
|
|
28
|
|
29
|
|
30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
31
|
|
32
|
|
33 @version Initial version, November 2004
|
|
34 @author Kris
|
|
35
|
|
36 Note that this package and documentation is built around the ICU
|
|
37 project (http://oss.software.ibm.com/icu/). Below is the license
|
|
38 statement as specified by that software:
|
|
39
|
|
40
|
|
41 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
42
|
|
43
|
|
44 ICU License - ICU 1.8.1 and later
|
|
45
|
|
46 COPYRIGHT AND PERMISSION NOTICE
|
|
47
|
|
48 Copyright (c) 1995-2003 International Business Machines Corporation and
|
|
49 others.
|
|
50
|
|
51 All rights reserved.
|
|
52
|
|
53 Permission is hereby granted, free of charge, to any person obtaining a
|
|
54 copy of this software and associated documentation files (the
|
|
55 "Software"), to deal in the Software without restriction, including
|
|
56 without limitation the rights to use, copy, modify, merge, publish,
|
|
57 distribute, and/or sell copies of the Software, and to permit persons
|
|
58 to whom the Software is furnished to do so, provided that the above
|
|
59 copyright notice(s) and this permission notice appear in all copies of
|
|
60 the Software and that both the above copyright notice(s) and this
|
|
61 permission notice appear in supporting documentation.
|
|
62
|
|
63 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
64 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
65 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
66 OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
|
67 HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
|
|
68 INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
|
|
69 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
70 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
|
71 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
72
|
|
73 Except as contained in this notice, the name of a copyright holder
|
|
74 shall not be used in advertising or otherwise to promote the sale, use
|
|
75 or other dealings in this Software without prior written authorization
|
|
76 of the copyright holder.
|
|
77
|
|
78 ----------------------------------------------------------------------
|
|
79
|
|
80 All trademarks and registered trademarks mentioned herein are the
|
|
81 property of their respective owners.
|
|
82
|
|
83 *******************************************************************************/
|
|
84
|
|
85 module dwtx.dwtxhelper.mangoicu.UCalendar;
|
|
86
|
|
87 private import dwtx.dwtxhelper.mangoicu.ICU,
|
|
88 dwtx.dwtxhelper.mangoicu.UString;
|
|
89
|
|
90 public import dwtx.dwtxhelper.mangoicu.ULocale,
|
|
91 dwtx.dwtxhelper.mangoicu.UTimeZone;
|
|
92
|
|
93 /*******************************************************************************
|
|
94
|
|
95 UCalendar is used for converting between a UDate object and
|
|
96 a set of integer fields such as Year, Month, Day,
|
|
97 Hour, and so on. (A UDate object represents a specific instant
|
|
98 in time with millisecond precision. See UDate for information about
|
|
99 the UDate)
|
|
100
|
|
101 Types of UCalendar interpret a UDate according to the rules of a
|
|
102 specific calendar system. UCalendar supports Traditional & Gregorian.
|
|
103
|
|
104 A UCalendar object can produce all the time field values needed to
|
|
105 implement the date-time formatting for a particular language and
|
|
106 calendar style (for example, Japanese-Gregorian, Japanese-Traditional).
|
|
107
|
|
108 When computing a UDate from time fields, two special circumstances
|
|
109 may arise: there may be insufficient information to compute the UDate
|
|
110 (such as only year and month but no day in the month), or there may be
|
|
111 inconsistent information (such as "Tuesday, July 15, 1996" -- July 15,
|
|
112 1996 is actually a Monday).
|
|
113
|
|
114 Insufficient information. The calendar will use default information
|
|
115 to specify the missing fields. This may vary by calendar; for the
|
|
116 Gregorian calendar, the default for a field is the same as that of
|
|
117 the start of the epoch: i.e., Year = 1970, Month = January,
|
|
118 Date = 1, etc.
|
|
119
|
|
120 Inconsistent information. If fields conflict, the calendar will give
|
|
121 preference to fields set more recently. For example, when determining
|
|
122 the day, the calendar will look for one of the following combinations
|
|
123 of fields. The most recent combination, as determined by the most
|
|
124 recently set single field, will be used.
|
|
125
|
|
126 See http://oss.software.ibm.com/icu/apiref/udat_8h.html for full
|
|
127 details.
|
|
128
|
|
129 *******************************************************************************/
|
|
130
|
|
131 class UCalendar : ICU
|
|
132 {
|
|
133 package Handle handle;
|
|
134
|
|
135 typedef double UDate;
|
|
136
|
|
137 //Possible types of UCalendars
|
|
138 public enum Type
|
|
139 {
|
|
140 Traditional,
|
|
141 Gregorian
|
|
142 }
|
|
143
|
|
144 // Possible fields in a UCalendar
|
|
145 public enum DateFields
|
|
146 {
|
|
147 Era,
|
|
148 Year,
|
|
149 Month,
|
|
150 WeekOfYear,
|
|
151 WeekOfMonth,
|
|
152 Date,
|
|
153 DayOfYear,
|
|
154 DayOfWeek,
|
|
155 DayOfWeekInMonth,
|
|
156 AmPm,
|
|
157 Hour,
|
|
158 HourOfDay,
|
|
159 Minute,
|
|
160 Second,
|
|
161 Millisecond,
|
|
162 ZoneOffset,
|
|
163 DstOffset,
|
|
164 YearWoy,
|
|
165 DowLocal,
|
|
166 ExtendedYear,
|
|
167 JulianDay,
|
|
168 MillisecondsInDay,
|
|
169 FieldCount,
|
|
170 DayOfMonth = Date
|
|
171 }
|
|
172
|
|
173 // Possible days of the week in a UCalendar
|
|
174 public enum DaysOfWeek
|
|
175 {
|
|
176 Sunday = 1,
|
|
177 Monday,
|
|
178 Tuesday,
|
|
179 Wednesday,
|
|
180 Thursday,
|
|
181 Friday,
|
|
182 Saturday
|
|
183 }
|
|
184
|
|
185 // Possible months in a UCalendar
|
|
186 public enum Months
|
|
187 {
|
|
188 January,
|
|
189 February,
|
|
190 March,
|
|
191 April,
|
|
192 May,
|
|
193 June,
|
|
194 July,
|
|
195 August,
|
|
196 September,
|
|
197 October,
|
|
198 November,
|
|
199 December,
|
|
200 UnDecimber
|
|
201 }
|
|
202
|
|
203 // Possible AM/PM values in a UCalendar
|
|
204 public enum AMPMs
|
|
205 {
|
|
206 AM,
|
|
207 PM
|
|
208 }
|
|
209
|
|
210 // Possible formats for a UCalendar's display name
|
|
211 public enum DisplayNameType
|
|
212 {
|
|
213 Standard,
|
|
214 ShortStandard,
|
|
215 DST,
|
|
216 ShortDST
|
|
217 }
|
|
218
|
|
219 // Possible limit values for a UCalendar
|
|
220 public enum Limit
|
|
221 {
|
|
222 Minimum,
|
|
223 Maximum,
|
|
224 GreatestMinimum,
|
|
225 LeastMaximum,
|
|
226 ActualMinimum,
|
|
227 ActualMaximum
|
|
228 }
|
|
229
|
|
230 // Types of UCalendar attributes
|
|
231 private enum Attribute
|
|
232 {
|
|
233 Lenient, // unused: set from UDateFormat instead
|
|
234 FirstDayOfWeek,
|
|
235 MinimalDaysInFirstWeek
|
|
236 }
|
|
237
|
|
238 /***********************************************************************
|
|
239
|
|
240 Open a UCalendar. A UCalendar may be used to convert a
|
|
241 millisecond value to a year, month, and day
|
|
242
|
|
243 ***********************************************************************/
|
|
244
|
|
245 this (inout UTimeZone zone, inout ULocale locale, Type type = Type.Traditional)
|
|
246 {
|
|
247 UErrorCode e;
|
|
248
|
|
249 handle = ucal_open (zone.name.ptr, zone.name.length, toString(locale.name), type, e);
|
|
250 testError (e, "failed to open calendar");
|
|
251 }
|
|
252
|
|
253 /***********************************************************************
|
|
254
|
|
255 Internal only: Open a UCalendar with the given handle
|
|
256
|
|
257 ***********************************************************************/
|
|
258
|
|
259 package this (Handle handle)
|
|
260 {
|
|
261 this.handle = handle;
|
|
262 }
|
|
263
|
|
264 /***********************************************************************
|
|
265
|
|
266 Close this UCalendar
|
|
267
|
|
268 ***********************************************************************/
|
|
269
|
|
270 ~this ()
|
|
271 {
|
|
272 ucal_close (handle);
|
|
273 }
|
|
274
|
|
275 /***********************************************************************
|
|
276
|
|
277 Set the TimeZone used by a UCalendar
|
|
278
|
|
279 ***********************************************************************/
|
|
280
|
|
281 void setTimeZone (inout UTimeZone zone)
|
|
282 {
|
|
283 UErrorCode e;
|
|
284
|
|
285 ucal_setTimeZone (handle, zone.name.ptr, zone.name.length, e);
|
|
286 testError (e, "failed to set calendar time zone");
|
|
287 }
|
|
288
|
|
289 /***********************************************************************
|
|
290
|
|
291 Get display name of the TimeZone used by this UCalendar
|
|
292
|
|
293 ***********************************************************************/
|
|
294
|
|
295 void getTimeZoneName (UString s, inout ULocale locale, DisplayNameType type=DisplayNameType.Standard)
|
|
296 {
|
|
297 uint format (wchar* dst, uint length, inout ICU.UErrorCode e)
|
|
298 {
|
|
299 return ucal_getTimeZoneDisplayName (handle, type, toString(locale.name), dst, length, e);
|
|
300 }
|
|
301
|
|
302 s.format (&format, "failed to get time zone name");
|
|
303 }
|
|
304
|
|
305 /***********************************************************************
|
|
306
|
|
307 Determine if a UCalendar is currently in daylight savings
|
|
308 time
|
|
309
|
|
310 ***********************************************************************/
|
|
311
|
|
312 bool inDaylightTime ()
|
|
313 {
|
|
314 UErrorCode e;
|
|
315
|
|
316 auto x = ucal_inDaylightTime (handle, e);
|
|
317 testError (e, "failed to test calendar daylight time");
|
|
318 return x != 0;
|
|
319 }
|
|
320
|
|
321 /***********************************************************************
|
|
322
|
|
323 Get the current date and time
|
|
324
|
|
325 ***********************************************************************/
|
|
326
|
|
327 UDate getNow ()
|
|
328 {
|
|
329 return ucal_getNow ();
|
|
330 }
|
|
331
|
|
332 /***********************************************************************
|
|
333
|
|
334 Get a UCalendar's current time in millis. The time is
|
|
335 represented as milliseconds from the epoch
|
|
336
|
|
337 ***********************************************************************/
|
|
338
|
|
339 UDate getMillis ()
|
|
340 {
|
|
341 UErrorCode e;
|
|
342
|
|
343 auto x = ucal_getMillis (handle, e);
|
|
344 testError (e, "failed to get time");
|
|
345 return x;
|
|
346 }
|
|
347
|
|
348 /***********************************************************************
|
|
349
|
|
350 Set a UCalendar's current time in millis. The time is
|
|
351 represented as milliseconds from the epoch
|
|
352
|
|
353 ***********************************************************************/
|
|
354
|
|
355 void setMillis (UDate date)
|
|
356 {
|
|
357 UErrorCode e;
|
|
358
|
|
359 ucal_setMillis (handle, date, e);
|
|
360 testError (e, "failed to set time");
|
|
361 }
|
|
362
|
|
363 /***********************************************************************
|
|
364
|
|
365 Set a UCalendar's current date
|
|
366
|
|
367 ***********************************************************************/
|
|
368
|
|
369 void setDate (uint year, Months month, uint date)
|
|
370 {
|
|
371 UErrorCode e;
|
|
372
|
|
373 ucal_setDate (handle, year, month, date, e);
|
|
374 testError (e, "failed to set date");
|
|
375 }
|
|
376
|
|
377 /***********************************************************************
|
|
378
|
|
379 Set a UCalendar's current date
|
|
380
|
|
381 ***********************************************************************/
|
|
382
|
|
383 void setDateTime (uint year, Months month, uint date, uint hour, uint minute, uint second)
|
|
384 {
|
|
385 UErrorCode e;
|
|
386
|
|
387 ucal_setDateTime (handle, year, month, date, hour, minute, second, e);
|
|
388 testError (e, "failed to set date/time");
|
|
389 }
|
|
390
|
|
391 /***********************************************************************
|
|
392
|
|
393 Returns TRUE if the given Calendar object is equivalent
|
|
394 to this one
|
|
395
|
|
396 ***********************************************************************/
|
|
397
|
|
398 bool isEquivalent (UCalendar when)
|
|
399 {
|
|
400 return ucal_equivalentTo (handle, when.handle) != 0;
|
|
401 }
|
|
402
|
|
403 /***********************************************************************
|
|
404
|
|
405 Compares the Calendar time
|
|
406
|
|
407 ***********************************************************************/
|
|
408
|
|
409 bool isEqual (UCalendar when)
|
|
410 {
|
|
411 return (this is when || getMillis == when.getMillis);
|
|
412 }
|
|
413
|
|
414 /***********************************************************************
|
|
415
|
|
416 Returns true if this Calendar's current time is before
|
|
417 "when"'s current time
|
|
418
|
|
419 ***********************************************************************/
|
|
420
|
|
421 bool isBefore (UCalendar when)
|
|
422 {
|
|
423 return (this !is when || getMillis < when.getMillis);
|
|
424 }
|
|
425
|
|
426 /***********************************************************************
|
|
427
|
|
428 Returns true if this Calendar's current time is after
|
|
429 "when"'s current time
|
|
430
|
|
431 ***********************************************************************/
|
|
432
|
|
433 bool isAfter (UCalendar when)
|
|
434 {
|
|
435 return (this !is when || getMillis > when.getMillis);
|
|
436 }
|
|
437
|
|
438 /***********************************************************************
|
|
439
|
|
440 Add a specified signed amount to a particular field in a
|
|
441 UCalendar
|
|
442
|
|
443 ***********************************************************************/
|
|
444
|
|
445 void add (DateFields field, uint amount)
|
|
446 {
|
|
447 UErrorCode e;
|
|
448
|
|
449 ucal_add (handle, field, amount, e);
|
|
450 testError (e, "failed to add to calendar");
|
|
451 }
|
|
452
|
|
453 /***********************************************************************
|
|
454
|
|
455 Add a specified signed amount to a particular field in a
|
|
456 UCalendar
|
|
457
|
|
458 ***********************************************************************/
|
|
459
|
|
460 void roll (DateFields field, uint amount)
|
|
461 {
|
|
462 UErrorCode e;
|
|
463
|
|
464 ucal_roll (handle, field, amount, e);
|
|
465 testError (e, "failed to roll calendar");
|
|
466 }
|
|
467
|
|
468 /***********************************************************************
|
|
469
|
|
470 Get the current value of a field from a UCalendar
|
|
471
|
|
472 ***********************************************************************/
|
|
473
|
|
474 uint get (DateFields field)
|
|
475 {
|
|
476 UErrorCode e;
|
|
477
|
|
478 auto x = ucal_get (handle, field, e);
|
|
479 testError (e, "failed to get calendar field");
|
|
480 return x;
|
|
481 }
|
|
482
|
|
483 /***********************************************************************
|
|
484
|
|
485 Set the value of a field in a UCalendar
|
|
486
|
|
487 ***********************************************************************/
|
|
488
|
|
489 void set (DateFields field, uint value)
|
|
490 {
|
|
491 ucal_set (handle, field, value);
|
|
492 }
|
|
493
|
|
494 /***********************************************************************
|
|
495
|
|
496 Determine if a field in a UCalendar is set
|
|
497
|
|
498 ***********************************************************************/
|
|
499
|
|
500 bool isSet (DateFields field)
|
|
501 {
|
|
502 return ucal_isSet (handle, field) != 0;
|
|
503 }
|
|
504
|
|
505 /***********************************************************************
|
|
506
|
|
507 Clear a field in a UCalendar
|
|
508
|
|
509 ***********************************************************************/
|
|
510
|
|
511 void clearField (DateFields field)
|
|
512 {
|
|
513 ucal_clearField (handle, field);
|
|
514 }
|
|
515
|
|
516 /***********************************************************************
|
|
517
|
|
518 Clear all fields in a UCalendar
|
|
519
|
|
520 ***********************************************************************/
|
|
521
|
|
522 void clear ()
|
|
523 {
|
|
524 ucal_clear (handle);
|
|
525 }
|
|
526
|
|
527 /***********************************************************************
|
|
528
|
|
529 Determine a limit for a field in a UCalendar. A limit is a
|
|
530 maximum or minimum value for a field
|
|
531
|
|
532 ***********************************************************************/
|
|
533
|
|
534 uint getLimit (DateFields field, Limit type)
|
|
535 {
|
|
536 UErrorCode e;
|
|
537
|
|
538 auto x = ucal_getLimit (handle, field, type, e);
|
|
539 testError (e, "failed to get calendar limit");
|
|
540 return x;
|
|
541 }
|
|
542
|
|
543 /***********************************************************************
|
|
544
|
|
545 ***********************************************************************/
|
|
546
|
|
547 uint getDaysInFirstWeek ()
|
|
548 {
|
|
549 return ucal_getAttribute (handle, Attribute.MinimalDaysInFirstWeek);
|
|
550 }
|
|
551
|
|
552 /***********************************************************************
|
|
553
|
|
554 ***********************************************************************/
|
|
555
|
|
556 uint getFirstDayOfWeek ()
|
|
557 {
|
|
558 return ucal_getAttribute (handle, Attribute.FirstDayOfWeek);
|
|
559 }
|
|
560
|
|
561 /***********************************************************************
|
|
562
|
|
563 ***********************************************************************/
|
|
564
|
|
565 void setDaysInFirstWeek (uint value)
|
|
566 {
|
|
567 ucal_setAttribute (handle, Attribute.MinimalDaysInFirstWeek, value);
|
|
568 }
|
|
569
|
|
570 /***********************************************************************
|
|
571
|
|
572 ***********************************************************************/
|
|
573
|
|
574 void setFirstDayOfWeek (uint value)
|
|
575 {
|
|
576 ucal_setAttribute (handle, Attribute.FirstDayOfWeek, value);
|
|
577 }
|
|
578
|
|
579
|
|
580 /***********************************************************************
|
|
581
|
|
582 Bind the ICU functions from a shared library. This is
|
|
583 complicated by the issues regarding D and DLLs on the
|
|
584 Windows platform
|
|
585
|
|
586 ***********************************************************************/
|
|
587
|
|
588 private static void* library;
|
|
589
|
|
590 /***********************************************************************
|
|
591
|
|
592 ***********************************************************************/
|
|
593
|
|
594 private static extern (C)
|
|
595 {
|
|
596 Handle function (wchar*, uint, char*, Type, inout UErrorCode) ucal_open;
|
|
597 void function (Handle) ucal_close;
|
|
598 UDate function () ucal_getNow;
|
|
599 UDate function (Handle, inout UErrorCode) ucal_getMillis;
|
|
600 void function (Handle, UDate, inout UErrorCode) ucal_setMillis;
|
|
601 void function (Handle, uint, uint, uint, inout UErrorCode) ucal_setDate;
|
|
602 void function (Handle, uint, uint, uint, uint, uint, uint, inout UErrorCode) ucal_setDateTime;
|
|
603 byte function (Handle, Handle) ucal_equivalentTo;
|
|
604 void function (Handle, uint, uint, inout UErrorCode) ucal_add;
|
|
605 void function (Handle, uint, uint, inout UErrorCode) ucal_roll;
|
|
606 uint function (Handle, uint, inout UErrorCode) ucal_get;
|
|
607 void function (Handle, uint, uint) ucal_set;
|
|
608 byte function (Handle, uint) ucal_isSet;
|
|
609 void function (Handle, uint) ucal_clearField;
|
|
610 void function (Handle) ucal_clear;
|
|
611 uint function (Handle, uint, uint, inout UErrorCode) ucal_getLimit;
|
|
612 void function (Handle, wchar*, uint, inout UErrorCode) ucal_setTimeZone;
|
|
613 byte function (Handle, uint) ucal_inDaylightTime;
|
|
614 uint function (Handle, uint) ucal_getAttribute;
|
|
615 void function (Handle, uint, uint) ucal_setAttribute;
|
|
616 uint function (Handle, uint, char*, wchar*, uint, inout UErrorCode) ucal_getTimeZoneDisplayName;
|
|
617 }
|
|
618
|
|
619 /***********************************************************************
|
|
620
|
|
621 ***********************************************************************/
|
|
622
|
|
623 static FunctionLoader.Bind[] targets =
|
|
624 [
|
|
625 {cast(void**) &ucal_open, "ucal_open"},
|
|
626 {cast(void**) &ucal_close, "ucal_close"},
|
|
627 {cast(void**) &ucal_getNow, "ucal_getNow"},
|
|
628 {cast(void**) &ucal_getMillis, "ucal_getMillis"},
|
|
629 {cast(void**) &ucal_setMillis, "ucal_setMillis"},
|
|
630 {cast(void**) &ucal_setDate, "ucal_setDate"},
|
|
631 {cast(void**) &ucal_setDateTime, "ucal_setDateTime"},
|
|
632 {cast(void**) &ucal_equivalentTo, "ucal_equivalentTo"},
|
|
633 {cast(void**) &ucal_add, "ucal_add"},
|
|
634 {cast(void**) &ucal_roll, "ucal_roll"},
|
|
635 {cast(void**) &ucal_get, "ucal_get"},
|
|
636 {cast(void**) &ucal_set, "ucal_set"},
|
|
637 {cast(void**) &ucal_clearField, "ucal_clearField"},
|
|
638 {cast(void**) &ucal_clear, "ucal_clear"},
|
|
639 {cast(void**) &ucal_getLimit, "ucal_getLimit"},
|
|
640 {cast(void**) &ucal_setTimeZone, "ucal_setTimeZone"},
|
|
641 {cast(void**) &ucal_inDaylightTime, "ucal_inDaylightTime"},
|
|
642 {cast(void**) &ucal_getAttribute, "ucal_getAttribute"},
|
|
643 {cast(void**) &ucal_setAttribute, "ucal_setAttribute"},
|
|
644 {cast(void**) &ucal_isSet, "ucal_isSet"},
|
|
645 {cast(void**) &ucal_getTimeZoneDisplayName, "ucal_getTimeZoneDisplayName"},
|
|
646 ];
|
|
647
|
|
648 /***********************************************************************
|
|
649
|
|
650 ***********************************************************************/
|
|
651
|
|
652 static this ()
|
|
653 {
|
|
654 library = FunctionLoader.bind (icuin, targets);
|
|
655 }
|
|
656
|
|
657 /***********************************************************************
|
|
658
|
|
659 ***********************************************************************/
|
|
660
|
|
661 static ~this ()
|
|
662 {
|
|
663 FunctionLoader.unbind (library);
|
|
664 }
|
|
665
|
|
666 }
|