1*5f757f3fSDimitry Andric // -*- C++ -*-
2*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
3*5f757f3fSDimitry Andric //
4*5f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*5f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
6*5f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*5f757f3fSDimitry Andric //
8*5f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
9*5f757f3fSDimitry Andric 
10*5f757f3fSDimitry Andric // For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html
11*5f757f3fSDimitry Andric 
12*5f757f3fSDimitry Andric #ifndef _LIBCPP___CHRONO_TZDB_LIST_H
13*5f757f3fSDimitry Andric #define _LIBCPP___CHRONO_TZDB_LIST_H
14*5f757f3fSDimitry Andric 
15*5f757f3fSDimitry Andric #include <version>
16*5f757f3fSDimitry Andric // Enable the contents of the header only when libc++ was built with experimental features enabled.
17*5f757f3fSDimitry Andric #if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB)
18*5f757f3fSDimitry Andric 
19*5f757f3fSDimitry Andric #  include <__availability>
20*5f757f3fSDimitry Andric #  include <__chrono/tzdb.h>
21*5f757f3fSDimitry Andric #  include <forward_list>
22*5f757f3fSDimitry Andric #  include <string_view>
23*5f757f3fSDimitry Andric 
24*5f757f3fSDimitry Andric #  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
25*5f757f3fSDimitry Andric #    pragma GCC system_header
26*5f757f3fSDimitry Andric #  endif
27*5f757f3fSDimitry Andric 
28*5f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
29*5f757f3fSDimitry Andric 
30*5f757f3fSDimitry Andric #  if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) &&   \
31*5f757f3fSDimitry Andric       !defined(_LIBCPP_HAS_NO_LOCALIZATION)
32*5f757f3fSDimitry Andric 
33*5f757f3fSDimitry Andric namespace chrono {
34*5f757f3fSDimitry Andric 
35*5f757f3fSDimitry Andric class _LIBCPP_AVAILABILITY_TZDB tzdb_list {
36*5f757f3fSDimitry Andric public:
37*5f757f3fSDimitry Andric   _LIBCPP_EXPORTED_FROM_ABI explicit tzdb_list(tzdb&& __tzdb);
38*5f757f3fSDimitry Andric   _LIBCPP_EXPORTED_FROM_ABI ~tzdb_list();
39*5f757f3fSDimitry Andric 
40*5f757f3fSDimitry Andric   tzdb_list(const tzdb_list&)            = delete;
41*5f757f3fSDimitry Andric   tzdb_list& operator=(const tzdb_list&) = delete;
42*5f757f3fSDimitry Andric 
43*5f757f3fSDimitry Andric   using const_iterator = forward_list<tzdb>::const_iterator;
44*5f757f3fSDimitry Andric 
45*5f757f3fSDimitry Andric   _LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const tzdb& front() const noexcept;
46*5f757f3fSDimitry Andric 
47*5f757f3fSDimitry Andric   _LIBCPP_EXPORTED_FROM_ABI const_iterator erase_after(const_iterator __p);
48*5f757f3fSDimitry Andric 
49*5f757f3fSDimitry Andric   _LIBCPP_EXPORTED_FROM_ABI tzdb& __emplace_front(tzdb&& __tzdb);
50*5f757f3fSDimitry Andric 
51*5f757f3fSDimitry Andric   _LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator begin() const noexcept;
52*5f757f3fSDimitry Andric   _LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator end() const noexcept;
53*5f757f3fSDimitry Andric 
54*5f757f3fSDimitry Andric   _LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator cbegin() const noexcept;
55*5f757f3fSDimitry Andric   _LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator cend() const noexcept;
56*5f757f3fSDimitry Andric 
57*5f757f3fSDimitry Andric private:
58*5f757f3fSDimitry Andric   class __impl;
59*5f757f3fSDimitry Andric   __impl* __impl_;
60*5f757f3fSDimitry Andric };
61*5f757f3fSDimitry Andric 
62*5f757f3fSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI tzdb_list& get_tzdb_list();
63*5f757f3fSDimitry Andric 
get_tzdb()64*5f757f3fSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline const tzdb& get_tzdb() {
65*5f757f3fSDimitry Andric   return get_tzdb_list().front();
66*5f757f3fSDimitry Andric }
67*5f757f3fSDimitry Andric 
68*5f757f3fSDimitry Andric _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI const tzdb& reload_tzdb();
69*5f757f3fSDimitry Andric 
70*5f757f3fSDimitry Andric _LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_EXPORTED_FROM_ABI string remote_version();
71*5f757f3fSDimitry Andric 
72*5f757f3fSDimitry Andric } // namespace chrono
73*5f757f3fSDimitry Andric 
74*5f757f3fSDimitry Andric #  endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM)
75*5f757f3fSDimitry Andric          // && !defined(_LIBCPP_HAS_NO_LOCALIZATION)
76*5f757f3fSDimitry Andric 
77*5f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_STD
78*5f757f3fSDimitry Andric 
79*5f757f3fSDimitry Andric #endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB)
80*5f757f3fSDimitry Andric 
81*5f757f3fSDimitry Andric #endif // _LIBCPP___CHRONO_TZDB_LIST_H
82