//===----------------------------------------------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03
// UNSUPPORTED: !stdlib=libc++ && (c++11 || c++14)

// <string_view>

// Test that <string_view> provides all of the arithmetic, enum, and pointer
// hash specializations.

#include <string_view>

#include "constexpr_char_traits.h"
#include "poisoned_hash_helper.h"
#include "test_macros.h"

struct MyChar {
  char c;
};

template <>
struct std::char_traits<MyChar> {
  using char_type  = MyChar;
  using int_type   = std::char_traits<char>::int_type;
  using off_type   = std::char_traits<char>::off_type;
  using pos_type   = std::char_traits<char>::pos_type;
  using state_type = std::char_traits<char>::state_type;

  static void assign(char_type&, const char_type&);
  static bool eq(char_type, char_type);
  static bool lt(char_type, char_type);

  static int compare(const char_type*, const char_type*, std::size_t);
  static std::size_t length(const char_type*);
  static const char_type* find(const char_type*, std::size_t, const char_type&);
  static char_type* move(char_type*, const char_type*, std::size_t);
  static char_type* copy(char_type*, const char_type*, std::size_t);
  static char_type* assign(char_type*, std::size_t, char_type);

  static int_type not_eof(int_type);
  static char_type to_char_type(int_type);
  static int_type to_int_type(char_type);
  static bool eq_int_type(int_type, int_type);
  static int_type eof();
};

int main(int, char**) {
  test_library_hash_specializations_available();
  {
    test_hash_enabled_for_type<std::string_view>();
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
    test_hash_enabled_for_type<std::wstring_view>();
#endif
#ifndef TEST_HAS_NO_CHAR8_T
    test_hash_enabled_for_type<std::u8string_view>();
#endif
    test_hash_enabled_for_type<std::u16string_view>();
    test_hash_enabled_for_type<std::u32string_view>();
    test_hash_disabled_for_type<std::basic_string_view<MyChar, std::char_traits<MyChar>>>();
    test_hash_disabled_for_type<std::basic_string_view<char, constexpr_char_traits<char>>>();
  }

  return 0;
}
