Initial Commit
This commit is contained in:
parent
9b575eb021
commit
eb4a495199
18
.gitignore
vendored
Normal file
18
.gitignore
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
Build_CompilerWorkingDirectory/*
|
||||
Build_Developers/*
|
||||
Build_Ship/*
|
||||
Build_Internal/*
|
||||
*.vcxproj
|
||||
*.vcxproj.filters
|
||||
*.vcxproj.user
|
||||
*.licenseheader
|
||||
*.dll
|
||||
*.exe
|
||||
*.obj
|
||||
*.so
|
||||
*.dynlib
|
||||
*.lib
|
||||
*.d
|
||||
*.o
|
||||
*.out
|
||||
.vs
|
20
Aurora.json
Normal file
20
Aurora.json
Normal file
@ -0,0 +1,20 @@
|
||||
{
|
||||
"type": "aurora",
|
||||
"name": "AuroraRuntime",
|
||||
"dllexport": ["AURORA_ENGINE_KERNEL_EXPORT"],
|
||||
"dllimport": [],
|
||||
"impDefines": ["AURORA_ENGINE_KERNEL"],
|
||||
"staticImpDefines": "AURORA_ENGINE_KERNEL_STATIC",
|
||||
"defines": [],
|
||||
"soft-depends": ["wxwidgets"],
|
||||
"depends": ["glm", "asio", "mimalloc", "uuid", "fmt", "json", "bzip2", "ltc", "o1heap", "zstd", "zlib", "lz4", "mbedtls"],
|
||||
"features": ["remove-platform-code", "guess-platform-code"],
|
||||
"actions": [
|
||||
{
|
||||
"if": "win32",
|
||||
"then": {
|
||||
"links": "Bcrypt.lib"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
319
Include/Aurora/Async/Async.hpp
Normal file
319
Include/Aurora/Async/Async.hpp
Normal file
@ -0,0 +1,319 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Async.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Async
|
||||
{
|
||||
class IWorkItem;
|
||||
class IAsyncApp;
|
||||
|
||||
using AVoid = AuUInt8;
|
||||
|
||||
AUKN_SYM IAsyncApp *GetAsyncApp();
|
||||
|
||||
using ThreadGroup_t = AuUInt8;
|
||||
using ThreadId_t = AuUInt16;
|
||||
|
||||
using WorkerId_t = std::pair<ThreadGroup_t, ThreadId_t>;
|
||||
using DispatchTarget_t = std::pair<ThreadGroup_t, std::optional<ThreadId_t>>;
|
||||
|
||||
struct IWorkItemHandler
|
||||
{
|
||||
enum class EProcessNext
|
||||
{
|
||||
eInvalid = -1,
|
||||
eFinished = 0,
|
||||
eRerun,
|
||||
eSchedule,
|
||||
eFailed
|
||||
};
|
||||
|
||||
struct ProcessInfo
|
||||
{
|
||||
ProcessInfo(bool finished) : type(finished ? EProcessNext::eFinished : EProcessNext::eFailed) {}
|
||||
ProcessInfo(EProcessNext type) : type(type) {}
|
||||
ProcessInfo(const AuList<AuSPtr<IWorkItem>> &blockedBy) : type(EProcessNext::eSchedule), waitFor(blockedBy) {}
|
||||
// ...
|
||||
|
||||
EProcessNext type;
|
||||
AuList<AuSPtr<IWorkItem>> waitFor;
|
||||
AuUInt32 reschedMs;
|
||||
//AuUInt64 reschedNs;
|
||||
};
|
||||
|
||||
virtual void DispatchFrame(ProcessInfo &info) = 0;
|
||||
virtual void Shutdown() = 0;
|
||||
};
|
||||
|
||||
|
||||
template<typename Info_t = AVoid, typename Result_t = AVoid>
|
||||
struct FJob
|
||||
{
|
||||
std::function<void(const Info_t &, const Result_t &)> onSuccess = 0;
|
||||
std::function<void(const Info_t &, bool)> onFailure = 0;
|
||||
};
|
||||
|
||||
template<typename Info_t = AVoid, typename Result_t = AVoid>
|
||||
struct CJob
|
||||
{
|
||||
void(* onSuccess)(const Info_t &, const Result_t &); //
|
||||
void(* onFailure)(const Info_t &, bool taskNeverDispatched); // called from caller thread if taskNeverDispatched
|
||||
};
|
||||
|
||||
template<typename Info_t = AVoid, typename Result_t = AVoid>
|
||||
struct FTask
|
||||
{
|
||||
std::function<std::optional<Result_t>(const Info_t &)> onFrame = 0;
|
||||
};
|
||||
|
||||
template<typename Info_t = AVoid, typename Result_t = AVoid>
|
||||
struct CTask
|
||||
{
|
||||
std::optional<Result_t>(* onFrame)(const Info_t &);
|
||||
};
|
||||
|
||||
|
||||
class IWorkItem
|
||||
{
|
||||
public:
|
||||
virtual void WaitFor(const AuSPtr<IWorkItem> &workItem) = 0;
|
||||
virtual void WaitFor(const AuList<AuSPtr<IWorkItem>> &workItem) = 0;
|
||||
virtual void SetSchedTime(AuUInt32 ms) = 0;
|
||||
|
||||
virtual void Dispatch() = 0;
|
||||
|
||||
virtual bool BlockUntilComplete() = 0;
|
||||
virtual bool HasFinished() = 0;
|
||||
virtual bool HasFailed() = 0;
|
||||
};
|
||||
|
||||
|
||||
AUKN_SYM AuSPtr<IWorkItem> NewWorkItem(const DispatchTarget_t &worker, const AuSPtr<IWorkItemHandler> &task, bool supportsBlocking = false);
|
||||
|
||||
struct BasicWorkStdFunc : IWorkItemHandler
|
||||
{
|
||||
std::function<void()> callback;
|
||||
std::function<void()> error;
|
||||
|
||||
BasicWorkStdFunc(std::function<void()> &&callback, std::function<void()> &&error) : callback(std::move(callback)), error(std::move(error))
|
||||
{}
|
||||
|
||||
BasicWorkStdFunc(std::function<void()> &&callback) : callback(std::move(callback))
|
||||
{}
|
||||
|
||||
BasicWorkStdFunc(const std::function<void()> &callback) : callback(callback)
|
||||
{}
|
||||
|
||||
BasicWorkStdFunc(const std::function<void()> &callback, const std::function<void()> &error) : callback(callback), error(error)
|
||||
{}
|
||||
|
||||
private:
|
||||
|
||||
void DispatchFrame(ProcessInfo &info) override
|
||||
{
|
||||
try
|
||||
{
|
||||
callback();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Debug::PrintError();
|
||||
}
|
||||
}
|
||||
|
||||
void Shutdown() override
|
||||
{
|
||||
try
|
||||
{
|
||||
error();
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Debug::PrintError();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Info_t, typename Result_t, typename Task_t = FTask<Info_t, Result_t>, typename Job_t = FJob<Info_t, Result_t>>
|
||||
struct BasicWorkCallback : IWorkItemHandler, std::enable_shared_from_this<IWorkItemHandler>
|
||||
{
|
||||
BasicWorkCallback()
|
||||
{
|
||||
caller = GetAsyncApp()->GetCurrentThread();
|
||||
}
|
||||
|
||||
Task_t task;
|
||||
Job_t callback;
|
||||
|
||||
Info_t input;
|
||||
|
||||
private:
|
||||
|
||||
static constexpr bool IsCallbackPtr = std::is_pointer_v<Job_t> || is_base_of_template<AuSPtr, Job_t>;
|
||||
static constexpr bool IsTaskPtr = std::is_pointer_v<Task_t> || is_base_of_template<AuSPtr, Task_t>;
|
||||
|
||||
WorkerId_t caller;
|
||||
|
||||
void DispatchFrame(ProcessInfo &info) override
|
||||
{
|
||||
std::optional<Result_t> ret;
|
||||
|
||||
if constexpr (IsTaskPtr)
|
||||
{
|
||||
ret = task->onFrame(input);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = task.onFrame(input);
|
||||
}
|
||||
|
||||
auto pin = this->shared_from_this();
|
||||
|
||||
std::function<void()> func = [ret, &callback, &input, pin]()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ret.has_value())
|
||||
{
|
||||
if constexpr (IsCallbackPtr)
|
||||
{
|
||||
callback->onSuccess(input, *ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
callback.onSuccess(input, *ret);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if constexpr (IsCallbackPtr)
|
||||
{
|
||||
callback->onFailure(input, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
callback.onFailure(input, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Debug::PrintError();
|
||||
}
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
if (caller == GetAsyncApp()->GetCurrentThread())
|
||||
{
|
||||
func();
|
||||
}
|
||||
else
|
||||
{
|
||||
std::function<void()> err = [&callback, &input, pin]()
|
||||
{
|
||||
// TODO: we shold probably pass: is caller thread: false, has finished: true
|
||||
if constexpr (IsCallbackPtr)
|
||||
{
|
||||
callback->onFailure(input, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
callback.onFailure(input, false);
|
||||
}
|
||||
};
|
||||
|
||||
// TODO: this is somewhat evil. double alloc when we could reuse this
|
||||
WorkItemShared(caller, std::make_shared<BasicWorkStdFunc>(func, err))->Dispatch();
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Debug::PrintError();
|
||||
Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
void Shutdown() override
|
||||
{
|
||||
try
|
||||
{
|
||||
if constexpr (IsCallbackPtr)
|
||||
{
|
||||
callback->onFailure(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
callback.onFailure(true);
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
Debug::PrintError();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Frame_t = std::function<void()>, typename Cleanup_t = std::function<void()>>
|
||||
struct WorkItemCallabale : IWorkItemHandler
|
||||
{
|
||||
Frame_t frame;
|
||||
Cleanup_t cleanup;
|
||||
|
||||
private:
|
||||
void DispatchFrame(ProcessInfo &info) override
|
||||
{
|
||||
frame();
|
||||
info.type = IWorkItemHandler::EProcessNext::eFinished;
|
||||
}
|
||||
|
||||
void Shutdown() override
|
||||
{
|
||||
cleanup();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename B, typename... Args>
|
||||
static void TranslateAsyncFunctionToDispatcher()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
class IAsyncApp
|
||||
{
|
||||
public:
|
||||
// Main thread logic
|
||||
virtual void Main() = 0;
|
||||
virtual void Shutdown() = 0;
|
||||
virtual bool Exiting() = 0;
|
||||
|
||||
// Spawning
|
||||
virtual bool Spawn(WorkerId_t) = 0;
|
||||
virtual Threading::Threads::ThreadShared_t ResolveHandle(WorkerId_t) = 0;
|
||||
virtual AuBST<ThreadGroup_t, AuList<AuUInt8>> GetThreads() = 0;
|
||||
virtual WorkerId_t GetCurrentThread() = 0;
|
||||
|
||||
// Synchronization
|
||||
virtual bool Sync(ThreadGroup_t group, bool requireSignal = false, AuUInt32 timeout = 0) = 0;
|
||||
virtual void Signal(ThreadGroup_t group) = 0;
|
||||
|
||||
virtual bool WaitFor(DispatchTarget_t unlocker, Threading::IWaitable *primitive, int ms) = 0; // when unlocker = this, pump event loop
|
||||
|
||||
virtual bool SyncTimeout(ThreadGroup_t group, AuUInt32 ms) = 0;
|
||||
|
||||
virtual void SyncAllSafe() = 0;
|
||||
|
||||
// Features
|
||||
virtual void AddFeature(WorkerId_t id, AuSPtr<Threading::Threads::IThreadFeature> feature, bool async = false) = 0;
|
||||
|
||||
// Debug
|
||||
virtual void AssertInThreadGroup(ThreadGroup_t thread) = 0;
|
||||
virtual void AssertWorker(WorkerId_t id) = 0;
|
||||
};
|
||||
|
||||
}
|
31
Include/Aurora/Compression/BasicCompression.hpp
Normal file
31
Include/Aurora/Compression/BasicCompression.hpp
Normal file
@ -0,0 +1,31 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: BasicCompression.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Compression
|
||||
{
|
||||
/**
|
||||
Compresses an in memory blob with zstandard
|
||||
*/
|
||||
AUKN_SYM bool Compress(const void *buffer, AuUInt32 length, AuList<AuUInt8> &out, int compressionLevel = 3);
|
||||
|
||||
/**
|
||||
Compresses an in memory blob with zstandard
|
||||
*/
|
||||
AUKN_SYM bool Compress(const AuList<AuUInt8> &in, AuList<AuUInt8> &out, int compressionLevel = 3);
|
||||
|
||||
/**
|
||||
Decompresses an in memory blob with zstandard
|
||||
*/
|
||||
AUKN_SYM bool Decompress(const void *buffer, AuUInt32 length, AuList<AuUInt8> &out);
|
||||
|
||||
/**
|
||||
Decompresses an in memory blob with zstandard
|
||||
*/
|
||||
AUKN_SYM bool Decompress(const AuList<AuUInt8> &in, AuList<AuUInt8> &out);
|
||||
}
|
36
Include/Aurora/Compression/Compression.hpp
Normal file
36
Include/Aurora/Compression/Compression.hpp
Normal file
@ -0,0 +1,36 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Compression.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
/*
|
||||
Ballpark figures of real world performance:
|
||||
https://www.gaia-gis.it/fossil/librasterlite2/wiki?name=benchmarks+(2019+update)
|
||||
RELATIVE
|
||||
Useful for compression ratio variation and realistic igors lzma decompression perf values
|
||||
|
||||
9th gen intel benchmark figures in MB/s:
|
||||
https://github.com/lz4/lz4
|
||||
|
||||
Similar to above, i7 bin:
|
||||
https://facebook.github.io/zstd/
|
||||
|
||||
LZMA -> Large packages. Sony conures. (Reliable 2.3 - 2.5. Scales all the way up to 20+. Extremely slow but scalable)
|
||||
LZ4 -> Network compression and other large data streams (~4.5GB/s, 2.884 compression ratio)
|
||||
ZSTD -> Standard use (~1.5GB/s to 2.5GB/s, respective compression ratios 2.4 and 2.1. Can be pushed to ~10 at around 750MB/s. Great general use. )
|
||||
ZIP -> Zlib has a disgusting decompression upper limit of around 450MB/s for 2.7
|
||||
*/
|
||||
|
||||
#include "BasicCompression.hpp"
|
||||
|
||||
#include "ECompresionType.hpp"
|
||||
#include "CompressionInfo.hpp"
|
||||
|
||||
#include "StreamPipeProcessor.hpp"
|
||||
|
||||
#include "ICompressionStream.hpp"
|
||||
#include "StreamProcessor.hpp"
|
34
Include/Aurora/Compression/CompressionInfo.hpp
Normal file
34
Include/Aurora/Compression/CompressionInfo.hpp
Normal file
@ -0,0 +1,34 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: CompressionInfo.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Compression
|
||||
{
|
||||
struct CompressionInfo
|
||||
{
|
||||
ECompresionType type;
|
||||
|
||||
/// ZSTD: -5 <= level <= 22
|
||||
/// recommended: ZSTD_CLEVEL_DEFAULT
|
||||
/// LZMA: 0 <= level <= 9
|
||||
/// LZ4 : N/A
|
||||
/// ZLIB: 0 <= x >= 9
|
||||
/// recommended: 6
|
||||
/// BZIP: 0 <= x >= 9
|
||||
AuInt8 compressionLevel{};
|
||||
|
||||
/// LZMA: 5 <= fb <= 273, default = 32
|
||||
AuUInt32 fbWordSize{};
|
||||
|
||||
/// LZMA only
|
||||
/// (1 << 12) <= dictSize <= (1 << 27) for 32-bit version
|
||||
/// (1 << 12) <= dictSize <= (3 << 29) for 64-bit version
|
||||
/// default = (1 << 24)
|
||||
AuUInt32 dictSize{};
|
||||
};
|
||||
}
|
20
Include/Aurora/Compression/ECompresionType.hpp
Normal file
20
Include/Aurora/Compression/ECompresionType.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ECompresionType.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Compression
|
||||
{
|
||||
enum class ECompresionType
|
||||
{
|
||||
eLZMA,
|
||||
eZSTD,
|
||||
eDeflate,
|
||||
eLZ4,
|
||||
eBZIP2
|
||||
};
|
||||
}
|
24
Include/Aurora/Compression/ICompressionStream.hpp
Normal file
24
Include/Aurora/Compression/ICompressionStream.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ICompressionStream.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Compression
|
||||
{
|
||||
class ICompressionStream
|
||||
{
|
||||
public:
|
||||
virtual bool Ingest(AuUInt32 minimum, AuUInt32 request) = 0;
|
||||
virtual bool Read(void * /*opt*/, AuUInt32 &len, bool ingestUntilEOS = true) = 0;
|
||||
};
|
||||
|
||||
class ICompressionStreamEx : public ICompressionStream
|
||||
{
|
||||
public:
|
||||
virtual void Flush() = 0;
|
||||
};
|
||||
}
|
32
Include/Aurora/Compression/StreamPipeProcessor.hpp
Normal file
32
Include/Aurora/Compression/StreamPipeProcessor.hpp
Normal file
@ -0,0 +1,32 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: StreamPipeProcessor.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Compression
|
||||
{
|
||||
struct CompressionPipe
|
||||
{
|
||||
/// algorithm
|
||||
ECompresionType type;
|
||||
|
||||
/// LZMA decompression + compression, and ZSTD compression only
|
||||
AuUInt32 threads;
|
||||
|
||||
/// consume from stream callback
|
||||
std::function<AuUInt(void *, AuUInt)> inPipe;
|
||||
|
||||
/// write to stream callback
|
||||
std::function<void(const void *, AuUInt)> writePipe;
|
||||
|
||||
/// preemption and reporting
|
||||
std::function<bool(AuUInt, AuUInt)> reportProgress;
|
||||
};
|
||||
|
||||
AUKN_SYM bool Decompress(const CompressionPipe &stream);
|
||||
AUKN_SYM bool Compress(const CompressionPipe &stream, const CompressionInfo &info);
|
||||
}
|
16
Include/Aurora/Compression/StreamProcessor.hpp
Normal file
16
Include/Aurora/Compression/StreamProcessor.hpp
Normal file
@ -0,0 +1,16 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: StreamProcessor.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include <Aurora/IO/IO.hpp>
|
||||
|
||||
namespace Aurora::Compression
|
||||
{
|
||||
AUKN_SHARED_API(Decompressor, ICompressionStream, Aurora::IO::IStreamReader *reader, ECompresionType type);
|
||||
AUKN_SHARED_API(Compressor, ICompressionStreamEx, Aurora::IO::IStreamReader *reader, const CompressionInfo &info);
|
||||
}
|
18
Include/Aurora/Console/Commands/Commands.hpp
Normal file
18
Include/Aurora/Console/Commands/Commands.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Commands.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include <Aurora/Parse/Parse.hpp>
|
||||
|
||||
namespace Aurora::Console::Commands
|
||||
{
|
||||
using CommandCallback_cb = std::function<void(const Parse::ParsedObject &)>;
|
||||
|
||||
AUKN_SYM void AddCommand(const AuString &tag, const Parse::ParseObject &commandStructure, const CommandCallback_cb &callback);
|
||||
AUKN_SYM bool DispatchCommand(const AuString &string);
|
||||
}
|
20
Include/Aurora/Console/Console.hpp
Normal file
20
Include/Aurora/Console/Console.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Console.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "EAnsiColor.hpp"
|
||||
#include "ConsoleMessage.hpp"
|
||||
|
||||
namespace Aurora::Console
|
||||
{
|
||||
AUKN_SYM void WriteLine(const ConsoleMessage &msg);
|
||||
}
|
||||
|
||||
#include "Commands/Commands.hpp"
|
||||
#include "Hooks/Hooks.hpp"
|
||||
#include "Logging/Logging.hpp"
|
55
Include/Aurora/Console/ConsoleMessage.hpp
Normal file
55
Include/Aurora/Console/ConsoleMessage.hpp
Normal file
@ -0,0 +1,55 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ConsoleMessage.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
//#include <Aurora/Time/Time.hpp>
|
||||
|
||||
namespace Aurora::Threading::Threads
|
||||
{
|
||||
AUKN_SYM AuThreadId_t GetThreadId();
|
||||
}
|
||||
|
||||
namespace Aurora::Time
|
||||
{
|
||||
AUKN_SYM AuUInt64 CurrentClockMS();
|
||||
}
|
||||
|
||||
namespace Aurora::Console
|
||||
{
|
||||
class AUKN_SYM ConsoleMessage
|
||||
{
|
||||
public:
|
||||
EAnsiColor color;
|
||||
AuString prefix;
|
||||
AuString line;
|
||||
AuUInt64 time;
|
||||
AuThreadId_t tid;
|
||||
|
||||
ConsoleMessage()
|
||||
{
|
||||
color = EAnsiColor::eReset;
|
||||
}
|
||||
|
||||
ConsoleMessage(const AuString &prefix, const AuString &line) : prefix(prefix), line(line), color(EAnsiColor::eReset)
|
||||
{
|
||||
time = Time::CurrentClockMS();
|
||||
tid = Threading::Threads::GetThreadId();
|
||||
}
|
||||
|
||||
ConsoleMessage(const EAnsiColor color, const AuString &prefix, const AuString &line) : prefix(prefix), line(line), color(color)
|
||||
{
|
||||
time = Time::CurrentClockMS();
|
||||
tid = Threading::Threads::GetThreadId();
|
||||
}
|
||||
|
||||
AuString StringifyTime(bool simple = false) const;
|
||||
AuString GetWrappedTag() const;
|
||||
AuString ToConsole() const;
|
||||
AuString ToSimplified() const;
|
||||
};
|
||||
}
|
29
Include/Aurora/Console/EAnsiColor.hpp
Normal file
29
Include/Aurora/Console/EAnsiColor.hpp
Normal file
@ -0,0 +1,29 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: EAnsiColor.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Console
|
||||
{
|
||||
enum class EAnsiColor
|
||||
{
|
||||
eRed,
|
||||
eBoldRed,
|
||||
eGreen,
|
||||
eBoldGreen,
|
||||
eYellow,
|
||||
eBoldYellow,
|
||||
eBlue,
|
||||
eBoldBlue,
|
||||
eMagenta,
|
||||
eBoldMagenta,
|
||||
eCyan,
|
||||
eBoldCyan,
|
||||
eReset,
|
||||
eCount
|
||||
};
|
||||
}
|
15
Include/Aurora/Console/Hooks/Hooks.hpp
Normal file
15
Include/Aurora/Console/Hooks/Hooks.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Hooks.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Console::Hooks
|
||||
{
|
||||
using LineHook_cb = std::function<void(const ConsoleMessage &string)>;
|
||||
|
||||
AUKN_SYM void AddHook(LineHook_cb hook);
|
||||
}
|
47
Include/Aurora/Console/Logging/Logging.hpp
Normal file
47
Include/Aurora/Console/Logging/Logging.hpp
Normal file
@ -0,0 +1,47 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Logging.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Console::Logging
|
||||
{
|
||||
template<typename ... T>
|
||||
static inline void WriteLinef(const AuString &tag, const AuString &msg, T... args)
|
||||
{
|
||||
Aurora::Console::WriteLine(ConsoleMessage(EAnsiColor::eReset, tag, fmt::format(msg, args...)));
|
||||
}
|
||||
|
||||
template<typename ... T>
|
||||
static inline void WriteLinef(EAnsiColor color, const AuString &tag, const AuString &msg, T... args)
|
||||
{
|
||||
Aurora::Console::WriteLine(ConsoleMessage(color, tag, fmt::format(msg, args...)));
|
||||
}
|
||||
|
||||
template<typename ... T>
|
||||
static inline void LogInfo(const AuString &line, T... args)
|
||||
{
|
||||
Aurora::Console::Logging::WriteLinef(EAnsiColor::eGreen, "Info", line, args...);
|
||||
}
|
||||
|
||||
template<typename ... T>
|
||||
static inline void LogDbg(const AuString &line, T... args)
|
||||
{
|
||||
Aurora::Console::Logging::WriteLinef(EAnsiColor::eYellow, "Debug", line, args...);
|
||||
}
|
||||
|
||||
template<typename ... T>
|
||||
static inline void LogWarn(const AuString &line, T... args)
|
||||
{
|
||||
Aurora::Console::Logging::WriteLinef(EAnsiColor::eRed, "Warn", line, args...);
|
||||
}
|
||||
|
||||
template<typename ... T>
|
||||
static inline void LogGame(const AuString &line, T... args)
|
||||
{
|
||||
Aurora::Console::Logging::WriteLinef(EAnsiColor::eBlue, "Game", line, args...);
|
||||
}
|
||||
}
|
35
Include/Aurora/Crypto/AES/AES.hpp
Normal file
35
Include/Aurora/Crypto/AES/AES.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: AES.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::AES
|
||||
{
|
||||
AUKN_SYM AuUInt GetSafeCipherPadding(const void* plainText,
|
||||
AuUInt plainTextLength);
|
||||
|
||||
// Remember: AES works in chunks of 128 bits
|
||||
// IVS are 16 bytes long
|
||||
// Chunks are 16 bytes long
|
||||
// Keys are 16, 24, or 32 bytes long
|
||||
// Initialization vectors must never be constant
|
||||
// Initialization vectors should be determined by a handshaake
|
||||
// It is not the end of the world if an IV is made public by design
|
||||
// Keys must be random
|
||||
// Initialization vectors could be derived from SHA1, Tiger, or SHA2 digests
|
||||
AUKN_SYM bool Encrypt(const void* plainText, AuUInt plainTextLength,
|
||||
const void* iv, void* outIv, AuUInt ivLength,
|
||||
const void* key, AuUInt keyLength,
|
||||
AuList<AuUInt8>& out,
|
||||
bool safe);
|
||||
|
||||
AUKN_SYM bool Decrypt(const void* cipherText, AuUInt cipherTextLength,
|
||||
const void* iv, void* outIv, AuUInt ivLength,
|
||||
const void* key, AuUInt keyLength,
|
||||
AuList<AuUInt8>& plainText,
|
||||
bool safe);
|
||||
}
|
28
Include/Aurora/Crypto/CA/CA.hpp
Normal file
28
Include/Aurora/Crypto/CA/CA.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: CA.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::CA
|
||||
{
|
||||
class ICertificateStore
|
||||
{
|
||||
public:
|
||||
virtual void AddSignature(const PublicRSAKey& CA, const AuList<AuUInt8>& sig,
|
||||
EHashType method, EPaddingType type) = 0;
|
||||
virtual void AddPublicCert(const X509::Certificate& cert) = 0;
|
||||
|
||||
/// For future support of http gets of the CA list
|
||||
virtual bool& AllowHTTPTree() = 0;
|
||||
|
||||
virtual bool CheckKey(const PublicKey& pub) = 0;
|
||||
virtual bool CheckCert(const X509::Certificate& cert) = 0;
|
||||
};
|
||||
|
||||
|
||||
AUKN_SHARED_API(NewCA, ICertificateStore);
|
||||
}
|
40
Include/Aurora/Crypto/Crypto.hpp
Normal file
40
Include/Aurora/Crypto/Crypto.hpp
Normal file
@ -0,0 +1,40 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Crypto.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto
|
||||
{
|
||||
using DerBuffer = AuList<AuUInt8>;
|
||||
using PrivateRSAKey = DerBuffer; // a/k/a "RSA", OpenSSL, private key in mbedtls, PKCS1
|
||||
using PublicRSAKey = DerBuffer;
|
||||
using PrivateECCKey = DerBuffer;
|
||||
using PublicECCKey = DerBuffer;
|
||||
using PrivateKey = DerBuffer; // PKCS8
|
||||
using PublicKey = DerBuffer;
|
||||
|
||||
namespace X509
|
||||
{
|
||||
using Certificate = AuList<AuUInt8>;
|
||||
}
|
||||
|
||||
struct RSAPair
|
||||
{
|
||||
X509::Certificate pub;
|
||||
PrivateRSAKey priv;
|
||||
};
|
||||
}
|
||||
|
||||
#include "EHashType.hpp"
|
||||
#include "EPaddingType.hpp"
|
||||
#include "AES/AES.hpp"
|
||||
#include "X509/X509.hpp"
|
||||
#include "CA/CA.hpp"
|
||||
#include "ECC25519/ECC25519.hpp"
|
||||
#include "ECCNIST/ECCNIST.hpp"
|
||||
#include "PEM/PEM.hpp"
|
||||
#include "RSA/RSA.hpp"
|
13
Include/Aurora/Crypto/ECC25519/ECC25519.hpp
Normal file
13
Include/Aurora/Crypto/ECC25519/ECC25519.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ECC25519.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::ECC25519
|
||||
{
|
||||
|
||||
}
|
13
Include/Aurora/Crypto/ECCNIST/ECCNIST.hpp
Normal file
13
Include/Aurora/Crypto/ECCNIST/ECCNIST.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ECCNIST.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::ECCNIST
|
||||
{
|
||||
|
||||
}
|
19
Include/Aurora/Crypto/EHashType.hpp
Normal file
19
Include/Aurora/Crypto/EHashType.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: EHashType.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto
|
||||
{
|
||||
enum class EHashType
|
||||
{
|
||||
eSHA1_20_160,
|
||||
eTiger_24_192,
|
||||
eSHA2_32_256,
|
||||
eSHA2_64_512
|
||||
};
|
||||
}
|
24
Include/Aurora/Crypto/EPaddingType.hpp
Normal file
24
Include/Aurora/Crypto/EPaddingType.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: EPaddingType.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto
|
||||
{
|
||||
enum class EPaddingType
|
||||
{
|
||||
ePaddingNone,
|
||||
// For use with encryption
|
||||
ePKCS_OAEP,
|
||||
// For use with signing and encryption
|
||||
ePKCS_1_5,
|
||||
// For use with signing
|
||||
ePKCS_1_PSS,
|
||||
// For use with signing
|
||||
ePKCS_1_5_NA1
|
||||
};
|
||||
}
|
23
Include/Aurora/Crypto/PEM/PEM.hpp
Normal file
23
Include/Aurora/Crypto/PEM/PEM.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: PEM.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::PEM
|
||||
{
|
||||
AUKN_SYM AuString ToString(const Aurora::Crypto::X509::Certificate &in);
|
||||
AUKN_SYM AuString PublicToString(const PublicKey &in);
|
||||
AUKN_SYM AuString PrivateToString(const PrivateKey &in);
|
||||
AUKN_SYM AuString PublicRSAToString(const PrivateRSAKey &in);
|
||||
AUKN_SYM AuString PrivateRSAToString(const PublicRSAKey &in);
|
||||
|
||||
AUKN_SYM bool FromString(const AuString &in, Aurora::Crypto::X509::Certificate &out);
|
||||
AUKN_SYM bool PublicFromString(const AuString &in, PublicKey &out);
|
||||
AUKN_SYM bool PrivateFromString(const AuString &in, PrivateKey &out);
|
||||
AUKN_SYM bool PublicRSAFromString(const AuString &in, PrivateRSAKey &out);
|
||||
AUKN_SYM bool PrivateRSAFromString(const AuString &in, PublicRSAKey &out);
|
||||
}
|
13
Include/Aurora/Crypto/RSA/RSA.hpp
Normal file
13
Include/Aurora/Crypto/RSA/RSA.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: RSA.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::RSA
|
||||
{
|
||||
|
||||
}
|
20
Include/Aurora/Crypto/X509/ESignatureAlgorithm.hpp
Normal file
20
Include/Aurora/Crypto/X509/ESignatureAlgorithm.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ESignatureAlgorithm.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Crypto::X509
|
||||
{
|
||||
enum class ESignatureAlgorithm
|
||||
{
|
||||
eInvalidAlgorithm,
|
||||
eMD5WithRSA,
|
||||
eSHA1WithRSA,
|
||||
eSHA256WithRSA,
|
||||
eECDSAWithRSA
|
||||
};
|
||||
}
|
62
Include/Aurora/Crypto/X509/X509.hpp
Normal file
62
Include/Aurora/Crypto/X509/X509.hpp
Normal file
@ -0,0 +1,62 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: X509.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "ESignatureAlgorithm.hpp"
|
||||
|
||||
namespace Aurora::Crypto::X509
|
||||
{
|
||||
// yes, these structure completely disregards the principles of the x509 structure and the rationales behind certain extensions
|
||||
// however, this is not intended to be a grandiose TLS stack
|
||||
//
|
||||
// PKSC#1 and #8, and x509 extensions (ie: rfc5280 key-ids, v3 exts) are not supported in our deps
|
||||
// we had to reimplement them ourselves >:(
|
||||
// lets worry about the more important issues
|
||||
|
||||
struct CertName
|
||||
{
|
||||
AuString commonName; // Tbs
|
||||
|
||||
AuString department; // Tbs
|
||||
AuString organization; // Tbs
|
||||
AuString state; // Tbs
|
||||
AuString countryCode; // Tbs
|
||||
|
||||
AuString name; // Tbs
|
||||
AuString email; // Tbs
|
||||
AuString title; // Tbs
|
||||
};
|
||||
|
||||
struct DecodedCertificate
|
||||
{
|
||||
// TODO:
|
||||
//SignatureAlgorithm signature;
|
||||
struct Issuer : CertName
|
||||
{
|
||||
AuList<AuUInt8> id;
|
||||
} issuer;
|
||||
struct Subject : CertName
|
||||
{
|
||||
AuList<AuUInt8> id;
|
||||
} subject;
|
||||
struct Vaildity // Tbs
|
||||
{ // Tbs
|
||||
AuUInt issued; // Tbs
|
||||
AuUInt expire; // Tbs
|
||||
} validity; // Tbs
|
||||
AuList<AuUInt8> serialNumber; // Tbs
|
||||
AuList<AuUInt8> algorithmOid; // Tbs
|
||||
// TODO: usage // extension
|
||||
AuList<AuString> AIAs;
|
||||
// TODO: AuString CRL;
|
||||
// TODO: AuList<String> subjectNames;
|
||||
};
|
||||
|
||||
AUKN_SYM bool Decode(const Certificate &der, DecodedCertificate &out);
|
||||
AUKN_SYM bool Validate(const Certificate &der, const Certificate &parentDer);
|
||||
}
|
137
Include/Aurora/Data/Data.hpp
Normal file
137
Include/Aurora/Data/Data.hpp
Normal file
@ -0,0 +1,137 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Data.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Data
|
||||
{
|
||||
enum class DataType
|
||||
{
|
||||
kTypeUInt, // Human friendly types
|
||||
kTypeSInt,
|
||||
kTypeNumber,
|
||||
kTypeString,
|
||||
kTypeBoolean,
|
||||
kTypeUUID,
|
||||
kTypeVec3,
|
||||
kTypeVec4,
|
||||
|
||||
kTypeGenericMax, // Binary serialization
|
||||
|
||||
kTypeStructFloat,
|
||||
kTypeStructUInt8,
|
||||
kTypeStructInt8,
|
||||
kTypeStructUInt16,
|
||||
kTypeStructInt16,
|
||||
kTypeStructUInt32,
|
||||
kTypeStructInt32,
|
||||
|
||||
kTypeSpecialComponent, // Special QST
|
||||
kTypeSpecialArray, //
|
||||
kTypeSpecialObject, //
|
||||
|
||||
kTypeEND,
|
||||
|
||||
kTypeStructDouble = kTypeNumber, // overlap bin serial with human friendly aliases
|
||||
kTypeStructUInt64 = kTypeUInt, //
|
||||
kTypeStructInt64 = kTypeSInt, //
|
||||
};
|
||||
|
||||
union PrimitiveValue
|
||||
{
|
||||
AuUInt64 uint;
|
||||
AuInt64 sint;
|
||||
double number;
|
||||
bool boolean;
|
||||
glm::vec3 vec3;
|
||||
glm::vec4 vec4;
|
||||
};
|
||||
|
||||
struct Value
|
||||
{
|
||||
#define CONSTRUCTOR(type, member)\
|
||||
Value(type val)\
|
||||
{\
|
||||
primitive.member = val;\
|
||||
}
|
||||
CONSTRUCTOR(const glm::vec3 &, vec3);
|
||||
CONSTRUCTOR(const glm::vec4 &, vec4);
|
||||
CONSTRUCTOR(bool, boolean);
|
||||
CONSTRUCTOR(double, number);
|
||||
CONSTRUCTOR(AuInt64, sint);
|
||||
CONSTRUCTOR(AuUInt64, uint);
|
||||
#undef CONSTRUCTOR
|
||||
|
||||
Value(uuids::uuid val)
|
||||
{
|
||||
UUID = val;
|
||||
}
|
||||
|
||||
Value(const AuString &val)
|
||||
{
|
||||
string = val;
|
||||
}
|
||||
|
||||
Value()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PrimitiveValue primitive;
|
||||
uuids::uuid UUID;
|
||||
AuString string;
|
||||
};
|
||||
|
||||
struct TypedValue
|
||||
{
|
||||
DataType type;
|
||||
Value value;
|
||||
};
|
||||
|
||||
template<DataType type>
|
||||
static constexpr AuUInt GetDatatypeLength()
|
||||
{
|
||||
switch /*constexpr*/ (type)
|
||||
{
|
||||
case DataType::kTypeBoolean: return 1;
|
||||
case DataType::kTypeStructFloat: return 4;
|
||||
case DataType::kTypeStructDouble: return 8;
|
||||
case DataType::kTypeVec3: return 3 * 4;
|
||||
case DataType::kTypeVec4: return 4 * 4;
|
||||
case DataType::kTypeStructUInt8: return 1;
|
||||
case DataType::kTypeStructInt8: return 1;
|
||||
case DataType::kTypeStructUInt16: return 2;
|
||||
case DataType::kTypeStructInt16: return 2;
|
||||
case DataType::kTypeStructUInt32: return 4;
|
||||
case DataType::kTypeStructInt32: return 4;
|
||||
case DataType::kTypeStructUInt64: return 8;
|
||||
case DataType::kTypeStructInt64: return 8;
|
||||
default: static_assert(false, "invalid datatype");
|
||||
}
|
||||
}
|
||||
|
||||
static AuUInt GetDatatypeLength(Data::DataType type)
|
||||
{
|
||||
switch /*constexpr*/ (type)
|
||||
{
|
||||
case DataType::kTypeBoolean: return 1;
|
||||
case DataType::kTypeStructFloat: return 4;
|
||||
case DataType::kTypeStructDouble: return 8;
|
||||
case DataType::kTypeVec3: return 3 * 4;
|
||||
case DataType::kTypeVec4: return 4 * 4;
|
||||
case DataType::kTypeStructUInt8: return 1;
|
||||
case DataType::kTypeStructInt8: return 1;
|
||||
case DataType::kTypeStructUInt16: return 2;
|
||||
case DataType::kTypeStructInt16: return 2;
|
||||
case DataType::kTypeStructUInt32: return 4;
|
||||
case DataType::kTypeStructInt32: return 4;
|
||||
case DataType::kTypeStructUInt64: return 8;
|
||||
case DataType::kTypeStructInt64: return 8;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
}
|
58
Include/Aurora/Debug/Debug.hpp
Normal file
58
Include/Aurora/Debug/Debug.hpp
Normal file
@ -0,0 +1,58 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Debug.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include <Aurora/Console/Console.hpp>
|
||||
|
||||
#include "StackTrace.hpp"
|
||||
#include "FailureCategory.hpp"
|
||||
|
||||
namespace Aurora::Debug
|
||||
{
|
||||
/**
|
||||
Retrieves a print-friendly callstack of the last trap (either innocent exception or fatal mem access) <br>
|
||||
On Win32, this information is always available <br>
|
||||
On other platforms, this function will likely yield no valuable information
|
||||
*/
|
||||
AUKN_SYM AuString GetLastErrorStack();
|
||||
|
||||
AUKN_SYM StackTrace GetLastStackTrace();
|
||||
|
||||
|
||||
/**
|
||||
Retrieve information about the last exception. <br>
|
||||
On Win32, this information is always available <br>
|
||||
On other platforms, this information is only available within C++14 catch blocks
|
||||
*/
|
||||
AUKN_SYM AuString GetLastException();
|
||||
|
||||
/**
|
||||
Retrieve the last system error (IE: Win32, GetLastError())
|
||||
*/
|
||||
AUKN_SYM AuString GetLastSystemMessage();
|
||||
|
||||
/**
|
||||
Prints the current error state of the thread including: <br>
|
||||
Current System Error, <br>
|
||||
Current Runtime Error, <br>
|
||||
Last Exception Call Stack, <br>
|
||||
Last major ring notification
|
||||
|
||||
*/
|
||||
AUKN_SYM void PrintError();
|
||||
|
||||
/**
|
||||
Immediately terminates the process.
|
||||
May attempt some hardened telemetry debug ops
|
||||
*/
|
||||
AUKN_SYM AU_NORETURN void Panic();
|
||||
}
|
||||
|
||||
#include "SysPanic.hpp"
|
||||
#include "SysAssertions.hpp"
|
||||
#include "SysErrors.hpp"
|
39
Include/Aurora/Debug/FailureCategory.hpp
Normal file
39
Include/Aurora/Debug/FailureCategory.hpp
Normal file
@ -0,0 +1,39 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: FailureCategory.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Debug
|
||||
{
|
||||
enum FailureCategory
|
||||
{
|
||||
kFailureGeneric,
|
||||
kFailureNested,
|
||||
kFailureMemory,
|
||||
kFailureIO,
|
||||
kFailureFIO,
|
||||
kFailureNet,
|
||||
kFailureAudio,
|
||||
kFailureHAL,
|
||||
kFailureHALContext,
|
||||
kFailureCrypto,
|
||||
kFailureParam,
|
||||
kFailureLogicError,
|
||||
kFailureMathError,
|
||||
kFailureUnavailableError,
|
||||
kFailureTimeoutError,
|
||||
kFailureWatchdogError,
|
||||
kFailureServiceError,
|
||||
kFailurePermissionError,
|
||||
kFailureOutOfRange,
|
||||
kFailureSyntaxError,
|
||||
kFailureDisconnected,
|
||||
kFailureUninitialized,
|
||||
|
||||
kFailureUserBegin = 256
|
||||
};
|
||||
}
|
24
Include/Aurora/Debug/StackTrace.hpp
Normal file
24
Include/Aurora/Debug/StackTrace.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: StackTrace.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Debug
|
||||
{
|
||||
struct StackTraceEntry
|
||||
{
|
||||
std::optional<AuString> label;
|
||||
AuUInt64 address;
|
||||
std::optional<AuString> module;
|
||||
std::optional<std::tuple<AuString, int, int>> file; // file, line, offset
|
||||
|
||||
AUKN_SYM AuString Stringify() const;
|
||||
};
|
||||
|
||||
using StackTrace = AuList<StackTraceEntry>;
|
||||
AUKN_SYM AuString StringifyStackTrace(const StackTrace &backtrace);
|
||||
}
|
193
Include/Aurora/Debug/SysAssertions.hpp
Normal file
193
Include/Aurora/Debug/SysAssertions.hpp
Normal file
@ -0,0 +1,193 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: SysAssertions.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
|
||||
//#pragma once <- AURORA_NO_ASSERTIONS may be redefined. do not cache
|
||||
|
||||
#if !defined(AURORA_NO_ASSERTIONS)
|
||||
|
||||
// defines SysAssert and SysAssertDbg
|
||||
#if defined(DEBUG)
|
||||
/// @private
|
||||
template<typename ... T>
|
||||
static inline void SysAssertFileEx(const char *file, int fileno, const char *func, bool tru, T... args)
|
||||
{
|
||||
if (tru)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Aurora::Console::Logging::WriteLinef(
|
||||
Aurora::Console::EAnsiColor::eBoldRed,
|
||||
"Fatal",
|
||||
"Expression address: {} {}:{}", func, file, fileno);
|
||||
|
||||
if constexpr (sizeof...(T) == 0)
|
||||
{
|
||||
SysPanic("That's all folks");
|
||||
}
|
||||
else
|
||||
{
|
||||
SysPanic(args...);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
A simple assertion with an optional message
|
||||
*/
|
||||
#define SysAssert(tru, ...) \
|
||||
do \
|
||||
{ \
|
||||
SysAssertFileEx(__FILE__, __LINE__, __FUNCTION__, tru, ## __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
A simple assertion with an optional message under debug targets
|
||||
*/
|
||||
#define SysAssertDbg SysAssert
|
||||
|
||||
|
||||
|
||||
#else
|
||||
|
||||
/// @private
|
||||
template<typename ... T>
|
||||
static inline void SysAssertEx(bool tru, T... args)
|
||||
{
|
||||
if (tru)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if constexpr (sizeof...(T) == 0)
|
||||
{
|
||||
SysPanic("That's all folks");
|
||||
}
|
||||
else
|
||||
{
|
||||
SysPanic(args...);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
A simple assertion with an optional message
|
||||
*/
|
||||
#define SysAssert(tru, ...) \
|
||||
do \
|
||||
{ \
|
||||
SysAssertEx(tru, ## __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
A simple assertion with an optional message under debug targets
|
||||
*/
|
||||
#define SysAssertDbg(tru, ...) do {} while (0)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
// defines SysAssertExp and SysAssertDbgExp
|
||||
#if defined(DEBUG)
|
||||
/// @private
|
||||
template<typename ... T>
|
||||
static inline void SysAssertFileExpEx(const char *file, int fileno, const char *func, const char *exp, bool tru, T... args)
|
||||
{
|
||||
if (tru)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Aurora::Console::Logging::WriteLinef(
|
||||
Aurora::Console::EAnsiColor::eBoldRed,
|
||||
"Fatal",
|
||||
"Expression address: {} {}:{}", func, file, fileno);
|
||||
|
||||
Aurora::Console::Logging::WriteLinef(
|
||||
Aurora::Console::EAnsiColor::eBoldRed,
|
||||
"Fatal",
|
||||
"Expression failed: {}", exp);
|
||||
|
||||
if constexpr (sizeof...(T) == 0)
|
||||
{
|
||||
SysPanic("That's all folks");
|
||||
}
|
||||
else
|
||||
{
|
||||
SysPanic(args...);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
A simple assertion with a debug expresison and optional message debugging
|
||||
*/
|
||||
#define SysAssertExp(tru, ...) \
|
||||
do \
|
||||
{ \
|
||||
SysAssertFileExpEx(__FILE__, __LINE__, __FUNCTION__, _AUKCON_STRINGIFY_X(tru), tru, ## __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/**
|
||||
A simple assertion with a debug expresison and optional message debugging under debug targets only
|
||||
*/
|
||||
#define SysAssertDbgExp SysAssertExp
|
||||
|
||||
|
||||
|
||||
#else
|
||||
/// @private
|
||||
template<typename ... T>
|
||||
static inline void SysAssertExpEx(const char *exp, bool tru, T... args)
|
||||
{
|
||||
if (tru)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Aurora::Console::Logging::WriteLinef(
|
||||
Aurora::Console::EAnsiColor::eBoldRed,
|
||||
"Fatal",
|
||||
"Expression failed: {}", exp);
|
||||
|
||||
if constexpr (sizeof...(T) == 0)
|
||||
{
|
||||
SysPanic("That's all folks");
|
||||
}
|
||||
else
|
||||
{
|
||||
SysPanic(args...);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
A simple assertion with a debug expresison and optional message debugging
|
||||
*/
|
||||
#define SysAssertExp(tru, ...) \
|
||||
do \
|
||||
{ \
|
||||
SysAssertExpEx(_AUKCON_STRINGIFY_X(tru), tru, ## __VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
A simple assertion with a debug expresison and optional message debugging under debug targets only
|
||||
*/
|
||||
#define SysAssertDbgExp(tru, ...) do {} while (0)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
161
Include/Aurora/Debug/SysErrors.hpp
Normal file
161
Include/Aurora/Debug/SysErrors.hpp
Normal file
@ -0,0 +1,161 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: SysErrors.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Debug
|
||||
{
|
||||
AUKN_SYM void _PushError(AuUInt address, FailureCategory category, const char *msg);
|
||||
|
||||
#if defined(AURORA_COMPILER_MSVC)
|
||||
#define _DBG_RET_ADDR (AuUInt)_ReturnAddress()
|
||||
#elif defined(AURORA_COMPILER_CLANG)
|
||||
#define _DBG_RET_ADDR (AuUInt)__builtin_return_address(0)
|
||||
#else
|
||||
#define _DBG_RET_ADDR AuUInt(0)
|
||||
#endif
|
||||
|
||||
#if defined(AURORA_COMPILER_MSVC)
|
||||
#pragma optimize("", off)
|
||||
#define _FREECOMPILER_OPTIMIZE_OFF
|
||||
#else
|
||||
#define _FREECOMPILER_OPTIMIZE_OFF [[gnu::optimize(0)]]
|
||||
#endif
|
||||
|
||||
static AU_NOINLINE void ErrorMakeNested() _FREECOMPILER_OPTIMIZE_OFF
|
||||
{
|
||||
_PushError(_DBG_RET_ADDR, FailureCategory::kFailureNested, nullptr);
|
||||
}
|
||||
|
||||
template<typename ... T>
|
||||
static AU_NOINLINE void SysPushError(FailureCategory category, const AuString &msg, T... args) _FREECOMPILER_OPTIMIZE_OFF
|
||||
{
|
||||
if constexpr (sizeof...(T) == 0)
|
||||
{
|
||||
_PushError(_DBG_RET_ADDR, category, msg.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
_PushError(_DBG_RET_ADDR, category, fmt::format(msg, args...).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
static AU_NOINLINE void SysPushError(FailureCategory category) _FREECOMPILER_OPTIMIZE_OFF
|
||||
{
|
||||
_PushError(_DBG_RET_ADDR, category, nullptr);
|
||||
}
|
||||
|
||||
#if defined(AURORA_COMPILER_MSVC)
|
||||
#pragma optimize("", on)
|
||||
#endif
|
||||
}
|
||||
|
||||
#define SysCheckReturn(x, ...) if (!(x)) { Aurora::Debug::ErrorMakeNested(); return ##__VA_ARGS__; }
|
||||
|
||||
#define SysPushErrorError(error, ...) Aurora::Debug::SysPushError(Aurora::Debug::error, ## __VA_ARGS__)
|
||||
|
||||
// legacy
|
||||
#define SysPushErrorArg(...) SysPushErrorError(kFailureParam, ## __VA_ARGS__)
|
||||
#define SysPushErrorGen(...) SysPushErrorError(kFailureGeneric, ## __VA_ARGS__)
|
||||
#define SysPushErrorCrypt(...) SysPushErrorError(kFailureCrypto, ## __VA_ARGS__)
|
||||
#define SysPushErrorNet(...) SysPushErrorError(kFailureNet, ## __VA_ARGS__)
|
||||
#define SysPushErrorMem(...) SysPushErrorError(kFailureMemory, ## __VA_ARGS__)
|
||||
|
||||
// edge case
|
||||
#define SysPushErrorNested() Aurora::Debug::ErrorMakeNested();
|
||||
|
||||
// enums
|
||||
#define SysPushErrorGeneric(...) SysPushErrorError(kFailureGeneric, ## __VA_ARGS__)
|
||||
#define SysPushErrorMemory(...) SysPushErrorError(kFailureMemory, ## __VA_ARGS__)
|
||||
#define SysPushErrorIO(...) SysPushErrorError(kFailureIO, ## __VA_ARGS__)
|
||||
#define SysPushErrorFIO(...) SysPushErrorError(kFailureFIO, ## __VA_ARGS__)
|
||||
#define SysPushErrorNet(...) SysPushErrorError(kFailureNet, ## __VA_ARGS__)
|
||||
#define SysPushErrorAudio(...) SysPushErrorError(kFailureAudio, ## __VA_ARGS__)
|
||||
#define SysPushErrorHAL(...) SysPushErrorError(kFailureHAL, ## __VA_ARGS__)
|
||||
#define SysPushErrorHALContext(...) SysPushErrorError(kFailureHALContext, ## __VA_ARGS__)
|
||||
#define SysPushErrorCrypto(...) SysPushErrorError(kFailureCrypto, ## __VA_ARGS__)
|
||||
#define SysPushErrorParam(...) SysPushErrorError(kFailureParam, ## __VA_ARGS__)
|
||||
#define SysPushErrorLogicError(...) SysPushErrorError(kFailureLogicError, ## __VA_ARGS__)
|
||||
#define SysPushErrorMathError(...) SysPushErrorError(kFailureMathError, ## __VA_ARGS__)
|
||||
#define SysPushErrorUnavailableError(...) SysPushErrorError(kFailureUnavailableError, ## __VA_ARGS__)
|
||||
#define SysPushErrorTimeoutError(...) SysPushErrorError(kFailureTimeoutError, ## __VA_ARGS__)
|
||||
#define SysPushErrorWatchdogError(...) SysPushErrorError(kFailureWatchdogError, ## __VA_ARGS__)
|
||||
#define SysPushErrorServiceError(...) SysPushErrorError(kFailureServiceError, ## __VA_ARGS__)
|
||||
#define SysPushErrorPermissionError(...) SysPushErrorError(kFailurePermissionError, ## __VA_ARGS__)
|
||||
#define SysPushErrorOutOfRange(...) SysPushErrorError(kFailureOutOfRange, ## __VA_ARGS__)
|
||||
#define SysPushErrorSyntaxError(...) SysPushErrorError(kFailureSyntaxError, ## __VA_ARGS__)
|
||||
#define SysPushErrorDisconnected(...) SysPushErrorError(kFailureDisconnected, ## __VA_ARGS__)
|
||||
#define SysPushErrorUninitialized(...) SysPushErrorError(kFailureUninitialized, ## __VA_ARGS__)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if defined(DEBUG) || defined(INTERNAL)
|
||||
|
||||
#define SysPushErrorArgDbg SysPushErrorArg
|
||||
#define SysPushErrorGenDbg SysPushErrorGen
|
||||
#define SysPushErrorCryptDbg SysPushErrorCrypt
|
||||
#define SysPushErrorNetDbg SysPushErrorNet
|
||||
#define SysPushErrorMemDbg SysPushErrorMem
|
||||
|
||||
#define SysPushErrorGenericDbg SysPushErrorGeneric
|
||||
#define SysPushErrorNestedDbg SysPushErrorNested
|
||||
#define SysPushErrorMemoryDbg SysPushErrorMemory
|
||||
#define SysPushErrorIODbg SysPushErrorIO
|
||||
#define SysPushErrorFIODbg SysPushErrorFIO
|
||||
#define SysPushErrorNetDbg SysPushErrorNet
|
||||
#define SysPushErrorAudioDbg SysPushErrorAudio
|
||||
#define SysPushErrorHALDbg SysPushErrorHAL
|
||||
#define SysPushErrorHALContextDbg SysPushErrorHALContext
|
||||
#define SysPushErrorCryptoDbg SysPushErrorCrypto
|
||||
#define SysPushErrorParamDbg SysPushErrorParam
|
||||
#define SysPushErrorLogicErrorDbg SysPushErrorLogicError
|
||||
#define SysPushErrorMathErrorDbg SysPushErrorMathError
|
||||
#define SysPushErrorUnavailableErrorDbg SysPushErrorUnavailableError
|
||||
#define SysPushErrorTimeoutErrorDbg SysPushErrorTimeoutError
|
||||
#define SysPushErrorWatchdogErrorDbg SysPushErrorWatchdogError
|
||||
#define SysPushErrorServiceErrorDbg SysPushErrorServiceError
|
||||
#define SysPushErrorPermissionErrorDbg SysPushErrorPermissionError
|
||||
#define SysPushErrorOutOfRangeDbg SysPushErrorOutOfRange
|
||||
#define SysPushErrorSyntaxErrorDbg SysPushErrorSyntaxError
|
||||
#define SysPushErrorDisconnectedDbg SysPushErrorDisconnected
|
||||
#define SysPushErrorUninitializedDbg SysPushErrorUninitialized
|
||||
|
||||
#else
|
||||
|
||||
#define SysPushErrorArgDbg(...)
|
||||
#define SysPushErrorGenDbg(...)
|
||||
#define SysPushErrorCryptDbg(...)
|
||||
#define SysPushErrorNetDbg(...)
|
||||
#define SysPushErrorMemDbg(...)
|
||||
|
||||
#define SysPushErrorGenericDbg(...)
|
||||
#define SysPushErrorNestedDbg(...)
|
||||
#define SysPushErrorMemoryDbg(...)
|
||||
#define SysPushErrorIODbg(...)
|
||||
#define SysPushErrorFIODbg(...)
|
||||
#define SysPushErrorNetDbg(...)
|
||||
#define SysPushErrorAudioDbg(...)
|
||||
#define SysPushErrorHALDbg(...)
|
||||
#define SysPushErrorHALContextDbg(...)
|
||||
#define SysPushErrorCryptoDbg(...)
|
||||
#define SysPushErrorParamDbg(...)
|
||||
#define SysPushErrorLogicErrorDbg(...)
|
||||
#define SysPushErrorMathErrorDbg(...)
|
||||
#define SysPushErrorUnavailableErrorDbg(...)
|
||||
#define SysPushErrorTimeoutErrorDbg(...)
|
||||
#define SysPushErrorWatchdogErrorDbg(...)
|
||||
#define SysPushErrorServiceErrorDbg(...)
|
||||
#define SysPushErrorPermissionErrorDbg(...)
|
||||
#define SysPushErrorOutOfRangeDbg(...)
|
||||
#define SysPushErrorSyntaxErrorDbg(...)
|
||||
#define SysPushErrorDisconnectedDbg(...)
|
||||
#define SysPushErrorUninitializedDbg(...)
|
||||
|
||||
|
||||
#endif
|
15
Include/Aurora/Debug/SysPanic.hpp
Normal file
15
Include/Aurora/Debug/SysPanic.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: SysPanic.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
template<typename ... T>
|
||||
static inline void __declspec(noreturn) SysPanic(T... args)
|
||||
{
|
||||
Aurora::Console::Logging::WriteLinef(Aurora::Console::EAnsiColor::eBoldRed, "Fatal", args...);
|
||||
Aurora::Debug::Panic();
|
||||
}
|
26
Include/Aurora/HWInfo/CpuInfo.hpp
Normal file
26
Include/Aurora/HWInfo/CpuInfo.hpp
Normal file
@ -0,0 +1,26 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: CpuInfo.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::HWInfo
|
||||
{
|
||||
struct CpuInfo
|
||||
{
|
||||
Aurora::Build::EArchitecture cpuArch;
|
||||
|
||||
AuUInt8 socket;
|
||||
AuUInt8 cores;
|
||||
AuUInt8 threads;
|
||||
|
||||
AuUInt32 cpuId[4];
|
||||
char vendor[12];
|
||||
unsigned features;
|
||||
};
|
||||
|
||||
AUKN_SYM const CpuInfo &GetCPUInfo();
|
||||
}
|
11
Include/Aurora/HWInfo/HWInfo.hpp
Normal file
11
Include/Aurora/HWInfo/HWInfo.hpp
Normal file
@ -0,0 +1,11 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: HWInfo.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "CpuInfo.hpp"
|
||||
#include "RamInfo.hpp"
|
15
Include/Aurora/HWInfo/RamInfo.hpp
Normal file
15
Include/Aurora/HWInfo/RamInfo.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: RamInfo.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::HWInfo
|
||||
{
|
||||
AUKN_SYM AuUInt32 GetRamAvailableMb();
|
||||
AUKN_SYM AuUInt32 GetRamStartupAvailableMb();
|
||||
AUKN_SYM AuUInt32 GetRamTotalMb();
|
||||
}
|
10
Include/Aurora/Hashing/CE/CE.hpp
Normal file
10
Include/Aurora/Hashing/CE/CE.hpp
Normal file
@ -0,0 +1,10 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: CE.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "fnv1.hpp"
|
35
Include/Aurora/Hashing/CE/fnv1.hpp
Normal file
35
Include/Aurora/Hashing/CE/fnv1.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: fnv1.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Hashing
|
||||
{
|
||||
namespace CE
|
||||
{
|
||||
constexpr uint64_t val_64_const = 0xcbf29ce484222325;
|
||||
constexpr uint64_t prime_64_const = 0x100000001b3;
|
||||
|
||||
inline constexpr uint64_t fnv1a(const char *const str, const uint64_t value = val_64_const) noexcept
|
||||
{
|
||||
return (str[0] == '\0') ? value : fnv1a(&str[1], (value ^ uint64_t(str[0])) * prime_64_const);
|
||||
}
|
||||
|
||||
inline constexpr uint32_t fnv1a_trunc(const char *const str) noexcept
|
||||
{
|
||||
return static_cast<uint32_t>(fnv1a(str));
|
||||
}
|
||||
|
||||
constexpr uint64_t val_32_const = 0x811c9dc5;
|
||||
constexpr uint64_t prime_32_const = 0x01000193;
|
||||
|
||||
inline constexpr uint32_t fnv1a_32(const char *const str, const uint32_t value = val_32_const) noexcept
|
||||
{
|
||||
return (str[0] == '\0') ? value : fnv1a_32(&str[1], (value ^ uint32_t(str[0])) * prime_32_const);
|
||||
}
|
||||
}
|
||||
}
|
61
Include/Aurora/Hashing/CommonDigests.hpp
Normal file
61
Include/Aurora/Hashing/CommonDigests.hpp
Normal file
@ -0,0 +1,61 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: CommonDigests.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Hashing
|
||||
{
|
||||
AUKN_SYM void MD5(const void *buffer, AuMach length, std::array<AuUInt8, 16> &md5);
|
||||
static void MD5(const AuList<AuUInt8> &bytebuffer, std::array<AuUInt8, 16> &md5)
|
||||
{
|
||||
return MD5(bytebuffer.data(), bytebuffer.size(), md5);
|
||||
}
|
||||
static void MD5(const AuString &bytebuffer, std::array<AuUInt8, 16> &md5)
|
||||
{
|
||||
return MD5(bytebuffer.data(), bytebuffer.size(), md5);
|
||||
}
|
||||
|
||||
AUKN_SYM void SHA1(const void *buffer, AuMach length, std::array<AuUInt8, 20> &sha1);
|
||||
static void SHA1(const AuList<AuUInt8> &bytebuffer, std::array<AuUInt8, 20> &sha1)
|
||||
{
|
||||
return SHA1(bytebuffer.data(), bytebuffer.size(), sha1);
|
||||
}
|
||||
static void SHA1(const AuString &bytebuffer, std::array<AuUInt8, 20> &sha1)
|
||||
{
|
||||
return SHA1(bytebuffer.data(), bytebuffer.size(), sha1);
|
||||
}
|
||||
|
||||
AUKN_SYM void Tiger(const void *buffer, AuMach length, std::array<AuUInt8, 24> &tiger);
|
||||
static void Tiger(const AuList<AuUInt8> &bytebuffer, std::array<AuUInt8, 24> &tiger)
|
||||
{
|
||||
return Tiger(bytebuffer.data(), bytebuffer.size(), tiger);
|
||||
}
|
||||
static void Tiger(const AuString &bytebuffer, std::array<AuUInt8, 24> &tiger)
|
||||
{
|
||||
return Tiger(bytebuffer.data(), bytebuffer.size(), tiger);
|
||||
}
|
||||
|
||||
AUKN_SYM void SHA2(const void *buffer, AuMach length, std::array<AuUInt8, 32> &sha2);
|
||||
static void SHA2(const AuList<AuUInt8> &bytebuffer, std::array<AuUInt8, 32> &sha2)
|
||||
{
|
||||
return SHA2(bytebuffer.data(), bytebuffer.size(), sha2);
|
||||
}
|
||||
static void SHA2(const AuString &bytebuffer, std::array<AuUInt8, 32> &sha2)
|
||||
{
|
||||
return SHA2(bytebuffer.data(), bytebuffer.size(), sha2);
|
||||
}
|
||||
|
||||
AUKN_SYM void SHA2_64(const void *buffer, AuMach length, std::array<AuUInt8, 64> &sha2);
|
||||
static void SHA2_64(const AuList<AuUInt8> &bytebuffer, std::array<AuUInt8, 64> &sha2)
|
||||
{
|
||||
return SHA2_64(bytebuffer.data(), bytebuffer.size(), sha2);
|
||||
}
|
||||
static void SHA2_64(const AuString &bytebuffer, std::array<AuUInt8, 64> &sha2)
|
||||
{
|
||||
return SHA2_64(bytebuffer.data(), bytebuffer.size(), sha2);
|
||||
}
|
||||
}
|
20
Include/Aurora/Hashing/EHashType.hpp
Normal file
20
Include/Aurora/Hashing/EHashType.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: EHashType.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Hashing
|
||||
{
|
||||
enum class EHashType
|
||||
{
|
||||
eMD5,
|
||||
eSHA1,
|
||||
eSHA2_32,
|
||||
eSHA2_64,
|
||||
eTiger
|
||||
};
|
||||
}
|
20
Include/Aurora/Hashing/HashStream.hpp
Normal file
20
Include/Aurora/Hashing/HashStream.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: HashStream.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Hashing
|
||||
{
|
||||
class IHashStream
|
||||
{
|
||||
public:
|
||||
virtual void Ingest(const void *, AuUInt32) = 0;
|
||||
virtual AuUInt8 *GetBytes(AuUInt32 &length) = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(HashStream, IHashStream, EHashType type);
|
||||
}
|
14
Include/Aurora/Hashing/Hashing.hpp
Normal file
14
Include/Aurora/Hashing/Hashing.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Hashing.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "EHashType.hpp"
|
||||
#include "HashStream.hpp"
|
||||
#include "CommonDigests.hpp"
|
||||
|
||||
#include "CE/fnv1.hpp"
|
51
Include/Aurora/IO/Buffered/BlobArbitraryReader.hpp
Normal file
51
Include/Aurora/IO/Buffered/BlobArbitraryReader.hpp
Normal file
@ -0,0 +1,51 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: BlobArbitraryReader.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::Buffered
|
||||
{
|
||||
class BlobArbitraryReader : public IArbitraryStreamer
|
||||
{
|
||||
public:
|
||||
AU_NO_COPY_NO_MOVE(BlobArbitraryReader)
|
||||
|
||||
BlobArbitraryReader(const AuList<AuUInt8> &buffer) : buffer_(buffer) {}
|
||||
BlobArbitraryReader() {}
|
||||
~BlobArbitraryReader(){}
|
||||
|
||||
virtual EStreamError Open() override
|
||||
{
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual EStreamError ArbitraryRead(AuUInt32 offset, void *buffer, AuUInt32 &len) override
|
||||
{
|
||||
auto oldLen = std::exchange(len, 0);
|
||||
if (buffer_.empty()) return EStreamError::eErrorEndOfStream;
|
||||
|
||||
auto endOffset = offset + oldLen;
|
||||
auto realEndOffset = std::min(AuUInt32(buffer_.size()), endOffset);
|
||||
auto actualLength = realEndOffset - offset;
|
||||
|
||||
if (actualLength < 0) return EStreamError::eErrorEndOfStream;
|
||||
|
||||
len = actualLength;
|
||||
std::memcpy(buffer, buffer_.data() + offset, len);
|
||||
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
buffer_.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
AuList<AuUInt8> buffer_;
|
||||
};
|
||||
}
|
48
Include/Aurora/IO/Buffered/BlobReader.hpp
Normal file
48
Include/Aurora/IO/Buffered/BlobReader.hpp
Normal file
@ -0,0 +1,48 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: BlobReader.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::Buffered
|
||||
{
|
||||
class BlobReader : public IStreamReader
|
||||
{
|
||||
public:
|
||||
AU_NO_COPY_NO_MOVE(BlobReader)
|
||||
|
||||
BlobReader(const AuList<AuUInt8> &buffer) : buffer_(buffer) {}
|
||||
BlobReader() {}
|
||||
~BlobReader() {}
|
||||
|
||||
virtual EStreamError Open() override
|
||||
{
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual EStreamError Read(void *buffer, AuUInt32 &len) override
|
||||
{
|
||||
auto oldLen = std::exchange(len, 0);
|
||||
|
||||
if (buffer_.empty()) return EStreamError::eErrorEndOfStream;
|
||||
|
||||
auto realEndOffset = std::min(AuUInt32(buffer_.size()), oldLen);
|
||||
|
||||
len = realEndOffset;
|
||||
std::memcpy(buffer, buffer_.data(), len);
|
||||
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
buffer_.clear();
|
||||
}
|
||||
|
||||
private:
|
||||
AuList<AuUInt8> buffer_;
|
||||
};
|
||||
}
|
49
Include/Aurora/IO/Buffered/BlobWriter.hpp
Normal file
49
Include/Aurora/IO/Buffered/BlobWriter.hpp
Normal file
@ -0,0 +1,49 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: BlobWriter.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::Buffered
|
||||
{
|
||||
class BlobWriter : public IStreamWriter
|
||||
{
|
||||
public:
|
||||
AU_NO_COPY_NO_MOVE(BlobWriter)
|
||||
|
||||
BlobWriter() {}
|
||||
~BlobWriter() {}
|
||||
|
||||
virtual EStreamError Open() override
|
||||
{
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual EStreamError Write(const void *buffer, AuUInt32 len) override
|
||||
{
|
||||
auto idx = buffer_.size();
|
||||
buffer_.resize(idx + len);
|
||||
std::memcpy(buffer_.data() + idx, buffer, len);
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual void Flush() override
|
||||
{
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
}
|
||||
|
||||
const AuList<AuUInt8> &GetBuffer()
|
||||
{
|
||||
return this->buffer_;
|
||||
}
|
||||
|
||||
private:
|
||||
AuList<AuUInt8> buffer_;
|
||||
};
|
||||
}
|
14
Include/Aurora/IO/Buffered/Buffered.hpp
Normal file
14
Include/Aurora/IO/Buffered/Buffered.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Buffered.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
// Most internal transactions will be buffered.
|
||||
// For sake of being able to mix network, file, serial, and other code, its nice to use the same reader interface for buffered and streams where read/write until EOS is required
|
||||
#include "BlobArbitraryReader.hpp"
|
||||
#include "BlobReader.hpp"
|
||||
#include "BlobWriter.hpp"
|
20
Include/Aurora/IO/EStreamError.hpp
Normal file
20
Include/Aurora/IO/EStreamError.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: EStreamError.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO
|
||||
{
|
||||
enum class EStreamError
|
||||
{
|
||||
eErrorNone,
|
||||
eErrorEndOfStream,
|
||||
eErrorStreamNotOpen,
|
||||
eErrorStreamInterrupted,
|
||||
eErrorHandleClosed
|
||||
};
|
||||
}
|
47
Include/Aurora/IO/FS/FS.hpp
Normal file
47
Include/Aurora/IO/FS/FS.hpp
Normal file
@ -0,0 +1,47 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: FS.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
/**
|
||||
Lists files with respect to a given partial or full path of a directory
|
||||
@param files relative address of an entry
|
||||
*/
|
||||
AUKN_SYM bool FilesInDirectory(const AuString &string, AuList<AuString> &files);
|
||||
|
||||
/**
|
||||
Lists directories with respect to a given partial or full path of a directory
|
||||
@param files relative address of an entry
|
||||
*/
|
||||
AUKN_SYM bool DirsInDirectory(const AuString &string, AuList<AuString> &dirs);
|
||||
|
||||
AUKN_SYM bool WriteFile(const AuString &path, const void *data, size_t length);
|
||||
AUKN_SYM bool WriteString(const AuString &path, const AuString &str);
|
||||
|
||||
AUKN_SYM bool ReadFile(const AuString &path, AuList<uint8_t> &buffer);
|
||||
AUKN_SYM bool ReadString(const AuString &path, AuString &buffer);
|
||||
|
||||
AUKN_SYM bool FileExists(const AuString &path);
|
||||
AUKN_SYM bool DirExists(const AuString &path);
|
||||
|
||||
AUKN_SYM bool DirMk(const AuString &path);
|
||||
|
||||
AUKN_SYM bool Remove(const AuString &path);
|
||||
|
||||
AUKN_SYM bool Relink(const AuString &src, const AuString &dest);
|
||||
|
||||
AUKN_SYM bool Copy(const AuString &src, const AuString &dest);
|
||||
}
|
||||
|
||||
#include "FileStream.hpp"
|
||||
#include "FileArbitraryReader.hpp"
|
||||
#include "FileReader.hpp"
|
||||
#include "FileWriter.hpp"
|
||||
#include "Resources.hpp"
|
||||
#include "Stat.hpp"
|
50
Include/Aurora/IO/FS/FileArbitraryReader.hpp
Normal file
50
Include/Aurora/IO/FS/FileArbitraryReader.hpp
Normal file
@ -0,0 +1,50 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: FileArbitraryReader.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
class FileArbitraryReader : public IArbitraryStreamer
|
||||
{
|
||||
public:
|
||||
AU_NO_COPY_NO_MOVE(FileArbitraryReader)
|
||||
|
||||
FileArbitraryReader() {}
|
||||
~FileArbitraryReader() {}
|
||||
|
||||
template<typename... T>
|
||||
bool OpenFile(T... args)
|
||||
{
|
||||
stream_ = OpenReadUnique(args...);
|
||||
return stream_ != nullptr;
|
||||
}
|
||||
|
||||
virtual EStreamError Open() override
|
||||
{
|
||||
return stream_ ? EStreamError::eErrorNone : EStreamError::eErrorStreamInterrupted;
|
||||
}
|
||||
|
||||
virtual EStreamError ArbitraryRead(AuUInt32 offset, void *buffer, AuUInt32 &len) override
|
||||
{
|
||||
auto oldLen = std::exchange(len, 0);
|
||||
if (!stream_) return EStreamError::eErrorStreamNotOpen;
|
||||
stream_->SetOffset(offset);
|
||||
len = stream_->Read(buffer, oldLen);
|
||||
if (len == 0) return EStreamError::eErrorEndOfStream;
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
stream_.reset();
|
||||
}
|
||||
|
||||
private:
|
||||
OpenReadUnique_t stream_{};
|
||||
};
|
||||
}
|
49
Include/Aurora/IO/FS/FileReader.hpp
Normal file
49
Include/Aurora/IO/FS/FileReader.hpp
Normal file
@ -0,0 +1,49 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: FileReader.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
class FileReader : public IStreamReader
|
||||
{
|
||||
public:
|
||||
AU_NO_COPY_NO_MOVE(FileReader)
|
||||
|
||||
FileReader() {}
|
||||
~FileReader() {}
|
||||
|
||||
template<typename... T>
|
||||
bool OpenFile(T... args)
|
||||
{
|
||||
stream_ = OpenReadUnique(args...);
|
||||
return stream_ != nullptr;
|
||||
}
|
||||
|
||||
virtual EStreamError Open() override
|
||||
{
|
||||
return stream_ ? EStreamError::eErrorNone : EStreamError::eErrorStreamInterrupted;
|
||||
}
|
||||
|
||||
virtual EStreamError Read(void *buffer, AuUInt32 &len) override
|
||||
{
|
||||
auto oldLen = std::exchange(len, 0);
|
||||
if (!stream_) return EStreamError::eErrorStreamNotOpen;
|
||||
len = stream_->Read(buffer, oldLen);
|
||||
if (len == 0) return EStreamError::eErrorEndOfStream;
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
stream_.reset();
|
||||
}
|
||||
|
||||
private:
|
||||
OpenReadUnique_t stream_{};
|
||||
};
|
||||
}
|
26
Include/Aurora/IO/FS/FileStream.hpp
Normal file
26
Include/Aurora/IO/FS/FileStream.hpp
Normal file
@ -0,0 +1,26 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: FileStream.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
class IFileStream
|
||||
{
|
||||
public:
|
||||
virtual AuUInt64 GetOffset() = 0;
|
||||
virtual bool SetOffset(AuUInt64 offset) = 0;
|
||||
virtual AuUInt64 GetLength() = 0;
|
||||
virtual AuUInt64 Read(void *in, AuUInt64 length) = 0;
|
||||
virtual AuUInt64 Write(const void *out, AuUInt64 length) = 0;
|
||||
virtual void Close() = 0;
|
||||
virtual void Flush() = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(OpenRead, IFileStream, const AuString &path);
|
||||
AUKN_SHARED_API(OpenWrite, IFileStream, const AuString &path);
|
||||
}
|
54
Include/Aurora/IO/FS/FileWriter.hpp
Normal file
54
Include/Aurora/IO/FS/FileWriter.hpp
Normal file
@ -0,0 +1,54 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: FileWriter.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
class FileWriter : public IStreamWriter
|
||||
{
|
||||
public:
|
||||
AU_NO_COPY_NO_MOVE(FileWriter)
|
||||
|
||||
FileWriter() {}
|
||||
~FileWriter() {}
|
||||
|
||||
template<typename... T>
|
||||
bool OpenFile(T... args)
|
||||
{
|
||||
stream_ = OpenWriteUnique(args...);
|
||||
return stream_ != nullptr;
|
||||
}
|
||||
|
||||
virtual EStreamError Open() override
|
||||
{
|
||||
return stream_ ? EStreamError::eErrorNone : EStreamError::eErrorStreamInterrupted;
|
||||
}
|
||||
|
||||
virtual EStreamError Write(const void *buffer, AuUInt32 len) override
|
||||
{
|
||||
if (!stream_) return EStreamError::eErrorStreamNotOpen;
|
||||
len = stream_->Write(buffer, len);
|
||||
if (len == 0) return EStreamError::eErrorEndOfStream;
|
||||
if (len != len) return EStreamError::eErrorStreamInterrupted;
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
virtual void Flush() override
|
||||
{
|
||||
if (stream_) stream_->Flush();
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
stream_.reset();
|
||||
}
|
||||
|
||||
private:
|
||||
OpenWriteUnique_t stream_{};
|
||||
};
|
||||
}
|
25
Include/Aurora/IO/FS/Resources.hpp
Normal file
25
Include/Aurora/IO/FS/Resources.hpp
Normal file
@ -0,0 +1,25 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Resources.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
/**
|
||||
Suffixes a global read/writable path with nameSpace and a splitter
|
||||
*/
|
||||
AUKN_SYM bool GetSystemDomain(AuString& path);
|
||||
|
||||
/**
|
||||
Suffixes a global read/writable path with within a home/sandbox directory
|
||||
*/
|
||||
AUKN_SYM bool GetProfileDomain(AuString& path);
|
||||
|
||||
|
||||
AUKN_SYM bool GetSystemResourcePath(const AuString& fileName, AuString& path);
|
||||
|
||||
}
|
27
Include/Aurora/IO/FS/Stat.hpp
Normal file
27
Include/Aurora/IO/FS/Stat.hpp
Normal file
@ -0,0 +1,27 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Stat.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::FS
|
||||
{
|
||||
struct Stat
|
||||
{
|
||||
bool exists;
|
||||
bool existsFile, existsDirectory, existsSystemResource;
|
||||
bool symLink;
|
||||
AuInt64 created;
|
||||
AuInt64 modified;
|
||||
AuInt64 accessed;
|
||||
AuUInt64 size;
|
||||
};
|
||||
|
||||
/**
|
||||
Classic file stat function
|
||||
*/
|
||||
AUKN_SYM bool StatFile(const AuString &path, Stat &stat);
|
||||
}
|
19
Include/Aurora/IO/IArbitraryStreamer.hpp
Normal file
19
Include/Aurora/IO/IArbitraryStreamer.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IArbitraryStreamer.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO
|
||||
{
|
||||
class IArbitraryStreamer
|
||||
{
|
||||
public:
|
||||
virtual EStreamError Open() = 0;
|
||||
virtual EStreamError ArbitraryRead(AuUInt32 offset, void *buffer, AuUInt32 &len) = 0;
|
||||
virtual void Close() = 0;
|
||||
};
|
||||
}
|
19
Include/Aurora/IO/IO.hpp
Normal file
19
Include/Aurora/IO/IO.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IO.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "EStreamError.hpp"
|
||||
|
||||
#include "IStreamReader.hpp"
|
||||
#include "IStreamWriter.hpp"
|
||||
#include "IArbitraryStreamer.hpp" // arbitrary read stream, dunno what you would want to call thousands_sep
|
||||
|
||||
#include "Buffered/Buffered.hpp"
|
||||
|
||||
#include "FS/FS.hpp"
|
||||
#include "Net/Net.hpp"
|
39
Include/Aurora/IO/IStreamReader.hpp
Normal file
39
Include/Aurora/IO/IStreamReader.hpp
Normal file
@ -0,0 +1,39 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IStreamReader.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO
|
||||
{
|
||||
class IStreamReader
|
||||
{
|
||||
public:
|
||||
virtual EStreamError Open() = 0;
|
||||
virtual EStreamError Read(void *buffer, AuUInt32 &len) = 0;
|
||||
virtual void Close() = 0;
|
||||
|
||||
EStreamError ReadAll(AuList<AuUInt8> &buffer)
|
||||
{
|
||||
static const int kBufferSize = 2048;
|
||||
AuUInt8 temp[kBufferSize];
|
||||
|
||||
AuUInt32 len = kBufferSize;
|
||||
EStreamError ret = EStreamError::eErrorEndOfStream;
|
||||
|
||||
while ((ret = Read(temp, len)) == EStreamError::eErrorNone)
|
||||
{
|
||||
if (len == 0) break;
|
||||
|
||||
buffer.insert(buffer.end(), temp, temp + len);
|
||||
|
||||
if (len != kBufferSize) break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
}
|
20
Include/Aurora/IO/IStreamWriter.hpp
Normal file
20
Include/Aurora/IO/IStreamWriter.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IStreamWriter.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO
|
||||
{
|
||||
class IStreamWriter
|
||||
{
|
||||
public:
|
||||
virtual EStreamError Open() = 0;
|
||||
virtual EStreamError Write(const void *buffer, AuUInt32 len) = 0;
|
||||
virtual void Flush() = 0;
|
||||
virtual void Close() = 0;
|
||||
};
|
||||
}
|
183
Include/Aurora/IO/Net/Net.hpp
Normal file
183
Include/Aurora/IO/Net/Net.hpp
Normal file
@ -0,0 +1,183 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Net.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::Net
|
||||
{
|
||||
enum TransportProtocol
|
||||
{
|
||||
kProtocolUDP,
|
||||
kProtocolTCP
|
||||
};
|
||||
|
||||
enum IPProtocol
|
||||
{
|
||||
kIPProtocolV4,
|
||||
kIPProtocolV6
|
||||
};
|
||||
|
||||
struct IPAddress
|
||||
{
|
||||
IPProtocol ip;
|
||||
bool hasIP;
|
||||
AuString address;
|
||||
union
|
||||
{
|
||||
AuUInt8 v4[4];
|
||||
AuUInt16 v6[8];
|
||||
};
|
||||
|
||||
AUKN_SYM AuString toString();
|
||||
};
|
||||
|
||||
struct Endpoint
|
||||
{
|
||||
TransportProtocol protocol;
|
||||
IPAddress address;
|
||||
AuUInt16 port;
|
||||
|
||||
// 0 - destination is a stateless datagram server
|
||||
// 1 - destination is a psuedo-stateful server
|
||||
AuUInt UDPTimeout;
|
||||
|
||||
AUKN_SYM AuString toString();
|
||||
};
|
||||
|
||||
class INetworkStream;
|
||||
class IBasicSocket;
|
||||
class IClientSocket;
|
||||
|
||||
using StreamHasData_cb = std::function<bool(AuSPtr<IClientSocket> socket)>; // DTLS/UDP/TCP/TLS -> TRUE = expects another frame or stream buffer, FALSE = end of socket life
|
||||
using InitializeSocket_cb = std::function<bool(AuSPtr<IClientSocket> socket)>;
|
||||
using ShutdownSocket_cb = std::function<void(AuSPtr<IBasicSocket> socket)>;
|
||||
|
||||
using Error_t = std::error_code;
|
||||
|
||||
class IBasicSocket
|
||||
{
|
||||
public:
|
||||
virtual bool IsActive() = 0;
|
||||
virtual Error_t GetLastError() = 0;
|
||||
virtual void Shutdown() = 0;
|
||||
virtual bool GetLocalEndpoint(Endpoint &out) = 0;
|
||||
};
|
||||
|
||||
class IClientSocket : public IBasicSocket
|
||||
{
|
||||
public:
|
||||
// called during loop pump
|
||||
struct ClientCallbacks
|
||||
{
|
||||
StreamHasData_cb hasData; // on data available
|
||||
ShutdownSocket_cb onShutdown; // Socket shutdown or otherwise dead
|
||||
ShutdownSocket_cb onStreamOverSaturation; // DoS?
|
||||
ShutdownSocket_cb onTLSHandshakeAbort;
|
||||
};
|
||||
|
||||
virtual bool Initialize(const ClientCallbacks &callbacks) = 0;
|
||||
virtual bool Initialize() = 0;
|
||||
|
||||
virtual bool GetRemoteEndpoint(Endpoint &out) = 0;
|
||||
|
||||
virtual bool ReadAsync(AuUInt8 *buffer, bool all, AuUInt32 &length) = 0;
|
||||
virtual bool WriteAsync(const AuUInt8 *buffer, AuUInt32 length) = 0;
|
||||
virtual bool WriteAsync(const AuUInt8 *buffer, AuUInt32 length, std::function<void(bool)>) = 0;
|
||||
|
||||
virtual AuUInt GetInternalRecvBuffer() = 0;
|
||||
virtual bool SetInternalRecvBuffer(AuUInt bytes) = 0;
|
||||
};
|
||||
|
||||
class ILocalClientSocket : public IClientSocket
|
||||
{
|
||||
public:
|
||||
using ConnectCallback_cb = std::function<void(bool success)>;
|
||||
virtual bool Connect() = 0;
|
||||
virtual void ConnectAsync(ConnectCallback_cb cb) = 0;
|
||||
};
|
||||
|
||||
struct TlsConnect
|
||||
{
|
||||
Aurora::Crypto::X509::Certificate serverCertificate;
|
||||
AuSPtr<IBasicSocket> socket;
|
||||
};
|
||||
|
||||
using TlsConnect_cb = std::function<bool(const TlsConnect &info)>;
|
||||
|
||||
struct ServerInfo
|
||||
{
|
||||
Endpoint listen;
|
||||
};
|
||||
|
||||
struct TLSServerInfo : ServerInfo
|
||||
{
|
||||
Aurora::Crypto::RSAPair cert;
|
||||
};
|
||||
|
||||
struct ClientInfo
|
||||
{
|
||||
Endpoint socket;
|
||||
AuString service;
|
||||
};
|
||||
|
||||
struct TLSClientInfo : ClientInfo
|
||||
{
|
||||
TlsConnect_cb pinning;
|
||||
};
|
||||
|
||||
class IServer : public IBasicSocket
|
||||
{
|
||||
public:
|
||||
virtual bool AddAcceptCallback(const InitializeSocket_cb &accept) = 0; // on accept*
|
||||
virtual bool AddExitCallback(const ShutdownSocket_cb &accept) = 0; // server shutdown*
|
||||
|
||||
virtual void GetClients(AuList<AuSPtr<IClientSocket>> &soccies) = 0;
|
||||
virtual bool Listen() = 0;
|
||||
};
|
||||
|
||||
class INetworkingPool
|
||||
{
|
||||
public:
|
||||
/**
|
||||
Supported thread models:
|
||||
while (true)
|
||||
{
|
||||
// read from sockets pre-frame
|
||||
PumpSOL();
|
||||
|
||||
// process other async network logic here
|
||||
|
||||
// process writes and a few early reads before we sleep
|
||||
PumpEOL();
|
||||
|
||||
// yield
|
||||
Yield();
|
||||
}
|
||||
|
||||
while (true)
|
||||
{
|
||||
// process other async network logic here
|
||||
|
||||
// run
|
||||
Run()
|
||||
}
|
||||
|
||||
*/
|
||||
virtual void PumpSOL() = 0;
|
||||
virtual void PumpEOL() = 0;
|
||||
|
||||
virtual void Run() = 0;
|
||||
|
||||
virtual bool NewServer(const ServerInfo &listen, IServer *&out) = 0;
|
||||
virtual bool NewTlsServer(const TLSServerInfo &keys, IServer *&out) = 0;
|
||||
virtual void DeleteServer(IServer *socket) = 0;
|
||||
|
||||
virtual bool NewClient(const ClientInfo &info, ILocalClientSocket *&out) = 0;
|
||||
virtual bool NewTlsClient(const TLSClientInfo &info, ILocalClientSocket *&out) = 0;
|
||||
virtual void DeleteClient(ILocalClientSocket *socket) = 0;
|
||||
};
|
||||
}
|
9
Include/Aurora/Legacy/BIMap.hpp
Normal file
9
Include/Aurora/Legacy/BIMap.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: BIMap.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
9
Include/Aurora/Legacy/IDMap.hpp
Normal file
9
Include/Aurora/Legacy/IDMap.hpp
Normal file
@ -0,0 +1,9 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IDMap.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
11
Include/Aurora/Legacy/Legacy.hpp
Normal file
11
Include/Aurora/Legacy/Legacy.hpp
Normal file
@ -0,0 +1,11 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Legacy.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "BIMap.hpp"
|
||||
#include "IDMap.hpp"
|
34
Include/Aurora/Locale/Locale.hpp
Normal file
34
Include/Aurora/Locale/Locale.hpp
Normal file
@ -0,0 +1,34 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Locale.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Locale
|
||||
{
|
||||
struct LocalizationInfo
|
||||
{
|
||||
LocalizationInfo(const AuString& language, const AuString& country, const AuString& codeset) : Language(language), Country(country), Codeset(codeset) {}
|
||||
|
||||
const AuString& Language;
|
||||
const AuString& Country;
|
||||
const AuString& Codeset;
|
||||
};
|
||||
|
||||
/*
|
||||
Retrieves information about the current system <br>
|
||||
This function will never fail <br>
|
||||
This function will never release memory
|
||||
*/
|
||||
AUKN_SYM LocalizationInfo GetLocale();
|
||||
|
||||
|
||||
#if defined(AURORA_PLATFORM_WIN32) || defined(I_REALLY_NEED_WIDECHAR_PUBAPI)
|
||||
AUKN_SYM std::wstring ConvertFromUTF8(const AuString &in);
|
||||
AUKN_SYM AuString ConvertFromWChar(const wchar_t *in, AuMach length);
|
||||
AUKN_SYM AuString ConvertFromWChar(const wchar_t *in);
|
||||
#endif
|
||||
}
|
8
Include/Aurora/Memory/Handles.hpp
Normal file
8
Include/Aurora/Memory/Handles.hpp
Normal file
@ -0,0 +1,8 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Handles.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
139
Include/Aurora/Memory/Heap.hpp
Normal file
139
Include/Aurora/Memory/Heap.hpp
Normal file
@ -0,0 +1,139 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Heap.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Memory
|
||||
{
|
||||
class Heap
|
||||
{
|
||||
public:
|
||||
virtual Types::size_t GetChunkSize(const void *head) = 0;
|
||||
|
||||
template<typename T = void *>
|
||||
T ZAlloc(Types::size_t length)
|
||||
{
|
||||
return reinterpret_cast<T>(_ZAlloc(length));
|
||||
}
|
||||
|
||||
template<typename T = void *>
|
||||
T ZAlloc(Types::size_t length, Types::size_t align)
|
||||
{
|
||||
return reinterpret_cast<T>(_ZAlloc(length, align));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *ZAlloc()
|
||||
{
|
||||
return reinterpret_cast<T *>(_ZAlloc(sizeof(T)));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *NewArray(Types::size_t count)
|
||||
{
|
||||
return ZAlloc<T *>(count * sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *NewArray(Types::size_t count, Types::size_t align)
|
||||
{
|
||||
return ZAlloc<T *>(count * sizeof(T), align);
|
||||
}
|
||||
|
||||
/// Fast, unsafe alloc
|
||||
template<typename T = void *>
|
||||
T FAlloc(Types::size_t length)
|
||||
{
|
||||
return reinterpret_cast<T>(_FAlloc(length));
|
||||
}
|
||||
|
||||
template<typename T = void *>
|
||||
T FAlloc(Types::size_t length, Types::size_t align)
|
||||
{
|
||||
return reinterpret_cast<T>(_FAlloc(length, align));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T ZRealloc(T in, Types::size_t length)
|
||||
{
|
||||
return reinterpret_cast<T>(_ZRealloc(reinterpret_cast<void *>(in), length));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T ZRealloc(T in, Types::size_t length, Types::size_t alloc)
|
||||
{
|
||||
return reinterpret_cast<T>(_ZRealloc(reinterpret_cast<void *>(in), length), alloc);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T FRealloc(T in, Types::size_t length)
|
||||
{
|
||||
return reinterpret_cast<T>(_SRealloc(reinterpret_cast<void *>(in), length));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T FRealloc(T in, Types::size_t length, Types::size_t alloc)
|
||||
{
|
||||
return reinterpret_cast<T>(_SRealloc(reinterpret_cast<void *>(in), length), alloc);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Free(T in)
|
||||
{
|
||||
_Free(reinterpret_cast<void *>(in));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
AuSPtr<T> ToSmartPointer(T *in)
|
||||
{
|
||||
if (in == nullptr) return {};
|
||||
return
|
||||
std::shared_ptr<T>(in,
|
||||
[=](T *delt)
|
||||
{
|
||||
if constexpr (std::is_class_v<T>)
|
||||
{
|
||||
delt->~T();
|
||||
}
|
||||
this->Free(delt);
|
||||
});
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
static AuSPtr<T> ToSmartPointer(AuSPtr<Heap> heap, T *in)
|
||||
{
|
||||
return
|
||||
std::shared_ptr<T>(in,
|
||||
[=](T *delt)
|
||||
{
|
||||
heap->Free(delt);
|
||||
});
|
||||
}
|
||||
|
||||
private:
|
||||
virtual AU_ALLOC void *_ZAlloc(Types::size_t length) = 0;
|
||||
virtual AU_ALLOC void *_ZAlloc(Types::size_t length, Types::size_t align) = 0;
|
||||
virtual AU_ALLOC void *_FAlloc(Types::size_t length) = 0;
|
||||
virtual AU_ALLOC void *_FAlloc(Types::size_t length, Types::size_t align) = 0;
|
||||
virtual AU_ALLOC void *_ZRealloc(void *buffer, Types::size_t length, Types::size_t align) = 0;
|
||||
virtual AU_ALLOC void *_ZRealloc(void *buffer, Types::size_t length) = 0;
|
||||
virtual AU_ALLOC void *_FRealloc(void *buffer, Types::size_t length, Types::size_t align) = 0;
|
||||
virtual AU_ALLOC void *_FRealloc(void *buffer, Types::size_t length) = 0;
|
||||
virtual void _Free(void* buffer) = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
Returns a heap interface backed by the default allocator
|
||||
*/
|
||||
AUKN_SHARED_API(GetDefaultDiscontiguousHeap, Heap);
|
||||
|
||||
/**
|
||||
Allocates Fize amount of memory
|
||||
@return a heap backed by allocated memory
|
||||
*/
|
||||
AUKN_SHARED_API(AllocHeap, Heap, AuUInt size);
|
||||
}
|
32
Include/Aurora/Memory/MemRef.hpp
Normal file
32
Include/Aurora/Memory/MemRef.hpp
Normal file
@ -0,0 +1,32 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: MemRef.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Memory
|
||||
{
|
||||
template<typename T>
|
||||
struct MemRef
|
||||
{
|
||||
MemRef(T *val)
|
||||
{
|
||||
Pointer = val;
|
||||
}
|
||||
|
||||
MemRef(T &val)
|
||||
{
|
||||
Pointer = &val;
|
||||
}
|
||||
|
||||
T *operator->() const
|
||||
{
|
||||
return Pointer;
|
||||
}
|
||||
|
||||
T *Pointer;
|
||||
};
|
||||
}
|
143
Include/Aurora/Memory/Memory.hpp
Normal file
143
Include/Aurora/Memory/Memory.hpp
Normal file
@ -0,0 +1,143 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Memory.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include <Aurora/Data/Data.hpp>
|
||||
|
||||
#include "MemRef.hpp"
|
||||
#include "Heap.hpp"
|
||||
#include "Handles.hpp"
|
||||
|
||||
namespace Aurora::Memory
|
||||
{
|
||||
AUKN_SYM AU_ALLOC void *_ZAlloc(Types::size_t length);
|
||||
AUKN_SYM AU_ALLOC void *_ZAlloc(Types::size_t length, Types::size_t align);
|
||||
AUKN_SYM AU_ALLOC void *_FAlloc(Types::size_t length);
|
||||
AUKN_SYM AU_ALLOC void *_FAlloc(Types::size_t length, Types::size_t align);
|
||||
AUKN_SYM AU_ALLOC void *_ZRealloc(void *buffer, Types::size_t length, Types::size_t align);
|
||||
AUKN_SYM AU_ALLOC void *_ZRealloc(void *buffer, Types::size_t length);
|
||||
AUKN_SYM AU_ALLOC void *_FRealloc(void *buffer, Types::size_t length, Types::size_t align);
|
||||
AUKN_SYM AU_ALLOC void *_FRealloc(void *buffer, Types::size_t length);
|
||||
AUKN_SYM void _Free(void *buffer);
|
||||
|
||||
AUKN_SYM Types::size_t GetChunkSize(const void *head);
|
||||
|
||||
// These memory management APIs do not support class types, and will likely *never* support them
|
||||
// QST already handles dynamic allocation of structs in a given heap properly (afaik)
|
||||
// _new, new, et al are backed by operator overloads directed towards these functions
|
||||
// -> do not double init
|
||||
// TODO: ensure typeof(T) is not a pointer of a class
|
||||
|
||||
template<typename T>
|
||||
T ZAlloc(Types::size_t length)
|
||||
{
|
||||
static_assert(!std::is_class<std::remove_pointer<T>::type>::value, "Do not use heap/kmem apis with classes");
|
||||
return reinterpret_cast<T>(_ZAlloc(length));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T ZAlloc(Types::size_t length, Types::size_t align)
|
||||
{
|
||||
static_assert(!std::is_class<std::remove_pointer<T>::type>::value, "Do not use heap/kmem apis with classes");
|
||||
return reinterpret_cast<T>(_ZAlloc(length, align));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *NewArray(Types::size_t count)
|
||||
{
|
||||
static_assert(!std::is_class<T>::value, "Do not use heap/kmem apis with classes");
|
||||
return FAlloc<T *>(count * sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *NewArray(Types::size_t count, Types::size_t align)
|
||||
{
|
||||
static_assert(!std::is_class<T>::value, "Do not use heap/kmem apis with classes");
|
||||
return FAlloc<T *>(count * sizeof(T), align);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
AuSPtr<T> AllocateFastArray(Types::size_t length, Types::size_t align = sizeof(T))
|
||||
{
|
||||
static_assert(!std::is_class<std::remove_pointer<T>::type>::value, "Do not use heap/kmem apis with classes");
|
||||
return AuSPtr<T>(reinterpret_cast<T *>(_FAlloc(length)), [](T *ptr)
|
||||
{
|
||||
_Free(ptr);
|
||||
});
|
||||
}
|
||||
|
||||
template <class T>
|
||||
struct SpeedyArrayAllocator
|
||||
{
|
||||
typedef T value_type;
|
||||
|
||||
SpeedyArrayAllocator() = default;
|
||||
template <class U> constexpr SpeedyArrayAllocator(const SpeedyArrayAllocator <U> &) noexcept
|
||||
{
|
||||
}
|
||||
|
||||
[[nodiscard]] T *allocate(std::size_t n)
|
||||
{
|
||||
if (auto p = (NewArray<T>(n)))
|
||||
{
|
||||
return p;
|
||||
}
|
||||
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
|
||||
void deallocate(T *p, std::size_t n) noexcept
|
||||
{
|
||||
_Free(p);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
T FAlloc(Types::size_t length)
|
||||
{
|
||||
static_assert(!std::is_class<std::remove_pointer<T>::type>::value, "Do not use heap/kmem apis with classes");
|
||||
return reinterpret_cast<T>(_FAlloc(length));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T FAlloc(Types::size_t length, Types::size_t align)
|
||||
{
|
||||
static_assert(!std::is_class<std::remove_pointer<T>::type>::value, "Do not use heap/kmem apis with classes");
|
||||
return reinterpret_cast<T>(_FAlloc(length, align));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T ZRealloc(T in, Types::size_t length)
|
||||
{
|
||||
return reinterpret_cast<T>(_ZRealloc(reinterpret_cast<void *>(in), length));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T ZRealloc(T in, Types::size_t length, Types::size_t alloc)
|
||||
{
|
||||
return reinterpret_cast<T>(_ZRealloc(reinterpret_cast<void *>(in), length), alloc);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T SRealloc(T in, Types::size_t length)
|
||||
{
|
||||
return reinterpret_cast<T>(_SRealloc(reinterpret_cast<void *>(in), length));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T SRealloc(T in, Types::size_t length, Types::size_t alloc)
|
||||
{
|
||||
return reinterpret_cast<T>(_SRealloc(reinterpret_cast<void *>(in), length), alloc);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Free(T in)
|
||||
{
|
||||
_Free(reinterpret_cast<void *>(in));
|
||||
}
|
||||
}
|
23
Include/Aurora/Parse/Base32.hpp
Normal file
23
Include/Aurora/Parse/Base32.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Base32.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Parse
|
||||
{
|
||||
AUKN_SYM bool Base32Decode(const AuString &in, AuList<AuUInt8> &decoded);
|
||||
|
||||
AUKN_SYM bool Base32Encode(const void *buffer, AuMach length, AuString &encoded);
|
||||
static bool Base32Encode(const AuString &in, AuString &encoded)
|
||||
{
|
||||
return Base32Encode(in.data(), in.size(), encoded);
|
||||
}
|
||||
static bool Base32Encode(const AuList<AuUInt8> &in, AuString &encoded)
|
||||
{
|
||||
return Base32Encode(in.data(), in.size(), encoded);
|
||||
}
|
||||
}
|
23
Include/Aurora/Parse/Base64.hpp
Normal file
23
Include/Aurora/Parse/Base64.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Base64.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Parse
|
||||
{
|
||||
AUKN_SYM bool Base64Decode(const AuString &in, AuList<AuUInt8> &decoded, bool url = false);
|
||||
|
||||
AUKN_SYM bool Base64Encode(const void *buffer, AuMach length, AuString &encoded, bool url = false);
|
||||
static bool Base64Encode(const AuString &in, AuString &encoded, bool url = false)
|
||||
{
|
||||
return Base64Encode(in.data(), in.size(), encoded, url);
|
||||
}
|
||||
static bool Base64Encode(const AuList<AuUInt8> &in, AuString &encoded, bool url = false)
|
||||
{
|
||||
return Base64Encode(in.data(), in.size(), encoded, url);
|
||||
}
|
||||
}
|
32
Include/Aurora/Parse/LineParser.hpp
Normal file
32
Include/Aurora/Parse/LineParser.hpp
Normal file
@ -0,0 +1,32 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: LineParser.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Parse
|
||||
{
|
||||
static void SplitNewlines(const AuString &in, std::function<void(const AuString &)> lineCallback)
|
||||
{
|
||||
AuMach index = 0;
|
||||
AuString cpy = in;
|
||||
|
||||
while ((index = cpy.find("\n")) != AuString::npos)
|
||||
{
|
||||
auto line = cpy.substr(0, index);
|
||||
cpy = cpy.substr(index + 1);
|
||||
|
||||
if (line[line.size() - 1] == '\r')
|
||||
{
|
||||
line.pop_back();
|
||||
}
|
||||
|
||||
lineCallback(line);
|
||||
}
|
||||
|
||||
lineCallback(cpy);
|
||||
}
|
||||
}
|
14
Include/Aurora/Parse/Parse.hpp
Normal file
14
Include/Aurora/Parse/Parse.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Parse.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "Base32.hpp"
|
||||
#include "Base64.hpp"
|
||||
|
||||
#include "LineParser.hpp"
|
||||
#include "Parser.hpp"
|
163
Include/Aurora/Parse/Parser.hpp
Normal file
163
Include/Aurora/Parse/Parser.hpp
Normal file
@ -0,0 +1,163 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Parser.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include <Aurora/Data/Data.hpp>
|
||||
|
||||
namespace Aurora::Parse
|
||||
{
|
||||
enum class ParsableTag
|
||||
{
|
||||
kParseUInt = (const int)Aurora::Data::DataType::kTypeUInt,
|
||||
kParseSInt = (const int)Aurora::Data::DataType::kTypeSInt,
|
||||
kParseNumber = (const int)Aurora::Data::DataType::kTypeNumber,
|
||||
kParseString = (const int)Aurora::Data::DataType::kTypeString,
|
||||
kParseBoolean = (const int)Aurora::Data::DataType::kTypeBoolean,
|
||||
kParseUUID = (const int)Aurora::Data::DataType::kTypeUUID,
|
||||
kParseVec3 = (const int)Aurora::Data::DataType::kTypeVec3,
|
||||
kParseVec4 = (const int)Aurora::Data::DataType::kTypeVec4,
|
||||
kParseObject,
|
||||
kParseStringVararg
|
||||
};
|
||||
|
||||
struct ParseBit;
|
||||
struct ParsedBit;
|
||||
using ParseObject = AuList<ParseBit>;
|
||||
using ParsedObject = AuList<ParsedBit>;
|
||||
|
||||
using ParsePrimativeValue = Aurora::Data::PrimitiveValue;
|
||||
using ParseValue = Aurora::Data::Value;
|
||||
|
||||
struct ParseValueEx : ParseValue
|
||||
{
|
||||
ParsedObject Object;
|
||||
};
|
||||
|
||||
struct ParseBit
|
||||
{
|
||||
ParseBit(ParsableTag _Tag, const AuString &_Label) : tag(_Tag), label(_Label)
|
||||
{
|
||||
}
|
||||
ParseBit(ParsableTag _Tag, const AuString &_Label, bool _Array, bool _Optional, bool _vararg) : tag(_Tag), label(_Label), array(_Array), optional(_Optional), vararg(_vararg)
|
||||
{
|
||||
}
|
||||
ParseBit(ParsableTag _Tag) : tag(_Tag)
|
||||
{
|
||||
}
|
||||
ParseBit(ParsableTag _Tag, bool _Array, bool _Optional, bool _vararg) : tag(_Tag), array(_Array), optional(_Optional), vararg(_vararg)
|
||||
{
|
||||
}
|
||||
ParseBit(ParseObject _ObjectParse) : tag(ParsableTag::kParseObject), objectParse(_ObjectParse)
|
||||
{
|
||||
}
|
||||
ParseBit(ParseObject _ObjectParse, const AuString &_Label) : tag(ParsableTag::kParseObject), objectParse(_ObjectParse), label(_Label)
|
||||
{
|
||||
}
|
||||
|
||||
// marks this "parse bit" and all following part bits optional
|
||||
bool optional = false;
|
||||
|
||||
// if true, the lexer yoinks a length prefix token before iterating over array length
|
||||
bool array = false;
|
||||
|
||||
// if true, the lexer parses tag or object parse until EOS
|
||||
bool vararg = false;
|
||||
|
||||
// parse defintion
|
||||
ParsableTag tag;
|
||||
ParseObject objectParse;
|
||||
|
||||
// optional:
|
||||
AuString label = "";
|
||||
|
||||
// parse object
|
||||
// {...}
|
||||
// single parse bit:
|
||||
// <tag-label: value>
|
||||
// optional:
|
||||
// <max-number: value> <min-number: value> (<min-number: value>)
|
||||
// var arg:
|
||||
// <max-number: value> <min-number: value> (<min-number: value> ...)
|
||||
// arrays
|
||||
// <max-number: value> <min-number: value> [<array count> <min-number: value>]
|
||||
};
|
||||
|
||||
struct ParsedBit
|
||||
{
|
||||
ParsedBit()
|
||||
{
|
||||
}
|
||||
ParsedBit(ParsableTag _tag) : tag(_tag)
|
||||
{
|
||||
}
|
||||
|
||||
AuMach count;
|
||||
ParsableTag tag;
|
||||
bool isArray;
|
||||
|
||||
struct
|
||||
{
|
||||
ParseValueEx single;
|
||||
AuList<ParseValueEx> array;
|
||||
} value;
|
||||
};
|
||||
|
||||
struct ParseResult
|
||||
{
|
||||
AuString SyntaxError;
|
||||
AuString DebugTree;
|
||||
ParsedObject result;
|
||||
};
|
||||
|
||||
using ConsumeStream_cb = std::function<bool(AuUInt8 &)>;
|
||||
|
||||
static ConsumeStream_cb StringToConsumable(const AuString &str, AuMach &index)
|
||||
{
|
||||
auto getc = [&](AuUInt8 &byt) mutable
|
||||
{
|
||||
if (index == str.length())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
byt = str[index];
|
||||
index++;
|
||||
return true;
|
||||
};
|
||||
return getc;
|
||||
}
|
||||
|
||||
AUKN_SYM void VaildateStructure(const ParseObject &object);
|
||||
AUKN_SYM bool ConsumeToken(ParsableTag type, ConsumeStream_cb getc, ParseValue &out);
|
||||
|
||||
static bool ConsumeToken(ParsableTag type, const AuString &str, AuMach &index, ParseValueEx &out)
|
||||
{
|
||||
return ConsumeToken(type, StringToConsumable(str, index), out);
|
||||
}
|
||||
|
||||
static bool ConsumeToken(ParsableTag type, const AuString &str, ParseValueEx &out)
|
||||
{
|
||||
AuMach index{};
|
||||
return ConsumeToken(type, StringToConsumable(str, index), out);
|
||||
}
|
||||
|
||||
AUKN_SYM bool Parse(ParseResult &result, const ParseObject &structure, ConsumeStream_cb getc);
|
||||
|
||||
static bool Parse(ParseResult &result, const ParseObject &structure, const AuString &str, AuMach &index)
|
||||
{
|
||||
return Parse(result, structure, StringToConsumable(str, index));
|
||||
}
|
||||
|
||||
static bool Parse(ParseResult &result, const ParseObject &structure, const AuString &str)
|
||||
{
|
||||
AuMach index{};
|
||||
return Parse(result, structure, StringToConsumable(str, index));
|
||||
}
|
||||
|
||||
AUKN_SYM void SerializeToken(ParsableTag type, const ParseValue &value, AuString &str);
|
||||
AUKN_SYM void Serialize(const ParsedObject &structure, AuString &ret);
|
||||
}
|
20
Include/Aurora/Process/Paths.hpp
Normal file
20
Include/Aurora/Process/Paths.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Paths.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Process
|
||||
{
|
||||
/**
|
||||
Retrieves the applications current working directory
|
||||
*/
|
||||
AUKN_SYM bool GetWorkingDirectory(AuString &path);
|
||||
|
||||
AUKN_SYM bool GetProcName(AuString &executable);
|
||||
AUKN_SYM bool GetProcPath(AuString &path);
|
||||
AUKN_SYM bool GetProcFullPath(AuString &path);
|
||||
}
|
11
Include/Aurora/Process/Process.hpp
Normal file
11
Include/Aurora/Process/Process.hpp
Normal file
@ -0,0 +1,11 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Process.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "Paths.hpp"
|
||||
#include "ProcessMap.hpp"
|
24
Include/Aurora/Process/ProcessMap.hpp
Normal file
24
Include/Aurora/Process/ProcessMap.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ModuleInfo.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Process
|
||||
{
|
||||
struct Segment
|
||||
{
|
||||
AuUInt base;
|
||||
AuUInt size;
|
||||
char perms[6];
|
||||
AuString module;
|
||||
};
|
||||
using Segments = AuList<Segment>;
|
||||
|
||||
AUKN_SYM std::optional<Segment> GetSegment(AuUInt pointer);
|
||||
AUKN_SYM Segments DumpExecutableRoot();
|
||||
AUKN_SYM Segments DumpExecutableAll();
|
||||
}
|
18
Include/Aurora/Processes/ESpawnType.hpp
Normal file
18
Include/Aurora/Processes/ESpawnType.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ESpawnType.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Processes
|
||||
{
|
||||
enum class ESpawnType
|
||||
{
|
||||
eSpawnAtomicOvermap, // posix: exec, win32: i dunno
|
||||
eSpawnChildProcessWorker, // posix: thread, win32: job process
|
||||
eSpawnThreadLeader // posix: thread leader / new sid / pid != 0 daemon, win32: process
|
||||
};
|
||||
}
|
41
Include/Aurora/Processes/IProcess.hpp
Normal file
41
Include/Aurora/Processes/IProcess.hpp
Normal file
@ -0,0 +1,41 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IProcess.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading
|
||||
{
|
||||
class IWaitable;
|
||||
}
|
||||
|
||||
namespace Aurora::Processes
|
||||
{
|
||||
class IProcess
|
||||
{
|
||||
public:
|
||||
///
|
||||
/// @return the waitable of a waitable child process or thread leader
|
||||
virtual Threading::IWaitable *AsWaitable() = 0;
|
||||
|
||||
/// Assuming AsWaitable()->TryLock() && Spawn != SpawnType::kSpawnAtomicOvermap,
|
||||
/// returns the true return value of the process
|
||||
/// otherwise returns zero
|
||||
virtual AuSInt GetExitCode() = 0;
|
||||
|
||||
///
|
||||
/// @param exitOnSpawn atomically destroys the current process <br>
|
||||
/// some platforms only support this
|
||||
///
|
||||
virtual bool Start(enum ESpawnType, bool fwdOut, bool fwdErr, bool fwdIn) = 0;
|
||||
|
||||
virtual bool Terminate() = 0;
|
||||
virtual bool TryKill() = 0;
|
||||
|
||||
virtual bool Read(bool error, void *buffer, AuUInt32 &len) = 0;
|
||||
virtual bool Write(const void *buffer, AuUInt32 len) = 0;
|
||||
};
|
||||
}
|
17
Include/Aurora/Processes/Open.hpp
Normal file
17
Include/Aurora/Processes/Open.hpp
Normal file
@ -0,0 +1,17 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Open.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Processes
|
||||
{
|
||||
/// opens a standard uri formatted string (eg, protocol://endpoint/path)
|
||||
AUKN_SYM void OpenUri(const AuString &uri);
|
||||
|
||||
/// opens a file given a relative path or abs path
|
||||
AUKN_SYM void OpenFile(const AuString &file);
|
||||
}
|
14
Include/Aurora/Processes/Processes.hpp
Normal file
14
Include/Aurora/Processes/Processes.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Processes.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "ESpawnType.hpp"
|
||||
#include "IProcess.hpp"
|
||||
#include "Spawn.hpp"
|
||||
|
||||
#include "Open.hpp"
|
13
Include/Aurora/Processes/Spawn.hpp
Normal file
13
Include/Aurora/Processes/Spawn.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Spawn.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Processes
|
||||
{
|
||||
AUKN_SHARED_API(Spawn, IProcess, const AuString &app, const AuList<AuString> &args);
|
||||
}
|
53
Include/Aurora/RNG/RNG.hpp
Normal file
53
Include/Aurora/RNG/RNG.hpp
Normal file
@ -0,0 +1,53 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: RNG.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::RNG
|
||||
{
|
||||
AUKN_SYM void ReadSecureRNG(void *in, AuUInt length);
|
||||
|
||||
template<typename T, int N>
|
||||
void Read(T(&array)[N])
|
||||
{
|
||||
ReadSecureRNG(array, N * sizeof(T));
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void Read(T *array, AuUInt length)
|
||||
{
|
||||
ReadSecureRNG(array, length * sizeof(T));
|
||||
}
|
||||
|
||||
enum class RngStringCharacters
|
||||
{
|
||||
eAlphaCharacters,
|
||||
eAlphaNumericCharacters,
|
||||
eExtendedEntropy,
|
||||
MAX
|
||||
};
|
||||
|
||||
static void RngString(char *string, AuUInt length, RngStringCharacters type = RngStringCharacters::eAlphaCharacters)
|
||||
{
|
||||
static std::pair<const char *, int> rngSequence[static_cast<int>(RngStringCharacters::MAX)] =
|
||||
{
|
||||
{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 52},
|
||||
{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 62},
|
||||
{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890=-+!$%^*.[];:", 75}
|
||||
};
|
||||
|
||||
ReadSecureRNG(string, length);
|
||||
|
||||
const auto &pair = rngSequence[static_cast<int>(type)];
|
||||
|
||||
for (auto i = 0; i < length; i++)
|
||||
{
|
||||
auto idx = static_cast<float>(reinterpret_cast<AuUInt8 *>(string)[i]) / 255.f * static_cast<float>(pair.second);
|
||||
string[i] = pair.first[static_cast<int>(idx)];
|
||||
}
|
||||
}
|
||||
}
|
18
Include/Aurora/Registry/ERegistrySource.hpp
Normal file
18
Include/Aurora/Registry/ERegistrySource.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ERegistrySource.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Registry
|
||||
{
|
||||
enum ERegistrySource
|
||||
{
|
||||
eFSGlobal,
|
||||
eFSProfile,
|
||||
eGlobal
|
||||
};
|
||||
}
|
23
Include/Aurora/Registry/IRegistry.hpp
Normal file
23
Include/Aurora/Registry/IRegistry.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IRegistry.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Registry
|
||||
{
|
||||
using RegistryType = Aurora::Data::DataType;
|
||||
using RegistryValue = Aurora::Data::Value;
|
||||
|
||||
class IRegistry
|
||||
{
|
||||
public:
|
||||
virtual bool KeyExists(const AuString &key, RegistryType &type) = 0;
|
||||
virtual bool GetOrCreateKey(const AuString &key, const RegistryValue &def, RegistryValue &value) = 0;
|
||||
virtual bool SetKey(const AuString &key, const RegistryValue &value) = 0;
|
||||
virtual bool GetKey(const AuString &key, RegistryValue &value) = 0;
|
||||
};
|
||||
}
|
18
Include/Aurora/Registry/Registry.hpp
Normal file
18
Include/Aurora/Registry/Registry.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Registry.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include <Aurora/Parse/Parse.hpp>
|
||||
|
||||
#include "ERegistrySource.hpp"
|
||||
#include "IRegistry.hpp"
|
||||
|
||||
namespace Aurora::Registry
|
||||
{
|
||||
AUKN_SHARED_API(Registry, IRegistry, ERegistrySource source, const AuString &name);
|
||||
}
|
138
Include/Aurora/Runtime.hpp
Normal file
138
Include/Aurora/Runtime.hpp
Normal file
@ -0,0 +1,138 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Runtime.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#if defined(AURORA_ENGINE_KERNEL_STATIC)
|
||||
#define AUKN_SYM
|
||||
#else
|
||||
#if defined(AURORA_ENGINE_KERNEL_EXPORT)
|
||||
#define AUKN_SYM AURORA_SYMBOL_EXPORT
|
||||
#else
|
||||
#define AUKN_SYM AURORA_SYMBOL_IMPORT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "../AuroraMacros.hpp"
|
||||
|
||||
#if defined(_AUHAS_ASIO)
|
||||
#include <asio.hpp>
|
||||
#endif
|
||||
|
||||
#include <optional>
|
||||
#include <functional>
|
||||
|
||||
#include "../AuroraTypedefs.hpp"
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <fmt/core.h>
|
||||
#include <fmt/format.h>
|
||||
#include <fmt/chrono.h>
|
||||
#include <uuid.h>
|
||||
|
||||
#define AUKN_SHARED_API(name, type, ...) AU_SHARED_API_EX(AUKN_SYM, name, type, ## __VA_ARGS__)
|
||||
|
||||
#include "Memory/Memory.hpp"
|
||||
|
||||
#include "Console/Console.hpp"
|
||||
#include "Crypto/Crypto.hpp"
|
||||
#include "Compression/Compression.hpp"
|
||||
#include "Data/Data.hpp"
|
||||
#include "Debug/Debug.hpp"
|
||||
#include "Hashing/Hashing.hpp"
|
||||
#include "HWInfo/HWInfo.hpp"
|
||||
#include "IO/IO.hpp"
|
||||
#include "Legacy/Legacy.hpp"
|
||||
#include "Locale/Locale.hpp"
|
||||
#include "Parse/Parse.hpp"
|
||||
#include "Process/Process.hpp"
|
||||
#include "Processes/Processes.hpp"
|
||||
#include "Registry/Registry.hpp"
|
||||
#include "RNG/RNG.hpp"
|
||||
#include "Telemetry/Telemetery.hpp"
|
||||
#include "Threading/Threading.hpp"
|
||||
#include "Async/Async.hpp"
|
||||
#include "Time/Time.hpp"
|
||||
|
||||
#include "../AuroraUtils.hpp"
|
||||
|
||||
namespace Aurora
|
||||
{
|
||||
struct LocalLogInfo
|
||||
{
|
||||
bool enableLogging {true};
|
||||
bool autoCompressOldLogs {false};
|
||||
AuUInt32 maxSizeMB {128 * 1024 * 1024}; // these numbers feel insane, but at least we have a max threshold
|
||||
int maxLogs {1024}; // by default, we neither leak disk space or waste opportunities of being able to dig through old data
|
||||
};
|
||||
|
||||
struct TelemetryConfigDoc
|
||||
{
|
||||
LocalLogInfo localLogging;
|
||||
bool enabled {false};
|
||||
|
||||
AuString address;
|
||||
AuUInt16 port {45069};
|
||||
AuString serviceIdnt {"7b5f7a54-7122-4489-ac1a-3d75884b307e"};
|
||||
|
||||
bool wantsActiveMonitoring {false};
|
||||
|
||||
bool privacyNoData {false};
|
||||
bool privacyNoMod {false};
|
||||
bool privacyNoLog {false};
|
||||
bool privacyNoWarn {false};
|
||||
|
||||
bool alwaysCrashdump {true};
|
||||
bool alwaysDisableCrashdump {false};
|
||||
|
||||
};
|
||||
|
||||
struct TelemetryConfig
|
||||
{
|
||||
bool readModNameJsonConfig {};
|
||||
TelemetryConfigDoc defaultConfig;
|
||||
};
|
||||
|
||||
struct ConsoleConfig
|
||||
{
|
||||
LocalLogInfo logging;
|
||||
|
||||
bool disableAll {};
|
||||
|
||||
bool forceConsoleWindow {};
|
||||
bool forceToolKitWindow {};
|
||||
|
||||
bool attemptDarkTheme {true};
|
||||
|
||||
AuString supportPublic {"https://jira.reece.sx"};
|
||||
AuString supportInternal {"https://jira.reece.sx"};
|
||||
};
|
||||
|
||||
struct CryptoConfig
|
||||
{
|
||||
bool allowChineseCerts {false};
|
||||
|
||||
bool allowRussianCerts {true};
|
||||
|
||||
bool allowHTTPRetrievalOfCerts {true};
|
||||
bool enablePinning {true};
|
||||
AuList<AuString> blacklistedCerts{};
|
||||
AuList<AuString> whitelistedCerts{};
|
||||
};
|
||||
|
||||
struct RuntimeStartInfo
|
||||
{
|
||||
ConsoleConfig console;
|
||||
CryptoConfig crypto;
|
||||
TelemetryConfig telemetry;
|
||||
};
|
||||
|
||||
AUKN_SYM void RuntimeStart(const RuntimeStartInfo &info);
|
||||
AUKN_SYM void RuntimeShutdown();
|
||||
|
||||
AUKN_SYM void RuntimeSysPump();
|
||||
}
|
168
Include/Aurora/Telemetry/BlackBox.hpp
Normal file
168
Include/Aurora/Telemetry/BlackBox.hpp
Normal file
@ -0,0 +1,168 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: BlackBox.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Telemetry
|
||||
{
|
||||
enum class ENewBlackBoxEntry
|
||||
{
|
||||
eSpecsMetadata,
|
||||
eMessage,
|
||||
eStackWarning,
|
||||
eWinCxxException,
|
||||
eAccessViolation,
|
||||
eAssertion,
|
||||
ePanic,
|
||||
eLog,
|
||||
eScreenshot,
|
||||
eMinidump,
|
||||
eAnnounceMap,
|
||||
eAnnounceThreadName,
|
||||
eAnnounceApplication,
|
||||
eAnnounceSymbols
|
||||
};
|
||||
|
||||
struct NewBlockboxEntryMessage
|
||||
{
|
||||
AuUInt address;
|
||||
AuUInt32 category;
|
||||
AuString message;
|
||||
AuUInt32 threadId;
|
||||
};
|
||||
|
||||
struct NewBlockBoxEntryStackReport
|
||||
{
|
||||
Debug::StackTrace backtrace;
|
||||
};
|
||||
|
||||
struct NewBlackboxEntryUpdateMapEntry
|
||||
{
|
||||
AuUInt base;
|
||||
AuUInt size;
|
||||
char perms[6];
|
||||
AuString module;
|
||||
};
|
||||
|
||||
struct NewBlackboxEntryUpdateMap
|
||||
{
|
||||
Aurora::Process::Segments map;
|
||||
};
|
||||
|
||||
enum class ENewBlackBoxAccessViolation
|
||||
{
|
||||
eUnknown,
|
||||
eNXViolation,
|
||||
eWriteViolation,
|
||||
eMissingPage
|
||||
};
|
||||
|
||||
struct NewBlockBoxEntryMemoryViolation
|
||||
{
|
||||
AuUInt address;
|
||||
AuUInt code;
|
||||
ENewBlackBoxAccessViolation type;
|
||||
NewBlockBoxEntryStackReport stack;
|
||||
};
|
||||
|
||||
struct NewBlockBoxEntryWin32CxxException
|
||||
{
|
||||
NewBlockBoxEntryStackReport stack;
|
||||
AuString str;
|
||||
};
|
||||
|
||||
struct NewBlockboxEntryBasicMessage
|
||||
{
|
||||
Console::ConsoleMessage message;
|
||||
};
|
||||
|
||||
enum class ENewBlackBoxResourceType
|
||||
{
|
||||
eLocal,
|
||||
eResource
|
||||
};
|
||||
|
||||
struct NewBlackBoxResource
|
||||
{
|
||||
ENewBlackBoxResourceType type;
|
||||
|
||||
AuString path;
|
||||
int resourceId;
|
||||
};
|
||||
|
||||
struct NewBlackBoxEntryScreenshot
|
||||
{
|
||||
NewBlackBoxResource resource;
|
||||
};
|
||||
|
||||
enum class MinidumpType
|
||||
{
|
||||
eMSVC,
|
||||
eBreakpadMSVC,
|
||||
eBrokenElfRamDump,
|
||||
eMagicalMinidump,
|
||||
eExternalEcosystemTransaction
|
||||
};
|
||||
|
||||
struct NewBlackBoxEntryMinidump
|
||||
{
|
||||
MinidumpType type;
|
||||
bool includesRx;
|
||||
Aurora::Build::EPlatform platform;
|
||||
NewBlackBoxResource resource;
|
||||
};
|
||||
|
||||
struct NewBlockboxEntryReportSpecs
|
||||
{
|
||||
Aurora::Build::EPlatform platform;
|
||||
Aurora::Build::ECompiler compiler;
|
||||
Aurora::Build::EABI abi;
|
||||
|
||||
Aurora::HWInfo::CpuInfo cpuInfo;
|
||||
|
||||
AuUInt16 ramMb;
|
||||
AuUInt16 remainingMb;
|
||||
AuUInt16 pageSize;
|
||||
};
|
||||
|
||||
struct NewBlackBoxEntryReportApplication
|
||||
{
|
||||
AuUInt16 applicationServiceNumber;
|
||||
AuString applicationExecutableName;
|
||||
AuString applicationPath;
|
||||
|
||||
AuString locality;
|
||||
};
|
||||
|
||||
struct NewBlackBoxEntryMapThread
|
||||
{
|
||||
AuUInt64 id;
|
||||
AuUInt64 name;
|
||||
};
|
||||
|
||||
struct NewBlockboxEntry
|
||||
{
|
||||
ENewBlackBoxEntry type;
|
||||
NewBlackBoxEntryReportApplication process;
|
||||
NewBlockboxEntryReportSpecs specs;
|
||||
NewBlockboxEntryMessage message;
|
||||
NewBlockboxEntryMessage assertion;
|
||||
NewBlockBoxEntryStackReport stack;
|
||||
NewBlockBoxEntryWin32CxxException wincxx;
|
||||
NewBlockboxEntryBasicMessage log;
|
||||
NewBlockboxEntryBasicMessage panic;
|
||||
NewBlockBoxEntryMemoryViolation violation;
|
||||
NewBlackBoxEntryMinidump minidump;
|
||||
NewBlackboxEntryUpdateMap map;
|
||||
};
|
||||
|
||||
using StreamWriter = std::function<void(AuUInt8 stream, const AuUInt8 *buffer, AuUInt32 length)>;
|
||||
using StreamReader = std::function<void(AuUInt8 stream, AuUInt8 *buffer, AuUInt32 &length)>;
|
||||
|
||||
AUKN_SYM AuList<NewBlockboxEntry> ReadBlackboxStream(const StreamReader &reader);
|
||||
AUKN_SYM void WriteBlackboxStream(const AuList<NewBlockboxEntry> &, StreamWriter writer);
|
||||
}
|
15
Include/Aurora/Telemetry/Telemetery.hpp
Normal file
15
Include/Aurora/Telemetry/Telemetery.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Telemetery.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "BlackBox.hpp"
|
||||
|
||||
namespace Aurora::Telemetry
|
||||
{
|
||||
AUKN_SYM void Mayday();
|
||||
}
|
29
Include/Aurora/Threading/IWaitable.hpp
Normal file
29
Include/Aurora/Threading/IWaitable.hpp
Normal file
@ -0,0 +1,29 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: IWaitable.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading
|
||||
{
|
||||
/**
|
||||
IWaitable represents a generic waitable primitive <br>
|
||||
There is no guarantee of any specific underlying primitive or backing by the operating system directly <br>
|
||||
*All* methods **must** be supported on all platforms. If they don't, think harder! <br>
|
||||
Implementable on: NX, Win32 via CVs, and others via pthreads <br>
|
||||
Zero timeout = infinity <br>
|
||||
*/
|
||||
class IWaitable
|
||||
{
|
||||
public:
|
||||
virtual bool HasOSHandle(AuMach &mach) = 0;
|
||||
virtual bool HasLockImplementation() = 0;
|
||||
virtual void Lock() = 0;
|
||||
virtual bool Lock(AuUInt64 timeout /*=0*/) = 0;
|
||||
virtual bool TryLock() = 0;
|
||||
virtual void Unlock() = 0;
|
||||
};
|
||||
}
|
31
Include/Aurora/Threading/LockGuard.hpp
Normal file
31
Include/Aurora/Threading/LockGuard.hpp
Normal file
@ -0,0 +1,31 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: LockGuard.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading
|
||||
{
|
||||
template<typename T>
|
||||
class LockGuard
|
||||
{
|
||||
public:
|
||||
LockGuard(Aurora::Memory::MemRef<T> lock) : lockReference_(lock)
|
||||
{
|
||||
lockReference_->Lock();
|
||||
}
|
||||
|
||||
~LockGuard()
|
||||
{
|
||||
lockReference_->Unlock();
|
||||
}
|
||||
|
||||
private:
|
||||
Aurora::Memory::MemRef<T> lockReference_;
|
||||
};
|
||||
|
||||
using WaitableLockGuard = LockGuard<IWaitable>;
|
||||
}
|
29
Include/Aurora/Threading/LockGuardPtr.hpp
Normal file
29
Include/Aurora/Threading/LockGuardPtr.hpp
Normal file
@ -0,0 +1,29 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: LockGuardPtr.hpp
|
||||
Date: 2021-6-10
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading
|
||||
{
|
||||
template<typename T>
|
||||
class LockGuardPtr
|
||||
{
|
||||
public:
|
||||
LockGuardPtr(T *lock) : lockReference_(lock)
|
||||
{
|
||||
lockReference_->Lock();
|
||||
}
|
||||
|
||||
~LockGuardPtr()
|
||||
{
|
||||
lockReference_->Unlock();
|
||||
}
|
||||
|
||||
private:
|
||||
T *lockReference_;
|
||||
};
|
||||
}
|
28
Include/Aurora/Threading/Primitives/ConditionEx.hpp
Normal file
28
Include/Aurora/Threading/Primitives/ConditionEx.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ConditionalEx.hpp
|
||||
Date: 2021-6-11
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
/**
|
||||
A comprehensive CV that does not strictly abide by typical assumptions. <br>
|
||||
This object is not optimal; however, it will work with any or no IWaitable <br>
|
||||
On systems where context switches are expensive, this object should be avoided at all costs <br>
|
||||
This object depends on the synchronization of primitives within our abstraction layer rather than the OS's implementation of condition variables <br>
|
||||
*/
|
||||
class ConditionEx
|
||||
{
|
||||
public:
|
||||
virtual void WaitForSignal() = 0;
|
||||
virtual void WaitForSignal(Aurora::Threading::IWaitable *waitable) = 0;
|
||||
virtual void Broadcast() = 0;
|
||||
virtual void Signal() = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(FeaturefulCondition, ConditionEx);
|
||||
}
|
27
Include/Aurora/Threading/Primitives/ConditionMutex.hpp
Normal file
27
Include/Aurora/Threading/Primitives/ConditionMutex.hpp
Normal file
@ -0,0 +1,27 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ConditionMutex.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
/**
|
||||
An extremely basic mutex primitive. <br>
|
||||
This should be used with the traditional CV idiom of lock(), while(cond) { cv.wait() }, unlock() . <br>
|
||||
For other use cases, you should use the alternative mutex. <br>
|
||||
Note the usage of *should*; you could use this as a replacement to the standard mutex should there be no<br>
|
||||
desire of the IWaitable interface.
|
||||
*/
|
||||
class IConditionMutex
|
||||
{
|
||||
public:
|
||||
virtual void Lock() = 0;
|
||||
virtual void Unlock() = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(ConditionMutex, IConditionMutex);
|
||||
}
|
29
Include/Aurora/Threading/Primitives/ConditionVariable.hpp
Normal file
29
Include/Aurora/Threading/Primitives/ConditionVariable.hpp
Normal file
@ -0,0 +1,29 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: ConditionVariable.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
/**
|
||||
A standard conditional variable tied to IConditionalMutex <br>
|
||||
Multiple conditionals may use a common IConditionalMutex. <br>
|
||||
Unlike the POSIX standard, <br>
|
||||
1) we define no waitable as illegal <br>
|
||||
2) conditional variables may not rebind their mutex
|
||||
*/
|
||||
class IConditionVariable
|
||||
{
|
||||
public:
|
||||
virtual IConditionMutex* GetMutex() = 0;
|
||||
virtual bool WaitForSignal(AuUInt32 timeout = 0) = 0;
|
||||
virtual void Broadcast() = 0;
|
||||
virtual void Signal() = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(ConditionVariable, IConditionVariable, IConditionMutex *);
|
||||
}
|
13
Include/Aurora/Threading/Primitives/CriticalSection.hpp
Normal file
13
Include/Aurora/Threading/Primitives/CriticalSection.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: CriticalSection.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
AUKN_SHARED_API(CriticalSection, IWaitable);
|
||||
}
|
38
Include/Aurora/Threading/Primitives/Event.hpp
Normal file
38
Include/Aurora/Threading/Primitives/Event.hpp
Normal file
@ -0,0 +1,38 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Event.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
/**
|
||||
Event synchronization primitive
|
||||
*/
|
||||
class IEvent : public IWaitable
|
||||
{
|
||||
public:
|
||||
// Unlike the other types, unlock is always a nop. It makes sense for the schedular or any other caller to not automatically reset an event, contrary to `::Lock(); work; ::Unlock();`
|
||||
// Ordinarily, we would expect the thread responsible for dispatching work to Unlock, and the caller Reset, at least in principle. This, however, does not account for reusability.
|
||||
// It makes sense to implement reset-on-worker-acknowledge, permit-multiple-triggers (a kind of countless semaphores), and any combination thereof
|
||||
// Besides from atomicRelease, Reset and Set is on your watch.
|
||||
|
||||
inline void Wait()
|
||||
{
|
||||
Lock();
|
||||
}
|
||||
|
||||
inline void Wait(AuUInt32 ms)
|
||||
{
|
||||
Lock(ms);
|
||||
}
|
||||
|
||||
virtual void Reset() = 0;
|
||||
virtual void Set() = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(Event, IEvent, bool triggerd, bool atomicRelease, bool permitMultipleTriggers = false);
|
||||
}
|
13
Include/Aurora/Threading/Primitives/Mutex.hpp
Normal file
13
Include/Aurora/Threading/Primitives/Mutex.hpp
Normal file
@ -0,0 +1,13 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Mutex.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
AUKN_SHARED_API(Mutex, IWaitable);
|
||||
}
|
19
Include/Aurora/Threading/Primitives/Primitives.hpp
Normal file
19
Include/Aurora/Threading/Primitives/Primitives.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Primitives.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
#include "ConditionMutex.hpp"
|
||||
#include "ConditionVariable.hpp"
|
||||
|
||||
#include "Mutex.hpp"
|
||||
#include "Event.hpp"
|
||||
#include "Semaphore.hpp"
|
||||
#include "RWLock.hpp"
|
||||
#include "SpinLock.hpp"
|
||||
#include "CriticalSection.hpp"
|
||||
#include "ConditionEx.hpp"
|
20
Include/Aurora/Threading/Primitives/RWLock.hpp
Normal file
20
Include/Aurora/Threading/Primitives/RWLock.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: RWLock.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
class RWLock
|
||||
{
|
||||
public:
|
||||
virtual IWaitable *AsReadable() = 0;
|
||||
virtual IWaitable *AsWritable() = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(RWLock, RWLock);
|
||||
}
|
19
Include/Aurora/Threading/Primitives/Semaphore.hpp
Normal file
19
Include/Aurora/Threading/Primitives/Semaphore.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
/***
|
||||
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: Semaphore.hpp
|
||||
Date: 2021-6-9
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::Threading::Primitives
|
||||
{
|
||||
class ISemaphore : public IWaitable
|
||||
{
|
||||
public:
|
||||
virtual void Unlock(long count) = 0;
|
||||
};
|
||||
|
||||
AUKN_SHARED_API(Semaphore, ISemaphore, int initialCount = 0);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user