Skip to content

Commit 68710de

Browse files
committed
refactor: remove enum use variant as type for ISystem
Signed-off-by: Michael Pollind <mpollind@gmail.com>
1 parent e11cbe8 commit 68710de

File tree

2 files changed

+30
-39
lines changed

2 files changed

+30
-39
lines changed

include/nbl/system/ISystem.h

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@
77
#include "nbl/core/declarations.h"
88
#include "nbl/core/util/bitflag.h"
99

10-
#include <variant>
11-
1210
#include "nbl/system/ICancellableAsyncQueueDispatcher.h"
1311
#include "nbl/system/IFileArchive.h"
1412

13+
#include <variant>
1514

1615
namespace nbl::system
1716
{
@@ -26,31 +25,22 @@ class NBL_API2 ISystem : public core::IReferenceCounted
2625
protected:
2726
class ICaller;
2827
private:
29-
// add more request types if needed
30-
enum E_REQUEST_TYPE
31-
{
32-
ERT_CREATE_FILE,
33-
ERT_READ,
34-
ERT_WRITE
35-
};
36-
template <E_REQUEST_TYPE RT>
37-
struct SRequestParamsBase
28+
struct SRequestParams_NOOP
3829
{
39-
static inline constexpr E_REQUEST_TYPE type = RT;
4030
};
41-
struct SRequestParams_CREATE_FILE : SRequestParamsBase<ERT_CREATE_FILE>
31+
struct SRequestParams_CREATE_FILE
4232
{
4333
char filename[MAX_FILENAME_LENGTH] {};
4434
IFileBase::E_CREATE_FLAGS flags;
4535
};
46-
struct SRequestParams_READ : SRequestParamsBase<ERT_READ>
36+
struct SRequestParams_READ
4737
{
4838
ISystemFile* file;
4939
void* buffer;
5040
size_t offset;
5141
size_t size;
5242
};
53-
struct SRequestParams_WRITE : SRequestParamsBase<ERT_WRITE>
43+
struct SRequestParams_WRITE
5444
{
5545
ISystemFile* file;
5646
const void* buffer;
@@ -59,12 +49,12 @@ class NBL_API2 ISystem : public core::IReferenceCounted
5949
};
6050
struct SRequestType : impl::ICancellableAsyncQueueDispatcherBase::request_base_t
6151
{
62-
E_REQUEST_TYPE type;
6352
std::variant<
53+
SRequestParams_NOOP,
6454
SRequestParams_CREATE_FILE,
6555
SRequestParams_READ,
6656
SRequestParams_WRITE
67-
> params;
57+
> params = SRequestParams_NOOP();
6858
};
6959
static inline constexpr uint32_t CircularBufferSize = 256u;
7060
class CAsyncQueue : public ICancellableAsyncQueueDispatcher<CAsyncQueue,SRequestType,CircularBufferSize>
@@ -78,7 +68,6 @@ class NBL_API2 ISystem : public core::IReferenceCounted
7868
template <typename FutureType, typename RequestParams>
7969
void request_impl(SRequestType& req, FutureType& future, RequestParams&& params)
8070
{
81-
req.type = params.type;
8271
req.params = std::move(params);
8372
base_t::associate_request_with_future(req, future);
8473
}
@@ -88,6 +77,10 @@ class NBL_API2 ISystem : public core::IReferenceCounted
8877
void init() {}
8978

9079
private:
80+
void handle_request(SRequestType& req, SRequestParams_NOOP& param);
81+
void handle_request(SRequestType& req, SRequestParams_CREATE_FILE& param);
82+
void handle_request(SRequestType& req, SRequestParams_READ& param);
83+
void handle_request(SRequestType& req, SRequestParams_WRITE& param);
9184
core::smart_refctd_ptr<ICaller> m_caller;
9285
};
9386
friend class ISystemFile;

src/nbl/system/ISystem.cpp

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -308,27 +308,25 @@ ISystem::FoundArchiveFile ISystem::findFileInArchive(const system::path& absolut
308308

309309
void ISystem::CAsyncQueue::process_request(SRequestType& req)
310310
{
311-
switch (req.type)
312-
{
313-
case ERT_CREATE_FILE:
314-
{
315-
auto& p = std::get<SRequestParams_CREATE_FILE>(req.params);
316-
base_t::notify_future<core::smart_refctd_ptr<IFile>>(req,m_caller->createFile(p.filename,p.flags));
317-
}
318-
break;
319-
case ERT_READ:
320-
{
321-
auto& p = std::get<SRequestParams_READ>(req.params);
322-
base_t::notify_future<size_t>(req,p.file->asyncRead(p.buffer, p.offset, p.size));
323-
}
324-
break;
325-
case ERT_WRITE:
326-
{
327-
auto& p = std::get<SRequestParams_WRITE>(req.params);
328-
base_t::notify_future<size_t>(req,p.file->asyncWrite(p.buffer, p.offset, p.size));
329-
}
330-
break;
331-
}
311+
std::visit([&](auto& visitor) {
312+
handle_request(req, visitor);
313+
}, req.params);
314+
}
315+
316+
void ISystem::CAsyncQueue::handle_request(SRequestType& req, SRequestParams_NOOP& param) {
317+
assert(false); // should never be called
318+
}
319+
320+
void ISystem::CAsyncQueue::handle_request(SRequestType& req, SRequestParams_CREATE_FILE& param) {
321+
base_t::notify_future<core::smart_refctd_ptr<IFile>>(req, m_caller->createFile(param.filename, param.flags));
322+
}
323+
324+
void ISystem::CAsyncQueue::handle_request(SRequestType& req, SRequestParams_READ& param) {
325+
base_t::notify_future<size_t>(req, param.file->asyncRead(param.buffer, param.offset, param.size));
326+
}
327+
328+
void ISystem::CAsyncQueue::handle_request(SRequestType& req, SRequestParams_WRITE& param) {
329+
base_t::notify_future<size_t>(req, param.file->asyncWrite(param.buffer, param.offset, param.size));
332330
}
333331

334332
bool ISystem::ICaller::invalidateMapping(IFile* file, size_t offset, size_t size)

0 commit comments

Comments
 (0)