#ifndef XNA_HELPERS_HPP #define XNA_HELPERS_HPP #include #include #include namespace xna { struct XnaHelper { template struct is_shared_ptr : std::false_type {}; template struct is_shared_ptr> : std::true_type {}; static inline std::wstring ToWString(const std::string& str) { std::wstring wstr; size_t size; wstr.resize(str.length()); mbstowcs_s(&size, &wstr[0], wstr.size() + 1, str.c_str(), str.size()); return wstr; } static inline std::string ToString(const std::wstring& wstr) { std::string str; size_t size; str.resize(wstr.length()); wcstombs_s(&size, &str[0], str.size() + 1, wstr.c_str(), wstr.size()); return str; } template static constexpr void HashCombine(std::size_t& seed, const T& v) { std::hash hasher; seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } template static inline auto ReturnDefaultOrNull() { if constexpr (is_shared_ptr::value) return (T)nullptr; else if (std::is_default_constructible::value) return T(); else throw std::runtime_error("Unable to build object"); } }; } #endif