#ifndef CORE_META_HPP #define CORE_META_HPP namespace Core { namespace Internal { template struct BaseRemovePointer final { using Type = T; }; template struct BaseRemovePointer final { using Type = T; }; template struct BaseRemoveReference final { using Type = T; }; template struct BaseRemoveReference final { using Type = T; }; template struct BaseRemoveReference final { using Type = T; }; template struct BaseIsSame final { static constexpr bool value = false; }; template struct BaseIsSame final { static constexpr bool value = true; }; template struct BaseIf final { using Type = A; }; template struct BaseIf final { using Type = B; }; } template using RemovePointer = Internal::BaseRemovePointer::Type; template using RemoveReference = Internal::BaseRemoveReference::Type; template constexpr bool IsSame = Internal::BaseIsSame::value; template using If = Internal::BaseIf::Type; template constexpr RemoveReference&& move(T&& t) { return static_cast&&>(t); } template constexpr T&& forward(RemoveReference& t) { return static_cast(t); } template constexpr T&& forward(RemoveReference&& t) { return static_cast(t); } template void swap(T& a, T& b) { T tmp = Core::move(a); a = Core::move(b); b = Core::move(tmp); } } #endif