//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// Note: chars_format is a C++17 feature backported to C++11. Assert isn't
// allowed in a constexpr function in C++11. To keep the code readable, C++11
// support is untested.
// UNSUPPORTED: c++03, c++11

// <charconv>

// Bitmask type
// enum class chars_format {
//   scientific = unspecified,
//   fixed = unspecified,
//   hex = unspecified,
//   general = fixed | scientific
// };

#include <charconv>
#include <cassert>

#include "test_macros.h"

constexpr bool test() {
  using cf = std::chars_format;
  using ut = std::underlying_type<cf>::type;

  {
    cf x = cf::scientific;
    x |= cf::fixed;
    assert(x == cf::general);
  }
  {
    cf x = cf::general;
    x &= cf::fixed;
    assert(x == cf::fixed);
  }
  {
    cf x = cf::general;
    x ^= cf::fixed;
    assert(x == cf::scientific);
  }

  assert(static_cast<ut>(cf::scientific & (cf::fixed | cf::hex)) == 0);
  assert(static_cast<ut>(cf::fixed & (cf::scientific | cf::hex)) == 0);
  assert(static_cast<ut>(cf::hex & (cf::scientific | cf::fixed)) == 0);

  assert((cf::scientific | cf::fixed) == cf::general);

  assert(static_cast<ut>(cf::scientific & cf::fixed) == 0);

  assert((cf::general ^ cf::fixed) == cf::scientific);

  assert((~cf::hex & cf::general) == cf::general);

  return true;
}

std::chars_format x;
static_assert(std::is_same<std::chars_format, decltype(~x)>::value, "");
static_assert(std::is_same<std::chars_format, decltype(x & x)>::value, "");
static_assert(std::is_same<std::chars_format, decltype(x | x)>::value, "");
static_assert(std::is_same<std::chars_format, decltype(x ^ x)>::value, "");
static_assert(std::is_same<std::chars_format&, decltype(x &= x)>::value, "");
static_assert(std::is_same<std::chars_format&, decltype(x |= x)>::value, "");
static_assert(std::is_same<std::chars_format&, decltype(x ^= x)>::value, "");

int main(int, char**) {
  assert(test());
  static_assert(test(), "");

  return 0;
}
