15f757f3fSDimitry Andric // -*- C++ -*- 25f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 35f757f3fSDimitry Andric // 45f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 55f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 65f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 75f757f3fSDimitry Andric // 85f757f3fSDimitry Andric //===----------------------------------------------------------------------===// 95f757f3fSDimitry Andric 105f757f3fSDimitry Andric // For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html 115f757f3fSDimitry Andric 125f757f3fSDimitry Andric #ifndef _LIBCPP___CHRONO_TZDB_LIST_H 135f757f3fSDimitry Andric #define _LIBCPP___CHRONO_TZDB_LIST_H 145f757f3fSDimitry Andric 155f757f3fSDimitry Andric #include <version> 165f757f3fSDimitry Andric // Enable the contents of the header only when libc++ was built with experimental features enabled. 17*0fca6ea1SDimitry Andric #if !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_TZDB) 185f757f3fSDimitry Andric 19*0fca6ea1SDimitry Andric # include <__chrono/time_zone.h> 205f757f3fSDimitry Andric # include <__chrono/tzdb.h> 21*0fca6ea1SDimitry Andric # include <__config> 22*0fca6ea1SDimitry Andric # include <__fwd/string.h> 235f757f3fSDimitry Andric # include <forward_list> 245f757f3fSDimitry Andric 255f757f3fSDimitry Andric # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 265f757f3fSDimitry Andric # pragma GCC system_header 275f757f3fSDimitry Andric # endif 285f757f3fSDimitry Andric 295f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 305f757f3fSDimitry Andric 315f757f3fSDimitry Andric # if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && \ 325f757f3fSDimitry Andric !defined(_LIBCPP_HAS_NO_LOCALIZATION) 335f757f3fSDimitry Andric 345f757f3fSDimitry Andric namespace chrono { 355f757f3fSDimitry Andric 36*0fca6ea1SDimitry Andric // TODO TZDB 37*0fca6ea1SDimitry Andric // Libc++ recently switched to only export __ugly_names from the dylib. 38*0fca6ea1SDimitry Andric // Since the library is still experimental the functions in this header 39*0fca6ea1SDimitry Andric // should be adapted to this new style. The other tzdb headers should be 40*0fca6ea1SDimitry Andric // evaluated too. 41*0fca6ea1SDimitry Andric 425f757f3fSDimitry Andric class _LIBCPP_AVAILABILITY_TZDB tzdb_list { 435f757f3fSDimitry Andric public: 44*0fca6ea1SDimitry Andric class __impl; // public to allow construction in dylib 45*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI explicit tzdb_list(__impl* __p) : __impl_(__p) { 46*0fca6ea1SDimitry Andric _LIBCPP_ASSERT_NON_NULL(__impl_ != nullptr, "initialized time_zone without a valid pimpl object"); 47*0fca6ea1SDimitry Andric } 485f757f3fSDimitry Andric _LIBCPP_EXPORTED_FROM_ABI ~tzdb_list(); 495f757f3fSDimitry Andric 505f757f3fSDimitry Andric tzdb_list(const tzdb_list&) = delete; 515f757f3fSDimitry Andric tzdb_list& operator=(const tzdb_list&) = delete; 525f757f3fSDimitry Andric 535f757f3fSDimitry Andric using const_iterator = forward_list<tzdb>::const_iterator; 545f757f3fSDimitry Andric 55*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const tzdb& front() const noexcept { return __front(); } 565f757f3fSDimitry Andric 57*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI const_iterator erase_after(const_iterator __p) { return __erase_after(__p); } 585f757f3fSDimitry Andric 59*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const_iterator begin() const noexcept { return __begin(); } 60*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const_iterator end() const noexcept { return __end(); } 615f757f3fSDimitry Andric 62*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const noexcept { return __cbegin(); } 63*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const_iterator cend() const noexcept { return __cend(); } 645f757f3fSDimitry Andric 65*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI __impl& __implementation() { return *__impl_; } 665f757f3fSDimitry Andric 675f757f3fSDimitry Andric private: 68*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI const tzdb& __front() const noexcept; 69*0fca6ea1SDimitry Andric 70*0fca6ea1SDimitry Andric _LIBCPP_EXPORTED_FROM_ABI const_iterator __erase_after(const_iterator __p); 71*0fca6ea1SDimitry Andric 72*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI const_iterator __begin() const noexcept; 73*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI const_iterator __end() const noexcept; 74*0fca6ea1SDimitry Andric 75*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI const_iterator __cbegin() const noexcept; 76*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI const_iterator __cend() const noexcept; 77*0fca6ea1SDimitry Andric 785f757f3fSDimitry Andric __impl* __impl_; 795f757f3fSDimitry Andric }; 805f757f3fSDimitry Andric 81*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI tzdb_list& get_tzdb_list(); 825f757f3fSDimitry Andric 83*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline const tzdb& get_tzdb() { 845f757f3fSDimitry Andric return get_tzdb_list().front(); 855f757f3fSDimitry Andric } 865f757f3fSDimitry Andric 87*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline const time_zone* locate_zone(string_view __name) { 88*0fca6ea1SDimitry Andric return get_tzdb().locate_zone(__name); 89*0fca6ea1SDimitry Andric } 90*0fca6ea1SDimitry Andric 91*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline const time_zone* current_zone() { 92*0fca6ea1SDimitry Andric return get_tzdb().current_zone(); 93*0fca6ea1SDimitry Andric } 94*0fca6ea1SDimitry Andric 955f757f3fSDimitry Andric _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const tzdb& reload_tzdb(); 965f757f3fSDimitry Andric 97*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI string remote_version(); 985f757f3fSDimitry Andric 995f757f3fSDimitry Andric } // namespace chrono 1005f757f3fSDimitry Andric 1015f757f3fSDimitry Andric # endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) 1025f757f3fSDimitry Andric // && !defined(_LIBCPP_HAS_NO_LOCALIZATION) 1035f757f3fSDimitry Andric 1045f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_STD 1055f757f3fSDimitry Andric 106*0fca6ea1SDimitry Andric #endif // !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_TZDB) 1075f757f3fSDimitry Andric 1085f757f3fSDimitry Andric #endif // _LIBCPP___CHRONO_TZDB_LIST_H 109