port 2A step 4: platform skeleton + rest of the 2V3 header closure
- Mirror the remaining non-Python 2V3 closure headers (98 more, 173 total): EffectLib, EterGrnLib, SpeedTreeLib, SphereLib, PRTerrainLib, EterImageLib, EterBase/Poly, cipher/tea, EterLib Grp*/IME/Input/MSWindow/StateManager, GameLib actor/map/race headers, EterPack. - SDK shims: granny.h, SpeedTreeRT.h, imm.h, Dimm.h (the SDK MIDL header, not mirrored), dinput/d3dx8 additions; D3D8 render-state enums, FVF macros and the COM resource hierarchy; more Win32 GDI/handle types with layout static_asserts. - PORT edits for MSVC-permissive code (typename, friend visibility, <algorithm>, pointer→uintptr_t) and PRTerrainLib/StdAfx.h dropping the ScriptLib/Python include. - port_logic links the vendored cryptopp/minilzo. - extension/src/platform: port_platform target with 103 generated stub files (1917 function stubs, 146 static members) from the new platform_stub.py (clang -ast-dump-filter); MT_PLATFORM_STUB() marks every unimplemented body. libmtgodot links port_platform and port_gate.sh builds it. Gate: macOS, Android, iOS, Windows (mingw) PASS; Linux BLOCKED (no toolchain). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
#pragma once
|
||||
// Support for the generated platform skeleton (platform_stub.py, docs/PORT-PLAN.md 2A). A function whose
|
||||
// body still starts with MT_PLATFORM_STUB() has no platform implementation yet; it does nothing and
|
||||
// returns a default value. With MT_PLATFORM_STUB_TRACE set in the environment, the first call of each
|
||||
// one is reported on stderr.
|
||||
|
||||
#include <cstdlib>
|
||||
#include <type_traits>
|
||||
|
||||
void mt_platform_stub_called(const char* function, bool* reported);
|
||||
|
||||
#define MT_PLATFORM_STUB() \
|
||||
do \
|
||||
{ \
|
||||
static bool mt_platform_stub_reported = false; \
|
||||
mt_platform_stub_called(__func__, &mt_platform_stub_reported); \
|
||||
} while (0)
|
||||
|
||||
template <class T>
|
||||
T mt_platform_stub_return()
|
||||
{
|
||||
if constexpr (std::is_reference_v<T>)
|
||||
{
|
||||
using U = std::remove_cv_t<std::remove_reference_t<T>>;
|
||||
if constexpr (std::is_default_constructible_v<U> && !std::is_abstract_v<U>)
|
||||
{
|
||||
static U value{};
|
||||
return static_cast<T>(value);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Never constructed: a caller that uses the referent of an unimplemented platform function
|
||||
// is a bug the stub cannot hide.
|
||||
alignas(U) static unsigned char storage[sizeof(U)];
|
||||
return static_cast<T>(*reinterpret_cast<U*>(storage));
|
||||
}
|
||||
}
|
||||
else if constexpr (std::is_default_constructible_v<T>)
|
||||
{
|
||||
return T{};
|
||||
}
|
||||
else
|
||||
{
|
||||
std::abort();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user