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_H 135f757f3fSDimitry Andric #define _LIBCPP___CHRONO_TZDB_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 <__algorithm/ranges_lower_bound.h> 20*0fca6ea1SDimitry Andric # include <__chrono/leap_second.h> 21*0fca6ea1SDimitry Andric # include <__chrono/time_zone.h> 22*0fca6ea1SDimitry Andric # include <__chrono/time_zone_link.h> 23*0fca6ea1SDimitry Andric # include <__config> 245f757f3fSDimitry Andric # include <string> 25*0fca6ea1SDimitry Andric # include <vector> 265f757f3fSDimitry Andric 275f757f3fSDimitry Andric # if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 285f757f3fSDimitry Andric # pragma GCC system_header 295f757f3fSDimitry Andric # endif 305f757f3fSDimitry Andric 31*0fca6ea1SDimitry Andric _LIBCPP_PUSH_MACROS 32*0fca6ea1SDimitry Andric # include <__undef_macros> 33*0fca6ea1SDimitry Andric 345f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 355f757f3fSDimitry Andric 365f757f3fSDimitry Andric # if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && \ 375f757f3fSDimitry Andric !defined(_LIBCPP_HAS_NO_LOCALIZATION) 385f757f3fSDimitry Andric 395f757f3fSDimitry Andric namespace chrono { 405f757f3fSDimitry Andric 41*0fca6ea1SDimitry Andric struct tzdb { 425f757f3fSDimitry Andric string version; 43*0fca6ea1SDimitry Andric vector<time_zone> zones; 44*0fca6ea1SDimitry Andric vector<time_zone_link> links; 45*0fca6ea1SDimitry Andric 46*0fca6ea1SDimitry Andric vector<leap_second> leap_seconds; 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const time_zone* __locate_zone(string_view __name) const { 49*0fca6ea1SDimitry Andric if (const time_zone* __result = __find_in_zone(__name)) 50*0fca6ea1SDimitry Andric return __result; 51*0fca6ea1SDimitry Andric 52*0fca6ea1SDimitry Andric if (auto __it = ranges::lower_bound(links, __name, {}, &time_zone_link::name); 53*0fca6ea1SDimitry Andric __it != links.end() && __it->name() == __name) 54*0fca6ea1SDimitry Andric if (const time_zone* __result = __find_in_zone(__it->target())) 55*0fca6ea1SDimitry Andric return __result; 56*0fca6ea1SDimitry Andric 57*0fca6ea1SDimitry Andric return nullptr; 58*0fca6ea1SDimitry Andric } 59*0fca6ea1SDimitry Andric 60*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI const time_zone* locate_zone(string_view __name) const { 61*0fca6ea1SDimitry Andric if (const time_zone* __result = __locate_zone(__name)) 62*0fca6ea1SDimitry Andric return __result; 63*0fca6ea1SDimitry Andric 64*0fca6ea1SDimitry Andric std::__throw_runtime_error("tzdb: requested time zone not found"); 65*0fca6ea1SDimitry Andric } 66*0fca6ea1SDimitry Andric 67*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI const time_zone* current_zone() const { 68*0fca6ea1SDimitry Andric return __current_zone(); 69*0fca6ea1SDimitry Andric } 70*0fca6ea1SDimitry Andric 71*0fca6ea1SDimitry Andric private: 72*0fca6ea1SDimitry Andric _LIBCPP_HIDE_FROM_ABI const time_zone* __find_in_zone(string_view __name) const noexcept { 73*0fca6ea1SDimitry Andric if (auto __it = ranges::lower_bound(zones, __name, {}, &time_zone::name); 74*0fca6ea1SDimitry Andric __it != zones.end() && __it->name() == __name) 75*0fca6ea1SDimitry Andric return std::addressof(*__it); 76*0fca6ea1SDimitry Andric 77*0fca6ea1SDimitry Andric return nullptr; 78*0fca6ea1SDimitry Andric } 79*0fca6ea1SDimitry Andric 80*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const time_zone* __current_zone() const; 815f757f3fSDimitry Andric }; 825f757f3fSDimitry Andric 835f757f3fSDimitry Andric } // namespace chrono 845f757f3fSDimitry Andric 855f757f3fSDimitry Andric # endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) 865f757f3fSDimitry Andric // && !defined(_LIBCPP_HAS_NO_LOCALIZATION) 875f757f3fSDimitry Andric 885f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_STD 895f757f3fSDimitry Andric 90*0fca6ea1SDimitry Andric _LIBCPP_POP_MACROS 91*0fca6ea1SDimitry Andric 92*0fca6ea1SDimitry Andric #endif // !defined(_LIBCPP_HAS_NO_EXPERIMENTAL_TZDB) 935f757f3fSDimitry Andric 945f757f3fSDimitry Andric #endif // _LIBCPP___CHRONO_TZDB_H 95