188622aabSMark de Wever //===----------------------------------------------------------------------===//
2*6a54dfbfSLouis Dionne //
388622aabSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
488622aabSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
588622aabSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
688622aabSMark de Wever //
788622aabSMark de Wever //===----------------------------------------------------------------------===//
888622aabSMark de Wever 
988622aabSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
1088622aabSMark de Wever // UNSUPPORTED: no-threads
1188622aabSMark de Wever 
12520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
1388622aabSMark de Wever 
1488622aabSMark de Wever // <thread>
1588622aabSMark de Wever 
1688622aabSMark de Wever // template<class charT>
1788622aabSMark de Wever // struct formatter<thread::id, charT>;
1888622aabSMark de Wever 
1988622aabSMark de Wever // template<class ParseContext>
2088622aabSMark de Wever //   constexpr typename ParseContext::iterator
2188622aabSMark de Wever //     parse(ParseContext& ctx);
2288622aabSMark de Wever 
2388622aabSMark de Wever // Note this tests the basics of this function. It's tested in more detail in
2488622aabSMark de Wever // the format functions test.
2588622aabSMark de Wever 
2688622aabSMark de Wever #include <cassert>
2788622aabSMark de Wever #include <concepts>
2817f00620SNikolas Klauser #include <format>
2963ae5099SA. Jiang #include <memory>
3088622aabSMark de Wever #include <thread>
3188622aabSMark de Wever 
3288622aabSMark de Wever #include "test_macros.h"
3388622aabSMark de Wever #include "make_string.h"
3488622aabSMark de Wever 
3588622aabSMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S)
3688622aabSMark de Wever 
3788622aabSMark de Wever template <class StringViewT>
383acf9b9cSMark de Wever constexpr void test_parse(StringViewT fmt, std::size_t offset) {
3988622aabSMark de Wever   using CharT    = typename StringViewT::value_type;
4088622aabSMark de Wever   auto parse_ctx = std::basic_format_parse_context<CharT>(fmt);
4188622aabSMark de Wever   std::formatter<std::thread::id, CharT> formatter;
4288622aabSMark de Wever   static_assert(std::semiregular<decltype(formatter)>);
4388622aabSMark de Wever 
4488622aabSMark de Wever   std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
4563ae5099SA. Jiang   // std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
4663ae5099SA. Jiang   assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4788622aabSMark de Wever }
4888622aabSMark de Wever 
4988622aabSMark de Wever template <class CharT>
5088622aabSMark de Wever constexpr void test_fmt() {
513acf9b9cSMark de Wever   test_parse(SV(""), 0);
523acf9b9cSMark de Wever   test_parse(SV("1"), 0);
5388622aabSMark de Wever 
543acf9b9cSMark de Wever   test_parse(SV("}"), 1);
553acf9b9cSMark de Wever   test_parse(SV("1}"), 1);
5688622aabSMark de Wever }
5788622aabSMark de Wever 
5888622aabSMark de Wever constexpr bool test() {
5988622aabSMark de Wever   test_fmt<char>();
6088622aabSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
6188622aabSMark de Wever   test_fmt<wchar_t>();
6288622aabSMark de Wever #endif
6388622aabSMark de Wever 
6488622aabSMark de Wever   return true;
6588622aabSMark de Wever }
6688622aabSMark de Wever 
6788622aabSMark de Wever int main(int, char**) {
6888622aabSMark de Wever   test();
6988622aabSMark de Wever   static_assert(test());
7088622aabSMark de Wever 
7188622aabSMark de Wever   return 0;
7288622aabSMark de Wever }
73