/src/mysql-server/include/string_template_utils.h
Line | Count | Source |
1 | | /* Copyright (c) 2020, 2025, Oracle and/or its affiliates. |
2 | | |
3 | | This program is free software; you can redistribute it and/or modify |
4 | | it under the terms of the GNU General Public License, version 2.0, |
5 | | as published by the Free Software Foundation. |
6 | | |
7 | | This program is designed to work with certain software (including |
8 | | but not limited to OpenSSL) that is licensed under separate terms, |
9 | | as designated in a particular file or component or in included license |
10 | | documentation. The authors of MySQL hereby grant you an additional |
11 | | permission to link the program and your derivative works with the |
12 | | separately licensed software that they have either included with |
13 | | the program or referenced in the documentation. |
14 | | |
15 | | Without limiting anything contained in the foregoing, this file, |
16 | | which is part of C Driver for MySQL (Connector/C), is also subject to the |
17 | | Universal FOSS Exception, version 1.0, a copy of which can be found at |
18 | | http://oss.oracle.com/licenses/universal-foss-exception. |
19 | | |
20 | | This program is distributed in the hope that it will be useful, |
21 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
22 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
23 | | GNU General Public License, version 2.0, for more details. |
24 | | |
25 | | You should have received a copy of the GNU General Public License |
26 | | along with this program; if not, write to the Free Software |
27 | | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
28 | | |
29 | | #ifndef INCLUDE_STRING_TEMPLATE_UTILS_H_ |
30 | | #define INCLUDE_STRING_TEMPLATE_UTILS_H_ |
31 | | |
32 | | #include <cstring> |
33 | | #include <string> |
34 | | |
35 | 0 | static inline size_t length_of_string(const std::string &s) { return s.size(); } |
36 | | |
37 | 4 | static inline size_t length_of_string(const char *s) { return strlen(s); } |
38 | | |
39 | | template <typename S> |
40 | 2 | size_t sum_sizeof_strings(S s) { |
41 | 2 | return length_of_string(s); |
42 | 2 | } |
43 | | |
44 | | template <typename H, typename... T> |
45 | 2 | size_t sum_sizeof_strings(H head, T... tail) { |
46 | 2 | return length_of_string(head) + sum_sizeof_strings(tail...); |
47 | 2 | } unsigned long sum_sizeof_strings<char const*, char const*>(char const*, char const*) Line | Count | Source | 45 | 2 | size_t sum_sizeof_strings(H head, T... tail) { | 46 | 2 | return length_of_string(head) + sum_sizeof_strings(tail...); | 47 | 2 | } |
Unexecuted instantiation: unsigned long sum_sizeof_strings<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, char const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, char const*) |
48 | | |
49 | | template <typename S> |
50 | 2 | void concatenate_acc(std::string *acc, S s) { |
51 | 2 | *acc += s; |
52 | 2 | } |
53 | | |
54 | | template <typename H, typename... T> |
55 | 2 | void concatenate_acc(std::string *acc, H head, T... tail) { |
56 | 2 | *acc += head; |
57 | 2 | concatenate_acc(acc, tail...); |
58 | 2 | } void concatenate_acc<char const*, char const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, char const*, char const*) Line | Count | Source | 55 | 2 | void concatenate_acc(std::string *acc, H head, T... tail) { | 56 | 2 | *acc += head; | 57 | 2 | concatenate_acc(acc, tail...); | 58 | 2 | } |
Unexecuted instantiation: void concatenate_acc<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, char const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, char const*) |
59 | | |
60 | | /** |
61 | | Concatenate a list of std::string or '\0'-terminated strings |
62 | | |
63 | | @note throws std::bad_alloc |
64 | | |
65 | | @param s List of std::string or '\0'-terminated strings |
66 | | |
67 | | @returns concatenated string |
68 | | */ |
69 | | template <typename... S> |
70 | 2 | std::string concatenate(S... s) { |
71 | 2 | std::string acc; |
72 | 2 | acc.reserve(sum_sizeof_strings(s...)); |
73 | 2 | concatenate_acc(&acc, s...); |
74 | 2 | return acc; |
75 | 2 | } std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > concatenate<char const*, char const*>(char const*, char const*) Line | Count | Source | 70 | 2 | std::string concatenate(S... s) { | 71 | 2 | std::string acc; | 72 | 2 | acc.reserve(sum_sizeof_strings(s...)); | 73 | 2 | concatenate_acc(&acc, s...); | 74 | 2 | return acc; | 75 | 2 | } |
Unexecuted instantiation: std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > concatenate<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, char const*>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, char const*, char const*) |
76 | | |
77 | | #endif // INCLUDE_STRING_TEMPLATE_UTILS_H_ |