-
Notifications
You must be signed in to change notification settings - Fork 14.6k
[libc++][chrono] Loads tzdata.zi in tzdb. #74928
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
// -*- 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
// For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html | ||
|
||
#ifndef _LIBCPP___CHRONO_TIME_ZONE_H | ||
#define _LIBCPP___CHRONO_TIME_ZONE_H | ||
|
||
#include <version> | ||
// Enable the contents of the header only when libc++ was built with experimental features enabled. | ||
#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) | ||
|
||
# include <__compare/strong_order.h> | ||
# include <__config> | ||
# include <__memory/unique_ptr.h> | ||
# include <string_view> | ||
|
||
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||
# pragma GCC system_header | ||
# endif | ||
|
||
_LIBCPP_PUSH_MACROS | ||
# include <__undef_macros> | ||
|
||
_LIBCPP_BEGIN_NAMESPACE_STD | ||
|
||
# if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && \ | ||
!defined(_LIBCPP_HAS_NO_LOCALIZATION) | ||
|
||
namespace chrono { | ||
|
||
class _LIBCPP_AVAILABILITY_TZDB time_zone { | ||
ldionne marked this conversation as resolved.
Show resolved
Hide resolved
|
||
_LIBCPP_HIDE_FROM_ABI time_zone() = default; | ||
|
||
public: | ||
class __impl; // public so it can be used by make_unique. | ||
|
||
// The "constructor". | ||
// | ||
// The default constructor is private to avoid the constructor from being an | ||
// ABI interface. Instead use an __ugly_named function as an ABI interface, | ||
// since users should not depend on __ugly_names. | ||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
[[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI static time_zone __create(unique_ptr<__impl>&& __p); | ||
|
||
_LIBCPP_EXPORTED_FROM_ABI ~time_zone(); | ||
|
||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
_LIBCPP_HIDE_FROM_ABI time_zone(time_zone&&) = default; | ||
_LIBCPP_HIDE_FROM_ABI time_zone& operator=(time_zone&&) = default; | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI string_view name() const noexcept { return __name(); } | ||
|
||
[[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI const __impl& __implementation() const noexcept; | ||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
// private: | ||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
[[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI string_view __name() const noexcept; | ||
unique_ptr<__impl> __impl_; | ||
}; | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline bool | ||
operator==(const time_zone& __x, const time_zone& __y) noexcept { | ||
return __x.name() == __y.name(); | ||
} | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline strong_ordering | ||
operator<=>(const time_zone& __x, const time_zone& __y) noexcept { | ||
return __x.name() <=> __y.name(); | ||
} | ||
|
||
} // namespace chrono | ||
|
||
# endif // _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) | ||
// && !defined(_LIBCPP_HAS_NO_LOCALIZATION) | ||
|
||
_LIBCPP_END_NAMESPACE_STD | ||
|
||
_LIBCPP_POP_MACROS | ||
|
||
#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) | ||
|
||
#endif // _LIBCPP___CHRONO_TIME_ZONE_H |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// -*- 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 | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
// For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html | ||
|
||
#ifndef _LIBCPP___CHRONO_TIME_ZONE_LINK_H | ||
#define _LIBCPP___CHRONO_TIME_ZONE_LINK_H | ||
|
||
#include <version> | ||
// Enable the contents of the header only when libc++ was built with experimental features enabled. | ||
#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) | ||
|
||
# include <__compare/strong_order.h> | ||
# include <__config> | ||
# include <string> | ||
# include <string_view> | ||
|
||
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||
# pragma GCC system_header | ||
# endif | ||
|
||
_LIBCPP_PUSH_MACROS | ||
# include <__undef_macros> | ||
|
||
_LIBCPP_BEGIN_NAMESPACE_STD | ||
|
||
# if _LIBCPP_STD_VER >= 20 && !defined(_LIBCPP_HAS_NO_TIME_ZONE_DATABASE) && !defined(_LIBCPP_HAS_NO_FILESYSTEM) && \ | ||
!defined(_LIBCPP_HAS_NO_LOCALIZATION) | ||
|
||
namespace chrono { | ||
|
||
class time_zone_link { | ||
public: | ||
struct __constructor_tag; | ||
_LIBCPP_NODISCARD_EXT | ||
_LIBCPP_HIDE_FROM_ABI explicit time_zone_link(string_view __name, string_view __target, __constructor_tag&&) | ||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
: __name_{__name}, __target_{__target} {} | ||
|
||
_LIBCPP_HIDE_FROM_ABI time_zone_link(time_zone_link&&) = default; | ||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
_LIBCPP_HIDE_FROM_ABI time_zone_link& operator=(time_zone_link&&) = default; | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI string_view name() const noexcept { return __name_; } | ||
_LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI string_view target() const noexcept { return __target_; } | ||
|
||
private: | ||
string __name_; | ||
// TODO TZDB instead of the name we can store the pointer to a zone. These | ||
// pointers are immutable. This makes it possible to directly return a | ||
// pointer in the time_zone in the 'locate_zone' function. | ||
string __target_; | ||
}; | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline bool | ||
operator==(const time_zone_link& __x, const time_zone_link& __y) noexcept { | ||
return __x.name() == __y.name(); | ||
} | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_AVAILABILITY_TZDB _LIBCPP_HIDE_FROM_ABI inline strong_ordering | ||
operator<=>(const time_zone_link& __x, const time_zone_link& __y) noexcept { | ||
return __x.name() <=> __y.name(); | ||
} | ||
|
||
} // namespace chrono | ||
|
||
# endif //_LIBCPP_STD_VER >= 20 | ||
|
||
_LIBCPP_END_NAMESPACE_STD | ||
|
||
_LIBCPP_POP_MACROS | ||
|
||
#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_TZDB) | ||
|
||
#endif // _LIBCPP___CHRONO_TIME_ZONE_LINK_H |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -19,7 +19,7 @@ | |
# include <__availability> | ||
# include <__chrono/tzdb.h> | ||
# include <forward_list> | ||
# include <string_view> | ||
# include <string> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this include needed? I can't find where we use There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The existing non-member function |
||
|
||
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||
# pragma GCC system_header | ||
|
@@ -32,9 +32,16 @@ _LIBCPP_BEGIN_NAMESPACE_STD | |
|
||
namespace chrono { | ||
|
||
// TODO TZDB | ||
// Libc++ recently switched to only export __ugly_names from the dylib. | ||
// Since the library is still experimental the functions in this header | ||
// should be adapted to this new style. The other tzdb headers should be | ||
// evaluated too. | ||
|
||
class _LIBCPP_AVAILABILITY_TZDB tzdb_list { | ||
public: | ||
_LIBCPP_EXPORTED_FROM_ABI explicit tzdb_list(tzdb&& __tzdb); | ||
class __impl; // public to allow construction in dylib | ||
_LIBCPP_EXPORTED_FROM_ABI explicit tzdb_list(__impl* __p); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we really need this in the dylib too? I think the type only needs to be complete at the point where we destroy the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for catching this one. |
||
_LIBCPP_EXPORTED_FROM_ABI ~tzdb_list(); | ||
|
||
tzdb_list(const tzdb_list&) = delete; | ||
|
@@ -46,16 +53,15 @@ class _LIBCPP_AVAILABILITY_TZDB tzdb_list { | |
|
||
_LIBCPP_EXPORTED_FROM_ABI const_iterator erase_after(const_iterator __p); | ||
|
||
_LIBCPP_EXPORTED_FROM_ABI tzdb& __emplace_front(tzdb&& __tzdb); | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator begin() const noexcept; | ||
_LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator end() const noexcept; | ||
|
||
_LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator cbegin() const noexcept; | ||
_LIBCPP_NODISCARD_EXT _LIBCPP_EXPORTED_FROM_ABI const_iterator cend() const noexcept; | ||
|
||
[[nodiscard]] _LIBCPP_EXPORTED_FROM_ABI __impl& __implementation(); | ||
mordante marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
private: | ||
class __impl; | ||
__impl* __impl_; | ||
}; | ||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.