aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2019-06-26 23:54:38 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2019-06-26 23:54:38 +0100
commit22ff8929d779c82e8463c1910edcfff475f56c18 (patch)
treea320a706d4ad8c9f189a4a1bcbeefddb6afa30c9
parent3fe0ddc88334f9afd622458653a6d103948994bd (diff)
downloadgcc-22ff8929d779c82e8463c1910edcfff475f56c18.zip
gcc-22ff8929d779c82e8463c1910edcfff475f56c18.tar.gz
gcc-22ff8929d779c82e8463c1910edcfff475f56c18.tar.bz2
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. From-SVN: r272718
-rw-r--r--libstdc++-v3/ChangeLog3
-rw-r--r--libstdc++-v3/include/std/charconv34
-rw-r--r--libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc52
3 files changed, 89 insertions, 0 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 88e8ed6..2950221 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,8 @@
2019-06-26 Jonathan Wakely <jwakely@redhat.com>
+ * include/std/charconv (chars_format): Define bitmask type.
+ * testsuite/20_util/to_chars/chars_format.cc: New test.
+
* include/bits/fs_path.h (path::__is_encoded_char): Use __is_one_of.
* include/std/bit (_If_is_unsigned_integer_type): Remove.
(_If_is_unsigned_integer): Use __is_unsigned_integer.
diff --git a/libstdc++-v3/include/std/charconv b/libstdc++-v3/include/std/charconv
index 6a33997..53aa63e 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 0000000..f343c58
--- /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);