#pragma once namespace std { template constexpr bool _is_same_helper = false; template constexpr bool _is_same_helper = true; template concept same_as = _is_same_helper && _is_same_helper; template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template struct remove_reference { using type = T; }; template using remove_reference_t = remove_reference::type; template constexpr remove_reference_t&& move(T&& r) noexcept { return static_cast&&>(r); } template constexpr T&& forward(remove_reference_t& r) noexcept { return static_cast(r); } template constexpr T&& forward(remove_reference_t&& r) noexcept // NOLINT { return static_cast(r); } template constexpr T exchange(T& obj, U&& new_value) { T old_value = std::move(obj); obj = std::forward(new_value); return old_value; } } // namespace std static_assert(std::same_as, ""); static_assert(!std::same_as, ""); static_assert(std::same_as, int>, ""); static_assert(std::same_as, int>, ""); static_assert(std::same_as, int>, "");