From c5d32d6eeb68618e2b388812a2692e76017e7481 Mon Sep 17 00:00:00 2001 From: Tapish Date: Mon, 15 Jul 2024 14:07:02 +0200 Subject: [PATCH] start using access pairs --- redGrapes/redGrapes.hpp | 2 +- redGrapes/resource/fieldresource.hpp | 4 +- redGrapes/resource/ioresource.hpp | 58 +++++----------------------- redGrapes/resource/resource.hpp | 31 ++++++++++----- redGrapes/task/task_builder.hpp | 34 ++++++++++++++-- 5 files changed, 65 insertions(+), 64 deletions(-) diff --git a/redGrapes/redGrapes.hpp b/redGrapes/redGrapes.hpp index 574ca651..c2206b21 100644 --- a/redGrapes/redGrapes.hpp +++ b/redGrapes/redGrapes.hpp @@ -139,7 +139,7 @@ namespace redGrapes SPDLOG_TRACE("emplace task to worker {}", worker_id); - using Impl = typename std::invoke_result_t, Callable, Args...>; + using Impl = typename std::invoke_result_t(args)))...>, Callable, decltype(detail::forward_arg(std::forward(args)))...>; // this is not set to nullptr. But it goes out of scope. Memory is managed by allocate FunTask* task; memory::Allocator alloc(worker_id); diff --git a/redGrapes/resource/fieldresource.hpp b/redGrapes/resource/fieldresource.hpp index 692c7ef1..16657f0e 100644 --- a/redGrapes/resource/fieldresource.hpp +++ b/redGrapes/resource/fieldresource.hpp @@ -181,7 +181,7 @@ namespace redGrapes operator ResourceAccess() const noexcept { - return this->make_access(access::FieldAccess(access::IOAccess::read, this->m_area)); + return this->res.make_access(access::FieldAccess(access::IOAccess::read, this->m_area)); } protected: @@ -249,7 +249,7 @@ namespace redGrapes operator ResourceAccess() const noexcept { - return this->make_access(access::FieldAccess(access::IOAccess::write, this->m_area)); + return this->res.make_access(access::FieldAccess(access::IOAccess::write, this->m_area)); } protected: diff --git a/redGrapes/resource/ioresource.hpp b/redGrapes/resource/ioresource.hpp index 4b883b18..c3267c67 100644 --- a/redGrapes/resource/ioresource.hpp +++ b/redGrapes/resource/ioresource.hpp @@ -30,12 +30,14 @@ namespace redGrapes { operator ResourceAccess() const noexcept { - return this->make_access(access::IOAccess::read); + return this->res.make_access(access::IOAccess::read); } - ReadGuard read() const noexcept + auto read() const noexcept { - return *this; + return ResourceAccessPair const>( + this->obj, + this->res.make_access(access::IOAccess::read)); } T const& operator*() const noexcept @@ -54,27 +56,7 @@ namespace redGrapes } protected: - ReadGuard(ResourceId id, std::shared_ptr const& obj) - : SharedResourceObject(id, obj) - { - } - - template - ReadGuard(ResourceId id, Args&&... args) - : SharedResourceObject(id, std::forward(args)...) - { - } - - ReadGuard(Resource< access::IOAccess> const& res, std::shared_ptr const& obj) - : SharedResourceObject(res, obj) - { - } - - template - ReadGuard(Resource< access::IOAccess> const& res, Args&&... args) - : SharedResourceObject(res, std::forward(args)...) - { - } + using SharedResourceObject::SharedResourceObject; }; template @@ -82,7 +64,7 @@ namespace redGrapes { operator ResourceAccess() const noexcept { - return this->make_access(access::IOAccess::write); + return this->res.make_access(access::IOAccess::write); } WriteGuard write() const noexcept @@ -106,25 +88,7 @@ namespace redGrapes } protected: - WriteGuard(ResourceId id, std::shared_ptr const& obj) : ReadGuard(id, obj) - { - } - - template - WriteGuard(ResourceId id, Args&&... args) : ReadGuard(id, std::forward(args)...) - { - } - - WriteGuard(Resource< access::IOAccess> const& res, std::shared_ptr const& obj) - : ReadGuard(res, obj) - { - } - - template - WriteGuard(Resource< access::IOAccess> const& res, Args&&... args) - : ReadGuard(res, std::forward(args)...) - { - } + using ReadGuard::ReadGuard; }; } // namespace ioresource @@ -132,8 +96,7 @@ namespace redGrapes template struct IOResource : public ioresource::WriteGuard { - IOResource(std::shared_ptr const& o) - : ioresource::WriteGuard(TaskFreeCtx::create_resource_uid(), o) + IOResource(std::shared_ptr const& o) : ioresource::WriteGuard(TaskFreeCtx::create_resource_uid(), o) { } @@ -147,8 +110,7 @@ namespace redGrapes } template - IOResource(IOResource const& res, std::shared_ptr const& obj) - : ioresource::WriteGuard(res, obj) + IOResource(IOResource const& res, std::shared_ptr const& obj) : ioresource::WriteGuard(res, obj) { } diff --git a/redGrapes/resource/resource.hpp b/redGrapes/resource/resource.hpp index 30f3d5c3..420f9abf 100644 --- a/redGrapes/resource/resource.hpp +++ b/redGrapes/resource/resource.hpp @@ -206,6 +206,17 @@ namespace redGrapes } }; // class ResourceAccess + template + struct ResourceAccessPair : public std::pair + { + using std::pair::pair; + + operator ResourceAccess() const + { + return this->second; + } + }; + namespace trait { @@ -352,37 +363,37 @@ namespace redGrapes }; // class Resource template - struct SharedResourceObject : Resource + struct SharedResourceObject { - // protected: - std::shared_ptr obj; - - SharedResourceObject(ResourceId id, std::shared_ptr const& obj) : Resource(id), obj(obj) + SharedResourceObject(ResourceId id, std::shared_ptr const& obj) : res{id}, obj(obj) { } template SharedResourceObject(ResourceId id, Args&&... args) - : Resource(id) + : res{id} , obj{memory::alloc_shared_bind(mapping::map_resource_to_worker(id), std::forward(args)...)} { } - SharedResourceObject(Resource const& res, std::shared_ptr const& obj) - : Resource{res} - , obj{obj} + SharedResourceObject(Resource const& res, std::shared_ptr const& obj) : res{res}, obj{obj} { } template SharedResourceObject(Resource const& res, Args&&... args) - : Resource{res} + : res{res} , obj{memory::alloc_shared_bind( mapping::map_resource_to_worker(res.resource_id()), std::forward(args)...)} { } + protected: + std::shared_ptr obj; + Resource res; + + }; // struct SharedResourceObject } // namespace redGrapes diff --git a/redGrapes/task/task_builder.hpp b/redGrapes/task/task_builder.hpp index c436eb78..eb6717b0 100644 --- a/redGrapes/task/task_builder.hpp +++ b/redGrapes/task/task_builder.hpp @@ -14,6 +14,7 @@ #include #include +#include namespace redGrapes { @@ -38,13 +39,38 @@ namespace redGrapes } }; + namespace detail + { + + // Helper function to conditionally forward the argument + template + constexpr auto forward_arg(T&& arg) + { + return std::forward(arg); + } + + template + constexpr auto forward_arg(ResourceAccessPair&& arg) + { + return std::forward(arg.first); + } + + // decltype(detail::forward_arg(std::forward(args))) + // detail::forward_arg(std::forward(args))...)); + + } // namespace detail + /* TASK BUILDER */ template struct TaskBuilder : TTask::TaskProperties::template Builder> { - using Impl = typename std::invoke_result_t, Callable, Args...>; - using Result = typename std::invoke_result_t; + using Impl = typename std::invoke_result_t< + BindArgs(std::declval())))...>, + Callable, + decltype(detail::forward_arg(std::forward(std::declval())))...>; + using Result = typename std:: + invoke_result_t(std::declval())))...>; std::shared_ptr space; FunTask* task; @@ -66,7 +92,9 @@ namespace redGrapes this->init_id(); // set impl - task->impl.emplace(BindArgs{}(std::move(f), std::forward(args)...)); + task->impl.emplace(BindArgs(args)))...>{}( + std::move(f), + detail::forward_arg(std::forward(args))...)); } TaskBuilder(TaskBuilder& other)