From 22ff8929d779c82e8463c1910edcfff475f56c18 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 26 Jun 2019 23:54:38 +0100 Subject: [PATCH] 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 --- libstdc++-v3/ChangeLog | 3 ++ libstdc++-v3/include/std/charconv | 34 ++++++++++++ .../20_util/to_chars/chars_format.cc | 52 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 libstdc++-v3/testsuite/20_util/to_chars/chars_format.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 88e8ed65e10..29502215816 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,8 @@ 2019-06-26 Jonathan Wakely + * 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 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 +// . + +// { dg-options "-std=gnu++17" } +// { dg-do compile { target c++17 } } + +#include + +// 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); +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);