23 General utilities library [utilities]

23.17 Time utilities [time]

23.17.5 Class template duration [time.duration]

duration Меры типа времени между двумя точками во времени (time_­pointсек). Aduration имеет представление, которое содержит количество тиков и период тиков. Тиковый период - это количество времени, которое происходит от одного тика до следующего, в секундах. Он выражается как рациональная константа с помощью шаблонаratio.

template <class Rep, class Period = ratio<1>>
class duration {
public:
  using rep    = Rep;
  using period = typename Period::type;
private:
  rep rep_;  // exposition only
public:
  // [time.duration.cons], construct/copy/destroy
  constexpr duration() = default;
  template <class Rep2>
      constexpr explicit duration(const Rep2& r);
  template <class Rep2, class Period2>
     constexpr duration(const duration<Rep2, Period2>& d);
  ~duration() = default;
  duration(const duration&) = default;
  duration& operator=(const duration&) = default;

  // [time.duration.observer], observer
  constexpr rep count() const;

  // [time.duration.arithmetic], arithmetic
  constexpr common_type_t<duration> operator+() const;
  constexpr common_type_t<duration> operator-() const;
  constexpr duration& operator++();
  constexpr duration  operator++(int);
  constexpr duration& operator--();
  constexpr duration  operator--(int);

  constexpr duration& operator+=(const duration& d);
  constexpr duration& operator-=(const duration& d);

  constexpr duration& operator*=(const rep& rhs);
  constexpr duration& operator/=(const rep& rhs);
  constexpr duration& operator%=(const rep& rhs);
  constexpr duration& operator%=(const duration& rhs);

  // [time.duration.special], special values
  static constexpr duration zero();
  static constexpr duration min();
  static constexpr duration max();
};

Rep должен быть арифметическим типом или классом, имитирующим арифметический тип. Еслиduration создается экземпляр сduration типом в качестве аргумента для параметра шаблонаRep, программа имеет неправильный формат.

ЕслиPeriod это не специализацияratio, программа плохо сформирована. ЕслиPeriod​::​num не положительный, программа неправильно сформирована.

Членыduration не должны бросать исключения, кроме тех, которые выбрасываются указанными операциями на их представления.

Конструктор копирования по умолчанию для duration должен быть функцией constexpr тогда и только тогда, когда требуемая инициализация членаrep_­ для копирования и перемещения, соответственно, удовлетворяет требованиям для функции constexpr.

[Example:

duration<long, ratio<60>> d0;       // holds a count of minutes using a long
duration<long long, milli> d1;      // holds a count of milliseconds using a long long
duration<double, ratio<1, 30>>  d2; // holds a count with a tick period of 130 of a second
                                    // (30 Hz) using a double

end example]

23.17.5.1 duration constructors [time.duration.cons]

template <class Rep2> constexpr explicit duration(const Rep2& r);

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если он не Rep2 может быть неявно преобразован вrep и

  • treat_­as_­floating_­point_­v<rep> естьtrue или

  • treat_­as_­floating_­point_­v<Rep2> естьfalse.

[Example:

duration<int, milli> d(3);          // OK
duration<int, milli> d(3.5);        // error

end example]

Effects: Создает объект типаduration.

Postconditions:count() == static_­cast<rep>(r).

template <class Rep2, class Period2> constexpr duration(const duration<Rep2, Period2>& d);

Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, если при преобразовании не индуцируется переполнение и treat_­as_­floating_­point_­v<rep> естьtrue или оба они ratio_­divide<Period2, period>​::​den есть1 и treat_­as_­floating_­point_­v<Rep2> естьfalse. [ Note: Это требование предотвращает неявную ошибку усечения при преобразовании между целочисленнымиduration типами. Такая конструкция может легко привести к путанице в отношении стоимостиduration. ] [end noteExample:

duration<int, milli> ms(3);
duration<int, micro> us = ms;       // OK
duration<int, milli> ms2 = us;      // error

end example]

Effects: Создает объект типаduration, построенныйrep_­ из
duration_­cast<duration>(d).count().

23.17.5.2 duration observer [time.duration.observer]

constexpr rep count() const;

Returns:rep_­.

23.17.5.3 duration arithmetic [time.duration.arithmetic]

constexpr common_type_t<duration> operator+() const;

Returns:common_­type_­t<duration>(*this).

constexpr common_type_t<duration> operator-() const;

Returns:common_­type_­t<duration>(-rep_­).

constexpr duration& operator++();

Effects: Как будто мимо++rep_­.

Returns:*this.

constexpr duration operator++(int);

Returns:duration(rep_­++).

constexpr duration& operator--();

Effects: Как будто мимо--rep_­.

Returns:*this.

constexpr duration operator--(int);

Returns:duration(rep_­--).

constexpr duration& operator+=(const duration& d);

Effects: Как будто по:rep_­ += d.count();

Returns:*this.

constexpr duration& operator-=(const duration& d);

Effects: Как будто по:rep_­ -= d.count();

Returns:*this.

constexpr duration& operator*=(const rep& rhs);

Effects: Как будто по:rep_­ *= rhs;

Returns:*this.

constexpr duration& operator/=(const rep& rhs);

Effects: Как будто по:rep_­ /= rhs;

Returns:*this.

constexpr duration& operator%=(const rep& rhs);

Effects: Как будто по:rep_­ %= rhs;

Returns:*this.

constexpr duration& operator%=(const duration& rhs);

Effects: Как будто по:rep_­ %= rhs.count();

Returns:*this.

23.17.5.4 duration special values [time.duration.special]

static constexpr duration zero();

Returns:duration(duration_­values<rep>​::​zero()).

static constexpr duration min();

Returns:duration(duration_­values<rep>​::​min()).

static constexpr duration max();

Returns:duration(duration_­values<rep>​::​max()).

23.17.5.5 duration non-member arithmetic [time.duration.nonmember]

В нижеследующих описаниях функцийCD представляет тип возвращаемого значения функции.CR(A, B) представляетcommon_­type_­t<A, B>.

template <class Rep1, class Period1, class Rep2, class Period2> constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> operator+(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:CD(CD(lhs).count() + CD(rhs).count()).

template <class Rep1, class Period1, class Rep2, class Period2> constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> operator-(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:CD(CD(lhs).count() - CD(rhs).count()).

template <class Rep1, class Period, class Rep2> constexpr duration<common_type_t<Rep1, Rep2>, Period> operator*(const duration<Rep1, Period>& d, const Rep2& s);

Remarks: Этот оператор не должен участвовать в разрешении перегрузки, если он неRep2 может быть неявно преобразован вCR(Rep1, Rep2).

Returns:CD(CD(d).count() * s).

template <class Rep1, class Rep2, class Period> constexpr duration<common_type_t<Rep1, Rep2>, Period> operator*(const Rep1& s, const duration<Rep2, Period>& d);

Remarks: Этот оператор не должен участвовать в разрешении перегрузки, если он неRep1 может быть неявно преобразован вCR(Rep1, Rep2).

Returns:d * s.

template <class Rep1, class Period, class Rep2> constexpr duration<common_type_t<Rep1, Rep2>, Period> operator/(const duration<Rep1, Period>& d, const Rep2& s);

Remarks: Этот оператор не должен участвовать в разрешении перегрузки , еслиRep2 не неявное преобразованиеCR(Rep1, Rep2) иRep2 не является специализацияduration.

Returns:CD(CD(d).count() / s).

template <class Rep1, class Period1, class Rep2, class Period2> constexpr common_type_t<Rep1, Rep2> operator/(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:CD(lhs).count() / CD(rhs).count().

template <class Rep1, class Period, class Rep2> constexpr duration<common_type_t<Rep1, Rep2>, Period> operator%(const duration<Rep1, Period>& d, const Rep2& s);

Remarks: Этот оператор не должен участвовать в разрешении перегрузки , еслиRep2 не неявное преобразованиеCR(Rep1, Rep2) и Rep2 не является специализацияduration.

Returns:CD(CD(d).count() % s).

template <class Rep1, class Period1, class Rep2, class Period2> constexpr common_type_t<duration<Rep1, Period1>, duration<Rep2, Period2>> operator%(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:CD(CD(lhs).count() % CD(rhs).count()).

23.17.5.6 duration comparisons [time.duration.comparisons]

В нижеследующих описаниях функций,CT представляет common_­type_­t<A, B>, гдеA иB - типы двух аргументов функции.

template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator==(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:CT(lhs).count() == CT(rhs).count().

template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator!=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:!(lhs == rhs).

template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator<(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:CT(lhs).count() < CT(rhs).count().

template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator<=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:!(rhs < lhs).

template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator>(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:rhs < lhs.

template <class Rep1, class Period1, class Rep2, class Period2> constexpr bool operator>=(const duration<Rep1, Period1>& lhs, const duration<Rep2, Period2>& rhs);

Returns:!(lhs < rhs).

23.17.5.7 duration_­cast [time.duration.cast]

template <class ToDuration, class Rep, class Period> constexpr ToDuration duration_cast(const duration<Rep, Period>& d);

Remarks: Эта функция не должна участвовать в разрешении перегрузки, еслиToDuration она не является специализациейduration.

Returns: ДаCF будетratio_­divide<Period, typename ToDuration​::​period>иCR будетcommon_­type<typename ToDuration​::​rep, Rep, intmax_­t>​::​type.

  • ЕслиCF​::​num == 1 иCF​::​den == 1, возвращает

    ToDuration(static_cast<typename ToDuration::rep>(d.count()))
  • в противном случае, еслиCF​::​num != 1 иCF​::​den == 1, возвращает

    ToDuration(static_cast<typename ToDuration::rep>(
      static_cast<CR>(d.count()) * static_cast<CR>(CF::num)))
  • в противном случае, еслиCF​::​num == 1 иCF​::​den != 1, возвращает

    ToDuration(static_cast<typename ToDuration::rep>(
      static_cast<CR>(d.count()) / static_cast<CR>(CF::den)))
  • в противном случае возвращается

    ToDuration(static_cast<typename ToDuration::rep>(
      static_cast<CR>(d.count()) * static_cast<CR>(CF::num) / static_cast<CR>(CF::den)))

[ Note: Эта функция не использует никаких неявных преобразований; все преобразования выполняются с помощьюstatic_­cast. Он избегает умножений и делений, когда во время компиляции известно, что один или несколько аргументов равны 1. Промежуточные вычисления выполняются в самом широком представлении и преобразуются в целевое представление только на последнем шаге. ] end note

template <class ToDuration, class Rep, class Period> constexpr ToDuration floor(const duration<Rep, Period>& d);

Remarks: Эта функция не должна участвовать в разрешении перегрузки, еслиToDuration она не является специализациейduration.

Returns: Наибольший результат,t представимыйToDuration для которогоt <= d.

template <class ToDuration, class Rep, class Period> constexpr ToDuration ceil(const duration<Rep, Period>& d);

Remarks: Эта функция не должна участвовать в разрешении перегрузки, еслиToDuration она не является специализациейduration.

Returns: Наименьший результат,t представимыйToDuration для которогоt >= d.

template <class ToDuration, class Rep, class Period> constexpr ToDuration round(const duration<Rep, Period>& d);

Remarks: Эта функция не должна участвовать в разрешении перегрузки, еслиToDuration она не является специализациейdurationи неtreat_­as_­floating_­point_­v<typename ToDuration​::​rep> являетсяfalse.

Returns: Значение того,ToDuration что ближе всего кd. Если есть два ближайших значения, вернуть то значение,t для которогоt % 2 == 0.

23.17.5.8 Suffixes for duration literals [time.duration.literals]

В этом разделе описаны буквальные суффиксы для построения литералов продолжительности. Суффиксыh,min,s,ms,us,ns обозначает значение длительности соответствующих типовhours,minutes, seconds,milliseconds,microseconds, и ,nanoseconds соответственно , если они применяются к интегральным литералам.

Если любой из этих суффиксов применяется к литералу с плавающей запятой, результатом будет chrono​::​duration литерал с неопределенным представлением с плавающей запятой.

Если любой из этих суффиксов применяется к целочисленному литералу и результирующее chrono​::​duration значение не может быть представлено в типе результата из-за переполнения, программа имеет неправильный формат.

[ Example: В следующем коде показаны некоторые литералы продолжительности.

using namespace std::chrono_literals;
auto constexpr aday=24h;
auto constexpr lesson=45min;
auto constexpr halfanhour=0.5h;

end example]

constexpr chrono::hours operator""h(unsigned long long hours); constexpr chrono::duration<unspecified, ratio<3600, 1>> operator""h(long double hours);

Returns: duration Литералhours часов.

constexpr chrono::minutes operator""min(unsigned long long minutes); constexpr chrono::duration<unspecified, ratio<60, 1>> operator""min(long double minutes);

Returns: duration Литералminutes минут.

constexpr chrono::seconds operator""s(unsigned long long sec); constexpr chrono::duration<unspecified> operator""s(long double sec);

Returns: duration Литералsec секунд.

[ Note: Используется тот же суффиксs ,basic_­string но нет конфликта, поскольку суффиксы продолжительности применяются к числам, а суффиксы строковых литералов применяются к литералам символьных массивов. ] end note

constexpr chrono::milliseconds operator""ms(unsigned long long msec); constexpr chrono::duration<unspecified, milli> operator""ms(long double msec);

Returns: duration Буквальный , представляющаяmsec миллисекунды.

constexpr chrono::microseconds operator""us(unsigned long long usec); constexpr chrono::duration<unspecified, micro> operator""us(long double usec);

Returns: duration Буквальный , представляющиеusec микросекунды.

constexpr chrono::nanoseconds operator""ns(unsigned long long nsec); constexpr chrono::duration<unspecified, nano> operator""ns(long double nsec);

Returns: duration Буквальный , представляющиеnsec наносекунды.

23.17.5.9 duration algorithms [time.duration.alg]

template <class Rep, class Period> constexpr duration<Rep, Period> abs(duration<Rep, Period> d);

Remarks: Эта функция не будет участвовать в разрешении перегрузки , еслиnumeric_­limits<Rep>​::​is_­signed неtrue.

Returns: Еслиd >= d.zero()- вернутьd, в противном случае - вернуть-d.