[PATCH] Define std::chars_format enumeration type
Jonathan Wakely
jwakely@redhat.com
Wed Jun 26 22:55:00 GMT 2019
This type isn't used anywhere yet, but will be needed for the
floating-point overloads of to_chars and from_chars.
* include/std/charconv (chars_format): Define bitmask type.
* testsuite/20_util/to_chars/chars_format.cc: New test.
Tested x86_64-linux, committed to trunk.
-------------- next part --------------
commit 63c78e2e9bf4a99f79f3a34f4e8b35c6139cb866
Author: redi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Wed Jun 26 22:54:38 2019 +0000
Define std::chars_format enumeration type
This type isn't used anywhere yet, but will be needed for the
floating-point overloads of to_chars and from_chars.
* include/std/charconv (chars_format): Define bitmask type.
* testsuite/20_util/to_chars/chars_format.cc: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@272718 138bc75d-0d04-0410-961f-82ee72b054a4
diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv
index 6a3399764ba..53aa63ea277 100644
--- a/libstdc++-v3/include/std/charconv
+++ b/libstdc++-v3/include/std/charconv
@@ -616,6 +616,40 @@ namespace __detail
return __res;
}
+ /// floating-point format for primitive numerical conversion
+ enum class chars_format
+ {
+ scientific = 1, fixed = 2, hex = 4, general = fixed | scientific
+ };
+
+ constexpr chars_format
+ operator|(chars_format __lhs, chars_format __rhs) noexcept
+ { return (chars_format)((unsigned)__lhs | (unsigned)__rhs); }
+
+ constexpr chars_format
+ operator&(chars_format __lhs, chars_format __rhs) noexcept
+ { return (chars_format)((unsigned)__lhs & (unsigned)__rhs); }
+
+ constexpr chars_format
+ operator^(chars_format __lhs, chars_format __rhs) noexcept
+ { return (chars_format)((unsigned)__lhs ^ (unsigned)__rhs); }
+
+ constexpr chars_format
+ operator~(chars_format __fmt) noexcept
+ { return (chars_format)~(unsigned)__fmt; }
+
+ constexpr chars_format&
+ operator|=(chars_format& __lhs, chars_format __rhs) noexcept
+ { return __lhs = __lhs | __rhs; }
+
+ constexpr chars_format&
+ operator&=(chars_format& __lhs, chars_format __rhs) noexcept
+ { return __lhs = __lhs & __rhs; }
+
+ constexpr chars_format&
+ operator^=(chars_format& __lhs, chars_format __rhs) noexcept
+ { return __lhs = __lhs ^ __rhs; }
+
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
#endif // C++14
diff --git a/libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc b/libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc
new file mode 100644
index 00000000000..f343c58b0eb
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc
@@ -0,0 +1,52 @@
+// Copyright (C) 2019 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
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++17" }
+// { dg-do compile { target c++17 } }
+
+#include <charconv>
+
+// C++17 23.2.1 [utility.syn]
+// chars_format is a bitmask type with elements scientific, fixed and hex
+
+using F = std::chars_format;
+const F none = F{};
+const F all = ~none;
+static_assert(std::is_enum_v<F>);
+static_assert((F::scientific & F::fixed) == none);
+static_assert((F::scientific & F::hex) == none);
+static_assert((F::fixed & F::hex) == none);
+static_assert(F::general == (F::fixed | F::scientific));
+static_assert(F::general == (F::fixed ^ F::scientific));
+
+// sanity check operators
+static_assert((F::scientific & F::scientific) == F::scientific);
+static_assert((F::fixed & F::fixed) == F::fixed);
+static_assert((F::hex & F::hex) == F::hex);
+static_assert((F::general & F::general) == F::general);
+static_assert((F::scientific | F::scientific) == F::scientific);
+static_assert((F::fixed | F::fixed) == F::fixed);
+static_assert((F::hex | F::hex) == F::hex);
+static_assert((F::general | F::general) == F::general);
+static_assert((F::scientific ^ F::scientific) == none);
+static_assert((F::fixed ^ F::fixed) == none);
+static_assert((F::hex ^ F::hex) == none);
+static_assert((F::general ^ F::general) == none);
+static_assert((F::fixed & all) == F::fixed);
+static_assert((F::hex & all) == F::hex);
+static_assert((F::general & all) == F::general);
+static_assert(~all == none);
More information about the Gcc-patches
mailing list