Files
botw/lib/sead/include/prim/seadBitUtil.h
T
Léo Lam 18c60323a9 Switch to subrepos
git subrepo clone https://github.com/open-ead/sead lib/sead

subrepo:
  subdir:   "lib/sead"
  merged:   "1b66e825d"
upstream:
  origin:   "https://github.com/open-ead/sead"
  branch:   "master"
  commit:   "1b66e825d"
git-subrepo:
  version:  "0.4.3"
  origin:   "https://github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

git subrepo clone (merge) https://github.com/open-ead/nnheaders lib/NintendoSDK

subrepo:
  subdir:   "lib/NintendoSDK"
  merged:   "9ee21399f"
upstream:
  origin:   "https://github.com/open-ead/nnheaders"
  branch:   "master"
  commit:   "9ee21399f"
git-subrepo:
  version:  "0.4.3"
  origin:   "ssh://git@github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

git subrepo clone https://github.com/open-ead/agl lib/agl

subrepo:
  subdir:   "lib/agl"
  merged:   "7c063271b"
upstream:
  origin:   "https://github.com/open-ead/agl"
  branch:   "master"
  commit:   "7c063271b"
git-subrepo:
  version:  "0.4.3"
  origin:   "ssh://git@github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"

git subrepo clone https://github.com/open-ead/EventFlow lib/EventFlow

subrepo:
  subdir:   "lib/EventFlow"
  merged:   "c35d21b34"
upstream:
  origin:   "https://github.com/open-ead/EventFlow"
  branch:   "master"
  commit:   "c35d21b34"
git-subrepo:
  version:  "0.4.3"
  origin:   "ssh://git@github.com/ingydotnet/git-subrepo"
  commit:   "2f68596"
2022-03-21 21:31:42 +01:00

49 lines
1.3 KiB
C++

#pragma once
#include <cstring>
#include <basis/seadTypes.h>
namespace sead
{
// This does not actually seem to exist in Nintendo's sead, but for convenience reasons and to
// easily avoid UB let's pretend this exists.
namespace BitUtil
{
inline void* addOffset(const void* ptr, intptr_t offset)
{
return reinterpret_cast<void*>(uintptr_t(ptr) + offset);
}
// Convenience function to avoid UB.
// Nintendo appears to perform type punning, but we care about UB.
template <typename To, typename From>
inline To bitCast(From value)
{
static_assert(sizeof(To) == sizeof(From), "To and From must have the same size");
To result;
std::memcpy(&result, &value, sizeof(value));
return result;
}
// Convenience function to avoid UB.
// Nintendo appears to perform type punning, but we care about UB.
template <typename To>
inline To bitCastPtr(const void* value, intptr_t offset = 0)
{
To result;
std::memcpy(&result, addOffset(value, offset), sizeof(To));
return result;
}
// Convenience function to avoid UB.
// Nintendo appears to perform type punning, but we care about UB.
template <typename To, typename From>
inline void bitCastWrite(const From& value, To* ptr)
{
static_assert(sizeof(To) == sizeof(From), "To and From must have the same size");
std::memcpy(ptr, &value, sizeof(To));
}
} // namespace BitUtil
} // namespace sead