xref: /llvm-project/libcxx/test/std/utilities/format/format.tuple/parse.pass.cpp (revision 6a54dfbfe534276d644d7f9c027f0deeb748dd53)
1eb6e13cbSMark de Wever //===----------------------------------------------------------------------===//
2*6a54dfbfSLouis Dionne //
3eb6e13cbSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4eb6e13cbSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
5eb6e13cbSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6eb6e13cbSMark de Wever //
7eb6e13cbSMark de Wever //===----------------------------------------------------------------------===//
8eb6e13cbSMark de Wever 
9eb6e13cbSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10eb6e13cbSMark de Wever 
11520c7fbbSLouis Dionne // UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME
12af5fc4b4SMark de Wever 
13eb6e13cbSMark de Wever // <format>
14eb6e13cbSMark de Wever 
15eb6e13cbSMark de Wever // template<class charT, formattable<charT>... Ts>
16eb6e13cbSMark de Wever //   struct formatter<pair-or-tuple<Ts...>, charT>
17eb6e13cbSMark de Wever 
18eb6e13cbSMark de Wever // template<class ParseContext>
19eb6e13cbSMark de Wever //   constexpr typename ParseContext::iterator
20eb6e13cbSMark de Wever //     parse(ParseContext& ctx);
21eb6e13cbSMark de Wever 
22eb6e13cbSMark de Wever // Note this tests the basics of this function. It's tested in more detail in
23eb6e13cbSMark de Wever // the format functions tests.
24eb6e13cbSMark de Wever 
25eb6e13cbSMark de Wever #include <cassert>
26eb6e13cbSMark de Wever #include <concepts>
27eb6e13cbSMark de Wever #include <format>
2863ae5099SA. Jiang #include <memory>
29eb6e13cbSMark de Wever #include <tuple>
30eb6e13cbSMark de Wever #include <utility>
31eb6e13cbSMark de Wever 
32eb6e13cbSMark de Wever #include "test_macros.h"
33eb6e13cbSMark de Wever #include "make_string.h"
34eb6e13cbSMark de Wever 
35eb6e13cbSMark de Wever #define SV(S) MAKE_STRING_VIEW(CharT, S)
36eb6e13cbSMark de Wever 
37eb6e13cbSMark de Wever template <class Arg, class StringViewT>
383acf9b9cSMark de Wever constexpr void test(StringViewT fmt, std::size_t offset) {
39eb6e13cbSMark de Wever   using CharT    = typename StringViewT::value_type;
40eb6e13cbSMark de Wever   auto parse_ctx = std::basic_format_parse_context<CharT>(fmt);
41eb6e13cbSMark de Wever   std::formatter<Arg, CharT> formatter;
42eb6e13cbSMark de Wever   static_assert(std::semiregular<decltype(formatter)>);
43eb6e13cbSMark de Wever 
44eb6e13cbSMark 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);
47eb6e13cbSMark de Wever }
48eb6e13cbSMark de Wever 
49eb6e13cbSMark de Wever template <class CharT, class Arg>
50eb6e13cbSMark de Wever constexpr void test() {
513acf9b9cSMark de Wever   test<Arg>(SV(""), 0);
523acf9b9cSMark de Wever   test<Arg>(SV("42"), 0);
53eb6e13cbSMark de Wever 
543acf9b9cSMark de Wever   test<Arg>(SV("}"), 1);
553acf9b9cSMark de Wever   test<Arg>(SV("42}"), 1);
56eb6e13cbSMark de Wever }
57eb6e13cbSMark de Wever 
58eb6e13cbSMark de Wever template <class CharT>
59eb6e13cbSMark de Wever constexpr void test() {
60eb6e13cbSMark de Wever   test<CharT, std::tuple<int>>();
61eb6e13cbSMark de Wever   test<CharT, std::tuple<int, CharT>>();
62eb6e13cbSMark de Wever   test<CharT, std::pair<int, CharT>>();
633d334df5SLouis Dionne   test<CharT, std::tuple<int, CharT, bool>>();
64eb6e13cbSMark de Wever }
65eb6e13cbSMark de Wever 
66eb6e13cbSMark de Wever constexpr bool test() {
67eb6e13cbSMark de Wever   test<char>();
68eb6e13cbSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
69eb6e13cbSMark de Wever   test<wchar_t>();
70eb6e13cbSMark de Wever #endif
71eb6e13cbSMark de Wever 
72eb6e13cbSMark de Wever   return true;
73eb6e13cbSMark de Wever }
74eb6e13cbSMark de Wever 
75eb6e13cbSMark de Wever int main(int, char**) {
76eb6e13cbSMark de Wever   test();
77eb6e13cbSMark de Wever   static_assert(test());
78eb6e13cbSMark de Wever 
79eb6e13cbSMark de Wever   return 0;
80eb6e13cbSMark de Wever }
81