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
This commit is contained in:
Jonathan Wakely 2019-06-26 23:54:38 +01:00 committed by Jonathan Wakely
parent 3fe0ddc883
commit 22ff8929d7
3 changed files with 89 additions and 0 deletions

View File

@ -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.

View File

@ -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

View File

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