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:
parent
3fe0ddc883
commit
22ff8929d7
3 changed files with 89 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
52
libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc
Normal file
52
libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc
Normal 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);
|
Loading…
Add table
Reference in a new issue