public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Define std::chars_format enumeration type
@ 2019-06-26 22:55 Jonathan Wakely
  0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2019-06-26 22:55 UTC (permalink / raw)
  To: libstdc++, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 278 bytes --]

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.



[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 4509 bytes --]

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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-06-26 22:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-26 22:55 [PATCH] Define std::chars_format enumeration type Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).