-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFlattenTuple.h
More file actions
75 lines (62 loc) · 1.99 KB
/
FlattenTuple.h
File metadata and controls
75 lines (62 loc) · 1.99 KB
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
//
// Created by Dmitrii on 21.11.2017.
//
#ifndef PROMISE_FUTURE_TUPLE_H
#define PROMISE_FUTURE_TUPLE_H
#include "Future.h"
#include "Promise.h"
#include <tuple>
template<typename T, typename Q = void>
struct nested_type_promise;
template<typename T>
struct nested_type_promise<T> {
typedef T t_t;
};
template<typename T>
struct nested_type_promise<Future<T>> {
typedef typename nested_type_promise<T>::t_t t_t;
};
template<typename ...Args>
struct nested_type_promise<std::tuple<Args...>> {
typedef std::tuple<typename nested_type_promise<Args>::t_t...> t_t;
};
template<typename T>
T flatten_impl(const Future<T> &fut) {
return std::move(fut.get());
}
/*
template<template<typename, typename...> typename C, typename T>
struct nested_type_promise<C<Future<T>>> {
typedef C<T> t_t;
};
template<template<typename, typename...> typename C, typename T>
auto flatten_impl(C<Future<T>> const &fut_col) {
C<T> out;
for(auto it = fut_col.begin(); it != fut_col.end();it++) {
out.insert(out.end(), std::move(*it.get()));
}
return out;
}*/
template<typename T>
auto flatten_impl(const Future<Future<T>> &fut) {
return std::move(flatten_impl(std::move(fut.get())));
}
template<typename T>
auto flatten_impl(T e) {
return e;
}
template<typename ...Args, std::size_t... I>
auto flatten_impl_tuple(const std::tuple<Args...> &tup, std::index_sequence<I...>) {
return std::make_tuple(flatten_impl(std::get<I>(tup))...);
}
template<typename ...TParam, typename Indices = std::make_index_sequence<sizeof...(TParam)>>
auto flattenTuple(std::tuple<TParam...> tuple) {
using name = typename nested_type_promise<std::tuple<TParam...>>::t_t;
std::shared_ptr<Promise<name>> ptr(new Promise<name>);
std::thread([ptr, &tuple]() {
auto temp = flatten_impl_tuple(tuple, Indices{});
ptr->set(temp);
}).detach();
return std::move(ptr->getFuture());
}
#endif //PROMISE_FUTURE_TUPLE_H