]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/testsuite/20_util/duration/requirements/reduced_period.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / duration / requirements / reduced_period.cc
index 9eb38a0e56facc604b94d251719ea90f2f84a080..2502c01bb3b8935349da7304d96a564ed944671f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2020 Free Software Foundation, Inc.
+// Copyright (C) 2020-2023 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -129,3 +129,55 @@ test02()
   static_assert( is_same<decltype(-d3), common_type<D3>::type>::value,
       "unary - returns the reduced duration" );
 }
+
+template<typename T>
+struct Number
+{
+  explicit
+  Number(T t = 0) : i(t)
+  { }
+
+  template<typename U, bool B = std::is_convertible<U, T>::value,
+          typename = typename std::enable_if<B>::type>
+    explicit
+    Number(Number<U> n) : i(n.i)
+    { }
+
+  T i = 0;
+
+  Number& operator+=(Number n) { i += n.i; return *this; }
+  Number& operator-=(Number n) { i -= n.i; return *this; }
+  Number& operator*=(Number n) { i *= n.i; return *this; }
+  Number& operator/=(Number n) { i /= n.i; return *this; }
+  Number& operator%=(Number n) { i %= n.i; return *this; }
+
+  Number operator+(Number n) { return Number{ i + n.i }; }
+  Number operator-(Number n) { return Number{ i - n.i }; }
+  Number operator*(Number n) { return Number{ i * n.i }; }
+  Number operator/(Number n) { return Number{ i / n.i }; }
+  Number operator%(Number n) { return Number{ i % n.i }; }
+};
+
+namespace std
+{
+  // Specialise common_type to give a different type
+  template<>
+    struct common_type<Number<int>, Number<int>>
+    { using type = Number<long>; };
+}
+
+void
+test03()
+{
+
+  using D4 = duration<Number<int>, ratio<49, 21>>;
+  static_assert( is_same<common_type<D4>::type,
+                        duration<Number<long>, ratio<7, 3>>>::value,
+      "common_type_t<duration<R,P>> uses common_type_t<R>" );
+
+  D4 d4;
+  static_assert( is_same<decltype(+d4), common_type<D4>::type>::value,
+      "unary + returns type with common_type_t<D4::rep> as rep" );
+  static_assert( is_same<decltype(-d4), common_type<D4>::type>::value,
+      "unary - returns type with common_type_t<D4::rep> as rep" );
+}