brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · 42f4323 Raw
71 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11// <chrono>12 13// abs14 15// template <class Rep, class Period>16//   constexpr duration<Rep, Period> abs(duration<Rep, Period> d)17 18#include <chrono>19#include <cassert>20#include <ratio>21#include <type_traits>22#include <utility>23 24#include "test_macros.h"25 26template <class T, class = void>27inline constexpr bool has_abs_v = false;28 29template <class T>30inline constexpr bool has_abs_v<T, decltype((void)std::chrono::abs(std::declval<T>()))> = true;31 32static_assert(has_abs_v<std::chrono::milliseconds>);33static_assert(!has_abs_v<std::chrono::duration<unsigned>>);34 35template <class Duration>36void37test(const Duration& f, const Duration& d)38{39    {40    typedef decltype(std::chrono::abs(f)) R;41    static_assert((std::is_same<R, Duration>::value), "");42    assert(std::chrono::abs(f) == d);43    }44}45 46int main(int, char**)47{48//  7290000ms is 2 hours, 1 minute, and 30 seconds49    test(std::chrono::milliseconds( 7290000), std::chrono::milliseconds( 7290000));50    test(std::chrono::milliseconds(-7290000), std::chrono::milliseconds( 7290000));51    test(std::chrono::minutes( 122), std::chrono::minutes( 122));52    test(std::chrono::minutes(-122), std::chrono::minutes( 122));53    test(std::chrono::hours(0), std::chrono::hours(0));54 55    {56//  9000000ms is 2 hours and 30 minutes57    constexpr std::chrono::hours h1 = std::chrono::abs(std::chrono::hours(-3));58    static_assert(h1.count() == 3, "");59    constexpr std::chrono::hours h2 = std::chrono::abs(std::chrono::hours(3));60    static_assert(h2.count() == 3, "");61    }62 63    {64//  Make sure it works for durations that are not LCD'ed - example from LWG309165    constexpr auto d = std::chrono::abs(std::chrono::duration<int, std::ratio<60, 100>>{2});66    static_assert(d.count() == 2, "");67    }68 69  return 0;70}71