master
 1//===----------------------------------------------------------------------===//
 2//
 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 4// See https://llvm.org/LICENSE.txt for license information.
 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 6//
 7//===----------------------------------------------------------------------===//
 8
 9#ifndef _LIBCPP___STRING_EXTERN_TEMPLATE_LISTS_H
10#define _LIBCPP___STRING_EXTERN_TEMPLATE_LISTS_H
11
12#include <__config>
13
14#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
15#  pragma GCC system_header
16#endif
17
18// clang-format off
19
20// We maintain multiple ABI lists:
21// - _LIBCPP_STRING_COMMON_EXTERN_TEMPLATE_LIST
22// - _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST
23// - _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST
24// As the name implies, the ABI lists define a common subset, the V1 (Stable) and unstable ABI.
25//
26// For unstable, we may explicitly remove function that are external in V1.
27//
28// For stable, the ABI list should rarely change, except for adding new
29// functions supporting new c++ version / API changes. Typically entries
30// must never be removed from the stable list.
31#define _LIBCPP_STRING_COMMON_EXTERN_TEMPLATE_LIST(Func, CharT)                                                        \
32    Func(void basic_string<CharT>::__init(const value_type*, size_type))                                               \
33    Func(void basic_string<CharT>::__init(size_type, value_type))                                                      \
34    Func(basic_string<CharT>::basic_string(const basic_string&, size_type, size_type, const allocator<CharT>&))        \
35    Func(basic_string<CharT>::~basic_string())                                                                         \
36    Func(basic_string<CharT>& basic_string<CharT>::operator=(value_type))                                              \
37    Func(basic_string<CharT>& basic_string<CharT>::assign(size_type, value_type))                                      \
38    Func(basic_string<CharT>& basic_string<CharT>::assign(const basic_string&, size_type, size_type))                  \
39    Func(basic_string<CharT>& basic_string<CharT>::append(size_type, value_type))                                      \
40    Func(basic_string<CharT>& basic_string<CharT>::append(const value_type*))                                          \
41    Func(basic_string<CharT>& basic_string<CharT>::append(const value_type*, size_type))                               \
42    Func(basic_string<CharT>& basic_string<CharT>::append(const basic_string&, size_type, size_type))                  \
43    Func(void basic_string<CharT>::push_back(value_type))                                                              \
44    Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, const value_type*))                               \
45    Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, size_type, value_type))                           \
46    Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, const value_type*, size_type))                    \
47    Func(basic_string<CharT>& basic_string<CharT>::insert(size_type, const basic_string&, size_type, size_type))       \
48    Func(basic_string<CharT>::iterator basic_string<CharT>::insert(basic_string::const_iterator, value_type))          \
49    Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, const value_type*))                   \
50    Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, size_type, value_type))               \
51    Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, const value_type*, size_type))        \
52    Func(basic_string<CharT>& basic_string<CharT>::replace(size_type, size_type, const basic_string&, size_type, size_type)) \
53    Func(void basic_string<CharT>::__grow_by_and_replace(size_type, size_type, size_type, size_type, size_type, size_type, const value_type*)) \
54    Func(void basic_string<CharT>::resize(size_type, value_type))                                                      \
55    Func(void basic_string<CharT>::reserve(size_type))                                                                 \
56    Func(basic_string<CharT>::size_type basic_string<CharT>::copy(value_type*, size_type, size_type) const)            \
57    Func(basic_string<CharT>::size_type basic_string<CharT>::find(value_type, size_type) const)                        \
58    Func(basic_string<CharT>::size_type basic_string<CharT>::find(const value_type*, size_type, size_type) const)      \
59    Func(basic_string<CharT>::size_type basic_string<CharT>::rfind(value_type, size_type) const)                       \
60    Func(basic_string<CharT>::size_type basic_string<CharT>::rfind(const value_type*, size_type, size_type) const)     \
61    Func(basic_string<CharT>::size_type basic_string<CharT>::find_first_of(const value_type*, size_type, size_type) const) \
62    Func(basic_string<CharT>::size_type basic_string<CharT>::find_last_of(const value_type*, size_type, size_type) const) \
63    Func(basic_string<CharT>::size_type basic_string<CharT>::find_first_not_of(const value_type*, size_type, size_type) const) \
64    Func(basic_string<CharT>::size_type basic_string<CharT>::find_last_not_of(const value_type*, size_type, size_type) const) \
65    Func(CharT& basic_string<CharT>::at(size_type))                                                                    \
66    Func(const CharT& basic_string<CharT>::at(size_type) const)                                                        \
67    Func(int basic_string<CharT>::compare(const value_type*) const)                                                    \
68    Func(int basic_string<CharT>::compare(size_type, size_type, const value_type*) const)                              \
69    Func(int basic_string<CharT>::compare(size_type, size_type, const value_type*, size_type) const)                   \
70    Func(int basic_string<CharT>::compare(size_type, size_type, const basic_string&, size_type, size_type) const)      \
71    Func(const basic_string<CharT>::size_type basic_string<CharT>::npos)                                               \
72
73#define _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(Func, CharT)                                                            \
74  _LIBCPP_STRING_COMMON_EXTERN_TEMPLATE_LIST(Func, CharT)                                                              \
75  Func(basic_string<CharT>::basic_string(const basic_string&))                                                         \
76  Func(basic_string<CharT>::basic_string(const basic_string&, const allocator<CharT>&))                                \
77  Func(basic_string<CharT>& basic_string<CharT>::assign(const value_type*))                                            \
78  Func(basic_string<CharT>& basic_string<CharT>::assign(const value_type*, size_type))                                 \
79  Func(basic_string<CharT>& basic_string<CharT>::operator=(basic_string const&))                                       \
80  Func(void basic_string<CharT>::__grow_by(size_type, size_type, size_type, size_type, size_type, size_type))          \
81  Func(basic_string<CharT>& basic_string<CharT>::erase(size_type, size_type))                                          \
82
83#define _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(Func, CharT)                                                      \
84  _LIBCPP_STRING_COMMON_EXTERN_TEMPLATE_LIST(Func, CharT)                                                              \
85  Func(void basic_string<CharT>::__init_copy_ctor_external(const value_type*, size_type))                              \
86  Func(basic_string<CharT>& basic_string<CharT>::__assign_external(const value_type*, size_type))                      \
87  Func(basic_string<CharT>& basic_string<CharT>::__assign_external(const value_type*))                                 \
88  Func(basic_string<CharT>& basic_string<CharT>::__assign_no_alias<false>(const value_type*, size_type))               \
89  Func(basic_string<CharT>& basic_string<CharT>::__assign_no_alias<true>(const value_type*, size_type))                \
90  Func(void basic_string<CharT>::__erase_external_with_move(size_type, size_type))
91
92// clang-format on
93
94#endif // _LIBCPP___STRING_EXTERN_TEMPLATE_LISTS_H