Reverting merge from trunk
[official-gcc.git] / libstdc++-v3 / testsuite / 20_util / duration / cons / 1.cc
bloba938a75730223e86bbf4c1c56bfe23c08292e26c
1 // { dg-options "-std=gnu++0x" }
2 // { dg-require-cstdint "" }
4 // Copyright (C) 2008-2013 Free Software Foundation, Inc.
5 //
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
10 // any later version.
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
21 // 20.8.3 Class template duration [time.duration]
23 #include <chrono>
24 #include <type_traits>
25 #include <testsuite_hooks.h>
27 template<typename T>
28 struct type_emulator
30 type_emulator()
31 : i(T(0)) { }
33 type_emulator(T j)
34 : i(j) { }
36 type_emulator(const type_emulator& e)
37 : i(e.i) { }
39 type_emulator&
40 operator*=(type_emulator a)
42 i *= a.i;
43 return *this;
46 type_emulator&
47 operator+=(type_emulator a)
49 i += a.i;
50 return *this;
53 operator T ()
54 { return i; }
56 T i;
59 template<typename T>
60 bool
61 operator==(type_emulator<T> a, type_emulator<T> b)
62 { return a.i == b.i; }
64 template<typename T>
65 bool
66 operator<(type_emulator<T> a, type_emulator<T> b)
67 { return a.i < b.i; }
69 template<typename T>
70 type_emulator<T>
71 operator+(type_emulator<T> a, type_emulator<T> b)
72 { return a += b; }
74 template<typename T>
75 type_emulator<T>
76 operator*(type_emulator<T> a, type_emulator<T> b)
77 { return a *= b; }
79 namespace std
81 template<typename T, typename U>
82 struct common_type<type_emulator<T>, U>
83 { typedef typename common_type<T,U>::type type; };
85 template<typename T, typename U>
86 struct common_type<U, type_emulator<T>>
87 { typedef typename common_type<U,T>::type type; };
89 template<typename T, typename U>
90 struct common_type<type_emulator<T>, type_emulator<U>>
91 { typedef typename common_type<T,U>::type type; };
93 namespace chrono
95 template<typename T>
96 struct treat_as_floating_point<type_emulator<T>>
97 : is_floating_point<T>
98 { };
102 typedef type_emulator<int> int_emulator;
103 typedef type_emulator<double> dbl_emulator;
105 // 20.8.3.1 duration constructors [time.duration.cons]
106 void
107 test01()
109 bool test __attribute__((unused)) = true;
110 using std::chrono::duration;
112 int r = 3;
113 duration<int> d1(r);
114 VERIFY(d1.count() == static_cast<duration<int>::rep>(r));
116 double s = 8.0;
117 duration<double> d2(s);
118 VERIFY(d2.count() == static_cast<duration<double>::rep>(s));
120 int_emulator ie(3);
121 duration<int_emulator> d3(ie);
122 VERIFY(d3.count() == static_cast<duration<int_emulator>::rep>(ie));
124 dbl_emulator de(4.0);
125 duration<dbl_emulator> d4(de);
126 VERIFY(d4.count() == static_cast<duration<dbl_emulator>::rep>(de));
130 main()
132 test01();
133 return 0;