|
11 | 11 | #include <chrono> |
12 | 12 | #include <ratio> |
13 | 13 |
|
| 14 | +#include "test_macros.h" |
| 15 | + |
14 | 16 | struct EmptyStruct {}; |
15 | 17 |
|
16 | 18 | // Test structs missing required members |
@@ -168,75 +170,75 @@ struct ValidClockWithDurationMatch { |
168 | 170 | static time_point now(); |
169 | 171 | }; |
170 | 172 |
|
171 | | -int main(int, char**) { |
172 | | - // Test both is_clock and is_clock_v |
173 | | - static_assert(std::chrono::is_clock<std::chrono::system_clock>::value); |
174 | | - static_assert(std::chrono::is_clock_v<std::chrono::system_clock>); |
| 173 | +// Test both is_clock and is_clock_v |
| 174 | +static_assert(std::chrono::is_clock<std::chrono::system_clock>::value); |
| 175 | +static_assert(std::chrono::is_clock_v<std::chrono::system_clock>); |
175 | 176 |
|
176 | | - // Test standard clock types |
177 | | - static_assert(std::chrono::is_clock_v<std::chrono::system_clock>); |
| 177 | +// Test standard clock types |
| 178 | +static_assert(std::chrono::is_clock_v<std::chrono::system_clock>); |
178 | 179 | #ifdef _LIBCPP_HAS_MONOTONIC_CLOCK |
179 | | - static_assert(std::chrono::is_clock_v<std::chrono::steady_clock>); |
| 180 | +static_assert(std::chrono::is_clock_v<std::chrono::steady_clock>); |
180 | 181 | #endif |
181 | | - static_assert(std::chrono::is_clock_v<std::chrono::high_resolution_clock>); |
| 182 | +static_assert(std::chrono::is_clock_v<std::chrono::high_resolution_clock>); |
182 | 183 |
|
183 | | - // Test non-clock types |
184 | | - static_assert(!std::chrono::is_clock_v<EmptyStruct>); |
185 | | - static_assert(!std::chrono::is_clock_v<int>); |
186 | | - static_assert(!std::chrono::is_clock_v<void>); |
187 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock::time_point>); |
| 184 | +// Test non-clock types |
| 185 | +static_assert(!std::chrono::is_clock_v<EmptyStruct>); |
| 186 | +static_assert(!std::chrono::is_clock_v<int>); |
| 187 | +static_assert(!std::chrono::is_clock_v<void>); |
| 188 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock::time_point>); |
188 | 189 | #ifdef _LIBCPP_HAS_MONOTONIC_CLOCK |
189 | | - static_assert(!std::chrono::is_clock_v<std::chrono::steady_clock::time_point>); |
| 190 | +static_assert(!std::chrono::is_clock_v<std::chrono::steady_clock::time_point>); |
190 | 191 | #endif |
191 | | - static_assert(!std::chrono::is_clock_v<std::chrono::seconds>); |
192 | | - static_assert(!std::chrono::is_clock_v<std::chrono::milliseconds>); |
193 | | - |
194 | | - // Test structs missing required members |
195 | | - static_assert(!std::chrono::is_clock_v<MissingRep>); |
196 | | - static_assert(!std::chrono::is_clock_v<MissingPeriod>); |
197 | | - static_assert(!std::chrono::is_clock_v<MissingDuration>); |
198 | | - static_assert(!std::chrono::is_clock_v<MissingTimePoint>); |
199 | | - static_assert(!std::chrono::is_clock_v<MissingIsSteady>); |
200 | | - static_assert(!std::chrono::is_clock_v<MissingNow>); |
201 | | - |
202 | | - // Test valid custom clocks |
203 | | - static_assert(std::chrono::is_clock_v<ValidSteadyClock>); |
204 | | - static_assert(std::chrono::is_clock_v<ValidSystemClock>); |
205 | | - static_assert(std::chrono::is_clock_v<ValidClockWithDurationMatch>); |
206 | | - |
207 | | - // Test clocks with invalid is_steady type |
208 | | - static_assert(!std::chrono::is_clock_v<WrongIsSteadyType>); // is_steady not const bool |
209 | | - static_assert(!std::chrono::is_clock_v<WrongIsSteadyNonBool>); // is_steady not bool type |
210 | | - |
211 | | - // Test clocks with invalid now() return type |
212 | | - static_assert(!std::chrono::is_clock_v<WrongNowReturnType>); // now() doesn't return time_point |
213 | | - |
214 | | - // Test clocks with invalid period type |
215 | | - static_assert(!std::chrono::is_clock_v<WrongPeriodType>); // period is not a ratio |
216 | | - |
217 | | - // Test clocks with invalid rep type |
218 | | - static_assert(!std::chrono::is_clock_v<InvalidRepType>); // rep is not arithmetic and no numeric_limits |
219 | | - |
220 | | - // Test clocks with wrong duration type |
221 | | - static_assert(!std::chrono::is_clock_v<WrongDurationType>); // duration doesn't match duration<rep, period> |
222 | | - |
223 | | - // Test clocks with wrong time_point type |
224 | | - static_assert(!std::chrono::is_clock_v<WrongTimePointType>); // time_point is not a time_point |
225 | | - static_assert(!std::chrono::is_clock_v<WrongTimePointClock>); // time_point has wrong clock and wrong duration |
226 | | - |
227 | | - // cv-qualified and reference types |
228 | | - static_assert(std::chrono::is_clock_v<const std::chrono::system_clock>); |
229 | | - static_assert(std::chrono::is_clock_v<volatile std::chrono::system_clock>); |
230 | | - static_assert(std::chrono::is_clock_v<const volatile std::chrono::system_clock>); |
231 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock&>); |
232 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock&&>); |
233 | | - static_assert(!std::chrono::is_clock_v<const std::chrono::system_clock&>); |
234 | | - |
235 | | - // array and pointer types |
236 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock[]>); |
237 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock[10]>); |
238 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock*>); |
239 | | - static_assert(!std::chrono::is_clock_v<std::chrono::system_clock* const>); |
240 | | - |
241 | | - return 0; |
242 | | -} |
| 192 | +static_assert(!std::chrono::is_clock_v<std::chrono::seconds>); |
| 193 | +static_assert(!std::chrono::is_clock_v<std::chrono::milliseconds>); |
| 194 | + |
| 195 | +// Test structs missing required members |
| 196 | +static_assert(!std::chrono::is_clock_v<MissingRep>); |
| 197 | +static_assert(!std::chrono::is_clock_v<MissingPeriod>); |
| 198 | +static_assert(!std::chrono::is_clock_v<MissingDuration>); |
| 199 | +static_assert(!std::chrono::is_clock_v<MissingTimePoint>); |
| 200 | +static_assert(!std::chrono::is_clock_v<MissingIsSteady>); |
| 201 | +static_assert(!std::chrono::is_clock_v<MissingNow>); |
| 202 | + |
| 203 | +// Test valid custom clocks |
| 204 | +static_assert(std::chrono::is_clock_v<ValidSteadyClock>); |
| 205 | +static_assert(std::chrono::is_clock_v<ValidSystemClock>); |
| 206 | +static_assert(std::chrono::is_clock_v<ValidClockWithDurationMatch>); |
| 207 | + |
| 208 | +// cv-qualified and reference types |
| 209 | +static_assert(std::chrono::is_clock_v<const std::chrono::system_clock>); |
| 210 | +static_assert(std::chrono::is_clock_v<volatile std::chrono::system_clock>); |
| 211 | +static_assert(std::chrono::is_clock_v<const volatile std::chrono::system_clock>); |
| 212 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock&>); |
| 213 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock&&>); |
| 214 | +static_assert(!std::chrono::is_clock_v<const std::chrono::system_clock&>); |
| 215 | + |
| 216 | +// array and pointer types |
| 217 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock[]>); |
| 218 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock[10]>); |
| 219 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock*>); |
| 220 | +static_assert(!std::chrono::is_clock_v<std::chrono::system_clock* const>); |
| 221 | + |
| 222 | +// The Standard defined a minimum set of checks and allowed implementation to perform stricter checks. The following |
| 223 | +// static asserts are implementation specific and a conforming standard library implementation doesn't have to produce |
| 224 | +// the same outcome. |
| 225 | + |
| 226 | +// Test clocks with invalid is_steady type |
| 227 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongIsSteadyType>); // is_steady not const bool |
| 228 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongIsSteadyNonBool>); // is_steady not bool type |
| 229 | + |
| 230 | +// Test clocks with invalid now() return type |
| 231 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongNowReturnType>); // now() doesn't return time_point |
| 232 | + |
| 233 | +// Test clocks with invalid period type |
| 234 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongPeriodType>); // period is not a ratio |
| 235 | + |
| 236 | +// Test clocks with invalid rep type |
| 237 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<InvalidRepType>); // rep is not arithmetic and no numeric_limits |
| 238 | + |
| 239 | +// Test clocks with wrong duration type |
| 240 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongDurationType>); // duration doesn't match duration<rep, period> |
| 241 | + |
| 242 | +// Test clocks with wrong time_point type |
| 243 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongTimePointType>); // time_point is not a time_point |
| 244 | +LIBCPP_STATIC_ASSERT(!std::chrono::is_clock_v<WrongTimePointClock>); // time_point has wrong clock and wrong duration |
0 commit comments