This is the first step to implement time zone support in libc++. This adds the complete tzdb_list class and a minimal tzdb class. The tzdb class only contains the version, which is used by reload_tzdb. Next to these classes it contains documentation and build system support needed for time zone support. The code depends on the IANA Time Zone Database, which should be available on the platform used or provided by the libc++ vendors. The code is labeled as experimental since there will be ABI breaks during development; the tzdb class needs to have the standard headers. Implements parts of: - P0355 Extending <chrono> to Calendars and Time Zones Addresses: - LWG3319 Properly reference specification of IANA time zone database Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D154282
293 lines
8.4 KiB
C++
293 lines
8.4 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
export namespace std {
|
|
|
|
namespace chrono {
|
|
using std::chrono::duration;
|
|
using std::chrono::time_point;
|
|
|
|
} // namespace chrono
|
|
|
|
using std::common_type;
|
|
|
|
namespace chrono {
|
|
|
|
// [time.traits], customization traits
|
|
using std::chrono::treat_as_floating_point;
|
|
using std::chrono::treat_as_floating_point_v;
|
|
|
|
using std::chrono::duration_values;
|
|
|
|
// using std::chrono::is_clock;
|
|
// using std::chrono::is_clock_v;
|
|
|
|
// [time.duration.nonmember], duration arithmetic
|
|
using std::chrono::operator+;
|
|
using std::chrono::operator-;
|
|
using std::chrono::operator*;
|
|
using std::chrono::operator/;
|
|
using std::chrono::operator%;
|
|
|
|
// [time.duration.comparisons], duration comparisons
|
|
using std::chrono::operator==;
|
|
using std::chrono::operator!=;
|
|
using std::chrono::operator<;
|
|
using std::chrono::operator>;
|
|
using std::chrono::operator<=;
|
|
using std::chrono::operator>=;
|
|
using std::chrono::operator<=>;
|
|
|
|
// [time.duration.cast], conversions
|
|
using std::chrono::ceil;
|
|
using std::chrono::duration_cast;
|
|
using std::chrono::floor;
|
|
using std::chrono::round;
|
|
|
|
// [time.duration.io], duration I/O
|
|
#ifndef _LIBCPP_HAS_NO_LOCALIZATION
|
|
using std::chrono::operator<<;
|
|
#endif
|
|
// using std::chrono::from_stream;
|
|
|
|
// convenience typedefs
|
|
using std::chrono::days;
|
|
using std::chrono::hours;
|
|
using std::chrono::microseconds;
|
|
using std::chrono::milliseconds;
|
|
using std::chrono::minutes;
|
|
using std::chrono::months;
|
|
using std::chrono::nanoseconds;
|
|
using std::chrono::seconds;
|
|
using std::chrono::weeks;
|
|
using std::chrono::years;
|
|
|
|
// [time.point.nonmember], time_point arithmetic
|
|
|
|
// [time.point.comparisons], time_point comparisons
|
|
|
|
// [time.point.cast], conversions
|
|
using std::chrono::time_point_cast;
|
|
|
|
// [time.duration.alg], specialized algorithms
|
|
using std::chrono::abs;
|
|
|
|
// [time.clock.system], class system_clock
|
|
using std::chrono::system_clock;
|
|
|
|
using std::chrono::sys_days;
|
|
using std::chrono::sys_seconds;
|
|
using std::chrono::sys_time;
|
|
|
|
#if 0
|
|
// [time.clock.utc], class utc_clock
|
|
using std::chrono::utc_clock;
|
|
|
|
using std::chrono::utc_seconds;
|
|
using std::chrono::utc_time;
|
|
|
|
using std::chrono::leap_second_info;
|
|
|
|
using std::chrono::get_leap_second_info;
|
|
// [time.clock.tai], class tai_clock
|
|
using std::chrono::tai_clock;
|
|
|
|
using std::chrono::tai_seconds;
|
|
using std::chrono::tai_time;
|
|
|
|
// [time.clock.gps], class gps_clock
|
|
using std::chrono::gps_clock;
|
|
|
|
using std::chrono::gps_seconds;
|
|
using std::chrono::gps_time;
|
|
#endif
|
|
// [time.clock.file], type file_clock
|
|
using std::chrono::file_clock;
|
|
|
|
using std::chrono::file_time;
|
|
|
|
#ifndef _LIBCPP_HAS_NO_MONOTONIC_CLOCK
|
|
// [time.clock.steady], class steady_clock
|
|
using std::chrono::steady_clock;
|
|
#endif
|
|
|
|
// [time.clock.hires], class high_resolution_clock
|
|
using std::chrono::high_resolution_clock;
|
|
|
|
// [time.clock.local], local time
|
|
using std::chrono::local_days;
|
|
using std::chrono::local_seconds;
|
|
using std::chrono::local_t;
|
|
using std::chrono::local_time;
|
|
|
|
// [time.clock.cast], time_point conversions
|
|
// using std::chrono::clock_time_conversion;
|
|
|
|
// using std::chrono::clock_cast;
|
|
|
|
// [time.cal.last], class last_spec
|
|
using std::chrono::last_spec;
|
|
|
|
// [time.cal.day], class day
|
|
using std::chrono::day;
|
|
|
|
// [time.cal.month], class month
|
|
using std::chrono::month;
|
|
|
|
// [time.cal.year], class year
|
|
using std::chrono::year;
|
|
|
|
// [time.cal.wd], class weekday
|
|
using std::chrono::weekday;
|
|
|
|
// [time.cal.wdidx], class weekday_indexed
|
|
using std::chrono::weekday_indexed;
|
|
|
|
// [time.cal.wdlast], class weekday_last
|
|
using std::chrono::weekday_last;
|
|
|
|
// [time.cal.md], class month_day
|
|
using std::chrono::month_day;
|
|
|
|
// [time.cal.mdlast], class month_day_last
|
|
using std::chrono::month_day_last;
|
|
|
|
// [time.cal.mwd], class month_weekday
|
|
using std::chrono::month_weekday;
|
|
|
|
// [time.cal.mwdlast], class month_weekday_last
|
|
using std::chrono::month_weekday_last;
|
|
|
|
// [time.cal.ym], class year_month
|
|
using std::chrono::year_month;
|
|
|
|
// [time.cal.ymd], class year_month_day
|
|
using std::chrono::year_month_day;
|
|
|
|
// [time.cal.ymdlast], class year_month_day_last
|
|
using std::chrono::year_month_day_last;
|
|
|
|
// [time.cal.ymwd], class year_month_weekday
|
|
using std::chrono::year_month_weekday;
|
|
|
|
// [time.cal.ymwdlast], class year_month_weekday_last
|
|
using std::chrono::year_month_weekday_last;
|
|
|
|
// [time.cal.operators], civil calendar conventional syntax operators
|
|
|
|
// [time.hms], class template hh_mm_ss
|
|
using std::chrono::hh_mm_ss;
|
|
|
|
// [time.12], 12/24 hour functions
|
|
using std::chrono::is_am;
|
|
using std::chrono::is_pm;
|
|
using std::chrono::make12;
|
|
using std::chrono::make24;
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && \
|
|
!defined(_LIBCPP_HAS_NO_LOCALIZATION)
|
|
|
|
// [time.zone.db], time zone database
|
|
using std::chrono::tzdb;
|
|
using std::chrono::tzdb_list;
|
|
|
|
// [time.zone.db.access], time zone database access
|
|
// using std::chrono::current_zone;
|
|
using std::chrono::get_tzdb;
|
|
using std::chrono::get_tzdb_list;
|
|
// using std::chrono::locate_zone;
|
|
|
|
// [time.zone.db.remote], remote time zone database support
|
|
using std::chrono::reload_tzdb;
|
|
using std::chrono::remote_version;
|
|
|
|
#endif // !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) &&
|
|
// !defined(_LIBCPP_HAS_NO_LOCALIZATION)
|
|
|
|
#if 0
|
|
// [time.zone.exception], exception classes
|
|
using std::chrono::ambiguous_local_time;
|
|
using std::chrono::nonexistent_local_time;
|
|
|
|
// [time.zone.info], information classes
|
|
using std::chrono::sys_info;
|
|
|
|
// [time.zone.timezone], class time_zone
|
|
using std::chrono::choose;
|
|
using std::chrono::time_zone;
|
|
|
|
// [time.zone.zonedtraits], class template zoned_traits
|
|
using std::chrono::zoned_traits;
|
|
|
|
// [time.zone.zonedtime], class template zoned_time
|
|
using std::chrono::zoned_time;
|
|
|
|
using std::chrono::zoned_seconds;
|
|
|
|
// [time.zone.leap], leap second support
|
|
using std::chrono::leap_second;
|
|
|
|
// [time.zone.link], class time_zone_link
|
|
using std::chrono::time_zone_link;
|
|
|
|
// [time.format], formatting
|
|
using std::chrono::local_time_format;
|
|
#endif
|
|
} // namespace chrono
|
|
|
|
#ifndef _LIBCPP_HAS_NO_LOCALIZATION
|
|
using std::formatter;
|
|
#endif // _LIBCPP_HAS_NO_LOCALIZATION
|
|
|
|
namespace chrono {
|
|
// using std::chrono::parse;
|
|
|
|
// calendrical constants
|
|
using std::chrono::last;
|
|
|
|
using std::chrono::Friday;
|
|
using std::chrono::Monday;
|
|
using std::chrono::Saturday;
|
|
using std::chrono::Sunday;
|
|
using std::chrono::Thursday;
|
|
using std::chrono::Tuesday;
|
|
using std::chrono::Wednesday;
|
|
|
|
using std::chrono::April;
|
|
using std::chrono::August;
|
|
using std::chrono::December;
|
|
using std::chrono::February;
|
|
using std::chrono::January;
|
|
using std::chrono::July;
|
|
using std::chrono::June;
|
|
using std::chrono::March;
|
|
using std::chrono::May;
|
|
using std::chrono::November;
|
|
using std::chrono::October;
|
|
using std::chrono::September;
|
|
|
|
} // namespace chrono
|
|
|
|
} // namespace std
|
|
export namespace std::inline literals::inline chrono_literals {
|
|
// [time.duration.literals], suffixes for duration literals
|
|
using std::literals::chrono_literals::operator""h;
|
|
using std::literals::chrono_literals::operator""min;
|
|
using std::literals::chrono_literals::operator""s;
|
|
using std::literals::chrono_literals::operator""ms;
|
|
using std::literals::chrono_literals::operator""us;
|
|
using std::literals::chrono_literals::operator""ns;
|
|
|
|
// [using std::literals::chrono_literals::.cal.day.nonmembers], non-member functions
|
|
using std::literals::chrono_literals::operator""d;
|
|
|
|
// [using std::literals::chrono_literals::.cal.year.nonmembers], non-member functions
|
|
using std::literals::chrono_literals::operator""y;
|
|
} // namespace std::inline literals::inline chrono_literals
|