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