brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 1857bef Raw
132 lines · c
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10// For information see https://libcxx.llvm.org/DesignDocs/TimeZone.html11 12#ifndef _LIBCPP___CHRONO_LEAP_SECOND_H13#define _LIBCPP___CHRONO_LEAP_SECOND_H14 15#include <version>16// Enable the contents of the header only when libc++ was built with experimental features enabled.17#if _LIBCPP_HAS_EXPERIMENTAL_TZDB18 19#  include <__chrono/duration.h>20#  include <__chrono/system_clock.h>21#  include <__chrono/time_point.h>22#  include <__compare/ordering.h>23#  include <__compare/three_way_comparable.h>24#  include <__config>25#  include <__utility/private_constructor_tag.h>26 27#  if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)28#    pragma GCC system_header29#  endif30 31_LIBCPP_BEGIN_NAMESPACE_STD32 33#  if _LIBCPP_STD_VER >= 2034 35namespace chrono {36 37class leap_second {38public:39  [[nodiscard]]40  _LIBCPP_HIDE_FROM_ABI explicit constexpr leap_second(__private_constructor_tag, sys_seconds __date, seconds __value)41      : __date_(__date), __value_(__value) {}42 43  _LIBCPP_HIDE_FROM_ABI leap_second(const leap_second&)            = default;44  _LIBCPP_HIDE_FROM_ABI leap_second& operator=(const leap_second&) = default;45 46  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr sys_seconds date() const noexcept { return __date_; }47 48  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr seconds value() const noexcept { return __value_; }49 50private:51  sys_seconds __date_;52  seconds __value_;53 54  // The function55  //   template<class Duration>56  //    requires three_way_comparable_with<sys_seconds, sys_time<Duration>>57  //    constexpr auto operator<=>(const leap_second& x, const sys_time<Duration>& y) noexcept;58  //59  // Has constraints that are recursive (LWG4139). The proposed resolution is60  // to make the funcion a hidden friend. For consistency make this change for61  // all comparison functions.62 63  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const leap_second& __x, const leap_second& __y) {64    return __x.date() == __y.date();65  }66 67  _LIBCPP_HIDE_FROM_ABI friend constexpr strong_ordering operator<=>(const leap_second& __x, const leap_second& __y) {68    return __x.date() <=> __y.date();69  }70 71  template <class _Duration>72  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const leap_second& __x, const sys_time<_Duration>& __y) {73    return __x.date() == __y;74  }75 76  template <class _Duration>77  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<(const leap_second& __x, const sys_time<_Duration>& __y) {78    return __x.date() < __y;79  }80 81  template <class _Duration>82  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<(const sys_time<_Duration>& __x, const leap_second& __y) {83    return __x < __y.date();84  }85 86  template <class _Duration>87  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>(const leap_second& __x, const sys_time<_Duration>& __y) {88    return __y < __x;89  }90 91  template <class _Duration>92  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>(const sys_time<_Duration>& __x, const leap_second& __y) {93    return __y < __x;94  }95 96  template <class _Duration>97  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<=(const leap_second& __x, const sys_time<_Duration>& __y) {98    return !(__y < __x);99  }100 101  template <class _Duration>102  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator<=(const sys_time<_Duration>& __x, const leap_second& __y) {103    return !(__y < __x);104  }105 106  template <class _Duration>107  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>=(const leap_second& __x, const sys_time<_Duration>& __y) {108    return !(__x < __y);109  }110 111  template <class _Duration>112  _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator>=(const sys_time<_Duration>& __x, const leap_second& __y) {113    return !(__x < __y);114  }115 116  template <class _Duration>117    requires three_way_comparable_with<sys_seconds, sys_time<_Duration>>118  _LIBCPP_HIDE_FROM_ABI friend constexpr auto operator<=>(const leap_second& __x, const sys_time<_Duration>& __y) {119    return __x.date() <=> __y;120  }121};122 123} // namespace chrono124 125#  endif // _LIBCPP_STD_VER >= 20126 127_LIBCPP_END_NAMESPACE_STD128 129#endif // _LIBCPP_HAS_EXPERIMENTAL_TZDB130 131#endif // _LIBCPP___CHRONO_LEAP_SECOND_H132