ttg 1.0.0
Template Task Graph (TTG): flowgraph-based programming model for high-performance distributed-memory algorithms
Loading...
Searching...
No Matches
ptr.h
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2#ifndef TTG_PTR_H
3#define TTG_PTR_H
4
5#include "ttg/fwd.h"
6
7#include "ttg/util/meta.h"
8
9namespace ttg {
10
11template<typename T>
12using Ptr = TTG_IMPL_NS::Ptr<T>;
13
14template<typename T, typename... Args>
15inline Ptr<T> make_ptr(Args&&... args) {
16 return TTG_IMPL_NS::make_ptr(std::forward<Args>(args)...);
17}
18
19template<typename T>
20inline Ptr<std::decay_t<T>> get_ptr(T&& obj) {
21 return TTG_IMPL_NS::get_ptr(std::forward<T>(obj));
22}
23
24namespace meta {
25
26 /* specialize some traits */
27
28 template<typename T>
29 struct is_ptr<ttg::Ptr<T>> : std::true_type
30 { };
31
32} // namespace ptr
33
34#if 0
35namespace detail {
36
37 /* awaiter for ttg::get_ptr with multiple arguments
38 * operator co_wait will return the tuple of ttg::Ptr
39 */
40 template<typename... Ts>
41 struct get_ptr_tpl_t {
42 private:
43 std::tuple<ttg::Ptr<Ts>...> m_ptr_tuple;
44 bool m_is_ready = false;
45 public:
46 get_ptr_tpl_t(bool is_ready, std::tuple<ttg::ptr<Ts>...>&& ptrs)
47 : m_ptr_tuple(std::forward<std::tuple<ttg::Ptr<Ts>...>>(ptrs))
48 , m_is_ready(is_ready)
49 { }
50
51 bool await_ready() const noexcept {
52 return m_is_ready;
53 }
54
55 constexpr void await_suspend( std::coroutine_handle<> ) const noexcept {
56 /* TODO: anything to be done here? */
57 }
58
59 auto await_resume() const noexcept {
60 return std::move(m_ptr_tuple);
61 }
62 };
63
64
65 /* awaiter for ttg::get_ptr for a single argument */
66 template<typename T>
67 struct get_ptr_t {
68 private:
69 ttg::Ptr<T> m_ptr;
70 bool m_is_ready = false;
71 public:
72 get_ptr_t(bool is_ready, ttg::Ptr<T>&& ptr)
73 : m_ptr(std::forward<ttg::Ptr<T>>(ptr))
74 , m_is_ready(is_ready)
75 { }
76
77 bool await_ready() const noexcept {
78 return m_is_ready;
79 }
80
81 constexpr void await_suspend( std::coroutine_handle<> ) const noexcept {
82 /* TODO: anything to be done here? */
83 }
84
85 auto await_resume() const noexcept {
86 return std::move(m_ptr);
87 }
88 };
89 } // namespace detail
90
102 template<typename Arg, typename... Args>
103 auto get_ptr(Arg&& arg, Args&&... args) {
104 bool is_ready;
105 using tpl_type = std::tuple<ttg::Ptr<std::decay_t<Arg>, std::decay<Args>...>>;
106 using result_type = std::pair<bool, tpl_type>;
107 result_type p = TTG_IMPL_NS::get_ptr(std::forward<Arg>(arg), std::forward<Args>(args)...);
108 if constexpr (sizeof...(Args) > 0) {
109 return detail::get_ptr_tpl_t<std::decay_t<Arg>, std::decay_t<Args>...>(p.first, std::move(p.second));
110 } else if constexpr (sizeof...(Args) == 0) {
111 return detail::get_ptr_t<std::decay_t<Arg>>(p.first, std::move(std::get<0>(p.second)));
112 }
113 }
114#endif // 0
115} // namespace ttg
116
117#endif // TTG_PTR_H
STL namespace.
Ptr< std::decay_t< T > > get_ptr(T &&obj)
Definition ptr.h:253
Ptr< T > make_ptr(Args &&... args)
Definition ptr.h:271
top-level TTG namespace contains runtime-neutral functionality
Definition keymap.h:9
TTG_IMPL_NS::Ptr< T > Ptr
Definition ptr.h:12