MySQL 9.6.0
Source Code Documentation
forward_like.h
Go to the documentation of this file.
1// Copyright (c) 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// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License, version 2.0, for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23
24#ifndef MYSQL_UTILS_FORWARD_LIKE_H
25#define MYSQL_UTILS_FORWARD_LIKE_H
26
27/// @file
28/// Experimental API header
29
30#include <type_traits> // is_lvalue_reference
31#include <utility> // move
32
33/// @addtogroup GroupLibsMysqlUtils
34/// @{
35
36namespace mysql::utils {
37
38/// Implementation of C++23's `std::forward_like`.
39//
40// Todo: When we have C++23, remove this and use `std::forward_like`.
41//
42// clang-tidy has many complaints here. Basically the reason is that we are not
43// following typical idioms, and the reason for that is that we are implementing
44// the idiom. This implementation is equivalent to the "possible implementation"
45// at https://en.cppreference.com/w/cpp/utility/forward_like.html
46template <class Qualifiers_from_t, class Value_t>
47// NOLINTNEXTLINE(cppcoreguidelines-missing-std-forward)
48constexpr auto &&forward_like(Value_t &&x) noexcept {
49 constexpr bool is_const =
50 std::is_const_v<std::remove_reference_t<Qualifiers_from_t>>;
51 if constexpr (std::is_lvalue_reference_v<Qualifiers_from_t &&>) {
52 if constexpr (is_const)
53 return std::as_const(x);
54 else
55 // NOLINTNEXTLINE(readability-redundant-casting)
56 return static_cast<Value_t &>(x);
57 } else {
58 if constexpr (is_const)
59 return std::move(std::as_const(x));
60 else
61 // NOLINTNEXTLINE(bugprone-move-forwarding-reference)
62 return std::move(x);
63 }
64}
65
66} // namespace mysql::utils
67
68// addtogroup GroupLibsMysqlUtils
69/// @}
70
71#endif // ifndef MYSQL_UTILS_FORWARD_LIKE_H
Definition: gtid_format.h:47
constexpr auto && forward_like(Value_t &&x) noexcept
Implementation of C++23's std::forward_like.
Definition: forward_like.h:48
char * is_const(UDF_INIT *initid, UDF_ARGS *, char *result, unsigned long *length, unsigned char *is_null, unsigned char *)
Definition: udf_example.cc:873