xref: /llvm-project/libcxx/test/std/utilities/charconv/charconv.syn/chars_format.pass.cpp (revision 0a4aa8a122aa097499c498b639a75b5e9a73e9f0)
1ac08e2bbSMark de Wever //===----------------------------------------------------------------------===//
2ac08e2bbSMark de Wever //
3ac08e2bbSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4ac08e2bbSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5ac08e2bbSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ac08e2bbSMark de Wever //
7ac08e2bbSMark de Wever //===----------------------------------------------------------------------===//
8ac08e2bbSMark de Wever 
9e17ec8e9SMark de Wever // UNSUPPORTED: c++03, c++11, c++14
10ac08e2bbSMark de Wever 
11ac08e2bbSMark de Wever // <charconv>
12ac08e2bbSMark de Wever 
13ac08e2bbSMark de Wever // Bitmask type
14ac08e2bbSMark de Wever // enum class chars_format {
15ac08e2bbSMark de Wever //   scientific = unspecified,
16ac08e2bbSMark de Wever //   fixed = unspecified,
17ac08e2bbSMark de Wever //   hex = unspecified,
18ac08e2bbSMark de Wever //   general = fixed | scientific
19ac08e2bbSMark de Wever // };
20ac08e2bbSMark de Wever 
21ac08e2bbSMark de Wever #include <cassert>
22*0a4aa8a1SNikolas Klauser #include <charconv>
23*0a4aa8a1SNikolas Klauser #include <type_traits>
24ac08e2bbSMark de Wever 
25ac08e2bbSMark de Wever #include "test_macros.h"
26ac08e2bbSMark de Wever 
test()27ac08e2bbSMark de Wever constexpr bool test() {
28ac08e2bbSMark de Wever   using cf = std::chars_format;
29ac08e2bbSMark de Wever   using ut = std::underlying_type<cf>::type;
30ac08e2bbSMark de Wever 
31ac08e2bbSMark de Wever   {
32ac08e2bbSMark de Wever     cf x = cf::scientific;
33ac08e2bbSMark de Wever     x |= cf::fixed;
34ac08e2bbSMark de Wever     assert(x == cf::general);
35ac08e2bbSMark de Wever   }
36ac08e2bbSMark de Wever   {
37ac08e2bbSMark de Wever     cf x = cf::general;
38ac08e2bbSMark de Wever     x &= cf::fixed;
39ac08e2bbSMark de Wever     assert(x == cf::fixed);
40ac08e2bbSMark de Wever   }
41ac08e2bbSMark de Wever   {
42ac08e2bbSMark de Wever     cf x = cf::general;
43ac08e2bbSMark de Wever     x ^= cf::fixed;
44ac08e2bbSMark de Wever     assert(x == cf::scientific);
45ac08e2bbSMark de Wever   }
46ac08e2bbSMark de Wever 
47ac08e2bbSMark de Wever   assert(static_cast<ut>(cf::scientific & (cf::fixed | cf::hex)) == 0);
48ac08e2bbSMark de Wever   assert(static_cast<ut>(cf::fixed & (cf::scientific | cf::hex)) == 0);
49ac08e2bbSMark de Wever   assert(static_cast<ut>(cf::hex & (cf::scientific | cf::fixed)) == 0);
50ac08e2bbSMark de Wever 
51ac08e2bbSMark de Wever   assert((cf::scientific | cf::fixed) == cf::general);
52ac08e2bbSMark de Wever 
53ac08e2bbSMark de Wever   assert(static_cast<ut>(cf::scientific & cf::fixed) == 0);
54ac08e2bbSMark de Wever 
55ac08e2bbSMark de Wever   assert((cf::general ^ cf::fixed) == cf::scientific);
56ac08e2bbSMark de Wever 
57ac08e2bbSMark de Wever   assert((~cf::hex & cf::general) == cf::general);
58ac08e2bbSMark de Wever 
59ac08e2bbSMark de Wever   return true;
60ac08e2bbSMark de Wever }
61ac08e2bbSMark de Wever 
62ac08e2bbSMark de Wever std::chars_format x;
63ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format, decltype(~x)>::value, "");
64ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format, decltype(x & x)>::value, "");
65ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format, decltype(x | x)>::value, "");
66ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format, decltype(x ^ x)>::value, "");
67ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format&, decltype(x &= x)>::value, "");
68ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format&, decltype(x |= x)>::value, "");
69ac08e2bbSMark de Wever static_assert(std::is_same<std::chars_format&, decltype(x ^= x)>::value, "");
70ac08e2bbSMark de Wever 
main(int,char **)71ac08e2bbSMark de Wever int main(int, char**) {
72ac08e2bbSMark de Wever   assert(test());
73ac08e2bbSMark de Wever   static_assert(test(), "");
74ac08e2bbSMark de Wever 
75ac08e2bbSMark de Wever   return 0;
76ac08e2bbSMark de Wever }
77