xref: /freebsd-src/contrib/llvm-project/libcxx/include/__chrono/tzdb.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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