File: packaged_task.qbk

package info (click to toggle)
boost1.83 1.83.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 545,632 kB
  • sloc: cpp: 3,857,086; xml: 125,552; ansic: 34,414; python: 25,887; asm: 5,276; sh: 4,799; ada: 1,681; makefile: 1,629; perl: 1,212; pascal: 1,139; sql: 810; yacc: 478; ruby: 102; lisp: 24; csh: 6
file content (192 lines) | stat: -rw-r--r-- 5,653 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
[/
          Copyright Oliver Kowalke 2013.
 Distributed under the Boost Software License, Version 1.0.
    (See accompanying file LICENSE_1_0.txt or copy at
          http://www.boost.org/LICENSE_1_0.txt
]

[#class_packaged_task]
[section:packaged_task Template `packaged_task<>`]

A __packaged_task__ wraps a callable target that returns a value so that the
return value can be computed asynchronously.

Conventional usage of `packaged_task<>` is like this:

# Instantiate `packaged_task<>` with template arguments matching the signature
  of the callable. Pass the callable to the [link packaged_task_packaged_task
  constructor].
# Call [member_link packaged_task..get_future] and capture the returned
  [template_link future] instance.
# Launch a [class_link fiber] to run the new `packaged_task<>`, passing any
  arguments required by the original callable.
# Call [member_link fiber..detach] on the newly-launched `fiber`.
# At some later point, retrieve the result from the `future<>`.

This is, in fact, pretty much what [ns_function_link fibers..async]
encapsulates.

        #include <boost/fiber/future/packaged_task.hpp>

        namespace boost {
        namespace fibers {

        template< class R, typename ... Args >
        class packaged_task< R( Args ... ) > {
        public:
            packaged_task() noexcept;

            template< typename Fn >
            explicit packaged_task( Fn &&);

            template< typename Fn, typename __Allocator__ >
            packaged_task( __allocator_arg_t__, Allocator const&, Fn &&);

            packaged_task( packaged_task &&) noexcept;

            packaged_task & operator=( packaged_task &&) noexcept;

            packaged_task( packaged_task const&) = delete;

            packaged_task & operator=( packaged_task const&) = delete;

            ~packaged_task();

            void swap( packaged_task &) noexcept;

            bool valid() const noexcept;

            future< R > get_future();

            void operator()( Args ...);

            void reset();
        };

        template< typename Signature >
        void swap( packaged_task< Signature > &, packaged_task< Signature > &) noexcept;

        }}

[heading Default constructor `packaged_task()`]

        packaged_task() noexcept;

[variablelist
[[Effects:] [Constructs an object of class `packaged_task` with no [link
shared_state shared state].]]
[[Throws:] [Nothing.]]
]

[#packaged_task_packaged_task]
[heading Templated constructor `packaged_task()`]

        template< typename Fn >
        explicit packaged_task( Fn && fn);

        template< typename Fn, typename __Allocator__ >
        packaged_task( __allocator_arg_t__, Allocator const& alloc, Fn && fn);

[variablelist
[[Effects:] [Constructs an object of class `packaged_task` with a [link
shared_state shared state] and copies or moves the callable target `fn` to
internal storage.]]
[[Throws:] [Exceptions caused by memory allocation.]]
[[Note:] [The signature of `Fn` should have a return type convertible to `R`.]]
[[See also:] [__allocator_arg_t__]]
]

[heading Move constructor]

        packaged_task( packaged_task && other) noexcept;

[variablelist
[[Effects:] [Creates a packaged_task by moving the [link shared_state shared
state] from `other`.]]
[[Postcondition:] [`other` contains no valid shared state.]]
[[Throws:] [Nothing.]]
]

[heading Destructor]

        ~packaged_task();

[variablelist
[[Effects:] [Destroys `*this` and abandons the [link shared_state shared
state] if shared state is ready; otherwise stores __future_error__ with error
condition __broken_promise__ as if by [member_link promise..set_exception]:
the shared state is set ready.]]
]

[operator_heading packaged_task..operator_assign..operator=]

        packaged_task & operator=( packaged_task && other) noexcept;

[variablelist
[[Effects:] [Transfers the ownership of [link shared_state shared state] to
`*this`.]]
[[Postcondition:] [`other` contains no valid shared state.]]
[[Throws:] [Nothing.]]
]

[member_heading packaged_task..swap]

        void swap( packaged_task & other) noexcept;

[variablelist
[[Effects:] [Swaps the [link shared_state shared state] between other and
`*this`.]]
[[Throws:] [Nothing.]]
]

[member_heading packaged_task..valid]

        bool valid() const noexcept;

[variablelist
[[Effects:] [Returns `true` if `*this` contains a [link shared_state shared
state].]]
[[Throws:] [Nothing.]]
]

[member_heading packaged_task..get_future]

        future< R > get_future();

[variablelist
[[Returns:] [A __future__ with the same [link shared_state shared state].]]
[[Throws:] [__future_error__ with __already_retrieved__ or __no_state__.]]
]

[operator_heading packaged_task..operator_apply..operator()]

        void operator()( Args && ... args);

[variablelist
[[Effects:] [Invokes the stored callable target. Any exception thrown by the
callable target `fn` is stored in the [link shared_state shared state] as if
by [member_link promise..set_exception]. Otherwise, the value returned by `fn`
is stored in the shared state as if by [member_link promise..set_value].]]
[[Throws:] [__future_error__ with __no_state__.]]
]

[member_heading packaged_task..reset]

        void reset();

[variablelist
[[Effects:] [Resets the [link shared_state shared state] and abandons the
result of previous executions. A new shared state is constructed.]]
[[Throws:] [__future_error__ with __no_state__.]]
]

[function_heading_for swap..packaged_task]

    template< typename Signature >
    void swap( packaged_task< Signature > & l, packaged_task< Signature > & r) noexcept;

[variablelist
[[Effects:] [Same as `l.swap( r)`.]]
]

[endsect]