QuantumLibrary
quantum_future_joiner.h
1 /*
2 ** Copyright 2018 Bloomberg Finance L.P.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 ** http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16 #ifndef BLOOMBERG_QUANTUM_FUTURE_JOINER_H
17 #define BLOOMBERG_QUANTUM_FUTURE_JOINER_H
18 
19 #include <quantum/interface/quantum_ithread_context.h>
20 #include <quantum/interface/quantum_ithread_future.h>
21 #include <quantum/interface/quantum_icoro_context.h>
22 #include <quantum/interface/quantum_icoro_future.h>
23 #include <quantum/impl/quantum_stl_impl.h>
24 #include <vector>
25 #include <type_traits>
26 
27 namespace Bloomberg {
28 namespace quantum {
29 
30 //==============================================================================================
31 // class FutureJoiner
32 //==============================================================================================
38 template <typename T>
40 {
41 public:
45  template <class DISPATCHER, class = std::enable_if_t<std::is_same<typename DISPATCHER::ContextTag,ThreadContextTag>::value>>
46  ThreadFuturePtr<std::vector<T>> operator()(DISPATCHER& dispatcher, std::vector<ThreadContextPtr<T>>&& futures);
47 
48  template <class DISPATCHER, class = std::enable_if_t<std::is_same<typename DISPATCHER::ContextTag,ThreadContextTag>::value>>
49  ThreadFuturePtr<std::vector<T>> operator()(DISPATCHER& dispatcher, std::vector<ThreadFuturePtr<T>>&& futures);
50 
51  template <class DISPATCHER, class = std::enable_if_t<std::is_same<typename DISPATCHER::ContextTag,CoroContextTag>::value>>
52  CoroContextPtr<std::vector<T>> operator()(DISPATCHER& dispatcher, std::vector<CoroContextPtr<T>>&& futures);
53 
54  template <class DISPATCHER, class = std::enable_if_t<std::is_same<typename DISPATCHER::ContextTag,CoroContextTag>::value>>
55  CoroContextPtr<std::vector<T>> operator()(DISPATCHER& dispatcher, std::vector<CoroFuturePtr<T>>&& futures);
56 
57 private:
58  template <template<class> class FUTURE, class DISPATCHER>
59  ThreadFuturePtr<std::vector<T>> join(ThreadContextTag, DISPATCHER& dispatcher, std::vector<typename FUTURE<T>::Ptr>&& futures);
60 
61  template <template<class> class FUTURE, class DISPATCHER>
62  CoroContextPtr<std::vector<T>> join(CoroContextTag, DISPATCHER& dispatcher, std::vector<typename FUTURE<T>::Ptr>&& futures);
63 };
64 
65 }}
66 
67 #include <quantum/util/impl/quantum_future_joiner_impl.h>
68 
69 #endif //BLOOMBERG_QUANTUM_FUTURE_JOINER_H
Definition: quantum_buffer_impl.h:22
typename ICoroFuture< T >::Ptr CoroFuturePtr
Definition: quantum_icoro_future.h:72
ThreadFuturePtr< std::vector< T > > operator()(DISPATCHER &dispatcher, std::vector< ThreadContextPtr< T >> &&futures)
Join N thread futures.
Definition: quantum_future_joiner_impl.h:27
typename ICoroContext< RET >::Ptr CoroContextPtr
Definition: quantum_icoro_context.h:479
Utility class that joins N futures into a single one.
Definition: quantum_future_joiner.h:39
Definition: quantum_icontext_base.h:26
typename IThreadFuture< T >::Ptr ThreadFuturePtr
Definition: quantum_ithread_future.h:69
Definition: quantum_icontext_base.h:25
typename IThreadContext< RET >::Ptr ThreadContextPtr
Definition: quantum_ithread_context.h:242