Optimize win32 filesystem access via static buffer or unlimited path len
This commit is contained in:
@@ -8,16 +8,12 @@
|
||||
#include "Engine/Core/Types/StringView.h"
|
||||
#include "Engine/Core/Math/Math.h"
|
||||
#include "Engine/Core/Collections/Array.h"
|
||||
#include "Engine/Utilities/StringConverter.h"
|
||||
#include "IncludeWindowsHeaders.h"
|
||||
|
||||
const DateTime WindowsEpoch(1970, 1, 1);
|
||||
|
||||
#define WIN32_INIT_BUFFER(path, buffer) \
|
||||
Char buffer[MAX_PATH]; \
|
||||
if (path.Length() > MAX_PATH) \
|
||||
return true; \
|
||||
Platform::MemoryCopy(buffer, path.Get(), path.Length() * sizeof(Char)); \
|
||||
buffer[path.Length()] = 0
|
||||
#define WIN32_INIT_BUFFER(path, buffer) StringAsTerminated<> buffer(path.Get(), path.Length())
|
||||
|
||||
bool Win32FileSystem::CreateDirectory(const StringView& path)
|
||||
{
|
||||
|
||||
@@ -132,3 +132,36 @@ public:
|
||||
this->_static = text;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename CharType = Char>
|
||||
class StringAsTerminated
|
||||
{
|
||||
protected:
|
||||
const CharType* _static = nullptr;
|
||||
CharType* _dynamic = nullptr;
|
||||
|
||||
public:
|
||||
StringAsTerminated(const CharType* str, int32 length)
|
||||
{
|
||||
if (length != 0 && str[length] == 0) // Unsafe to access out of bounds...
|
||||
{
|
||||
_static = str;
|
||||
}
|
||||
else
|
||||
{
|
||||
_dynamic = (CharType*)Allocator::Allocate((length + 1) * sizeof(CharType));
|
||||
Platform::MemoryCopy(_dynamic, str, length * sizeof(CharType));
|
||||
_dynamic[length] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
~StringAsTerminated()
|
||||
{
|
||||
Allocator::Free(_dynamic);
|
||||
}
|
||||
|
||||
operator const CharType*() const
|
||||
{
|
||||
return _static ? _static : _dynamic;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user