annotate win64-msvc/include/kj/async-prelude.h @ 146:206f0eb279b8

Remove "other" Vamp SDK repo from sv-dependency-builds
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 06 Mar 2017 13:29:58 +0000
parents 42a73082be24
children 0f2d93caa50c
rev   line source
cannam@132 1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
cannam@132 2 // Licensed under the MIT License:
cannam@132 3 //
cannam@132 4 // Permission is hereby granted, free of charge, to any person obtaining a copy
cannam@132 5 // of this software and associated documentation files (the "Software"), to deal
cannam@132 6 // in the Software without restriction, including without limitation the rights
cannam@132 7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
cannam@132 8 // copies of the Software, and to permit persons to whom the Software is
cannam@132 9 // furnished to do so, subject to the following conditions:
cannam@132 10 //
cannam@132 11 // The above copyright notice and this permission notice shall be included in
cannam@132 12 // all copies or substantial portions of the Software.
cannam@132 13 //
cannam@132 14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
cannam@132 15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
cannam@132 16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
cannam@132 17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
cannam@132 18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
cannam@132 19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
cannam@132 20 // THE SOFTWARE.
cannam@132 21
cannam@132 22 // This file contains a bunch of internal declarations that must appear before async.h can start.
cannam@132 23 // We don't define these directly in async.h because it makes the file hard to read.
cannam@132 24
cannam@132 25 #ifndef KJ_ASYNC_PRELUDE_H_
cannam@132 26 #define KJ_ASYNC_PRELUDE_H_
cannam@132 27
cannam@132 28 #if defined(__GNUC__) && !KJ_HEADER_WARNINGS
cannam@132 29 #pragma GCC system_header
cannam@132 30 #endif
cannam@132 31
cannam@132 32 #include "exception.h"
cannam@132 33 #include "tuple.h"
cannam@132 34
cannam@132 35 namespace kj {
cannam@132 36
cannam@132 37 class EventLoop;
cannam@132 38 template <typename T>
cannam@132 39 class Promise;
cannam@132 40 class WaitScope;
cannam@132 41
cannam@132 42 template <typename T>
cannam@132 43 Promise<Array<T>> joinPromises(Array<Promise<T>>&& promises);
cannam@132 44 Promise<void> joinPromises(Array<Promise<void>>&& promises);
cannam@132 45
cannam@132 46 namespace _ { // private
cannam@132 47
cannam@132 48 template <typename T> struct JoinPromises_ { typedef T Type; };
cannam@132 49 template <typename T> struct JoinPromises_<Promise<T>> { typedef T Type; };
cannam@132 50
cannam@132 51 template <typename T>
cannam@132 52 using JoinPromises = typename JoinPromises_<T>::Type;
cannam@132 53 // If T is Promise<U>, resolves to U, otherwise resolves to T.
cannam@132 54 //
cannam@132 55 // TODO(cleanup): Rename to avoid confusion with joinPromises() call which is completely
cannam@132 56 // unrelated.
cannam@132 57
cannam@132 58 class PropagateException {
cannam@132 59 // A functor which accepts a kj::Exception as a parameter and returns a broken promise of
cannam@132 60 // arbitrary type which simply propagates the exception.
cannam@132 61 public:
cannam@132 62 class Bottom {
cannam@132 63 public:
cannam@132 64 Bottom(Exception&& exception): exception(kj::mv(exception)) {}
cannam@132 65
cannam@132 66 Exception asException() { return kj::mv(exception); }
cannam@132 67
cannam@132 68 private:
cannam@132 69 Exception exception;
cannam@132 70 };
cannam@132 71
cannam@132 72 Bottom operator()(Exception&& e) {
cannam@132 73 return Bottom(kj::mv(e));
cannam@132 74 }
cannam@132 75 Bottom operator()(const Exception& e) {
cannam@132 76 return Bottom(kj::cp(e));
cannam@132 77 }
cannam@132 78 };
cannam@132 79
cannam@132 80 template <typename Func, typename T>
cannam@132 81 struct ReturnType_ { typedef decltype(instance<Func>()(instance<T>())) Type; };
cannam@132 82 template <typename Func>
cannam@132 83 struct ReturnType_<Func, void> { typedef decltype(instance<Func>()()) Type; };
cannam@132 84
cannam@132 85 template <typename Func, typename T>
cannam@132 86 using ReturnType = typename ReturnType_<Func, T>::Type;
cannam@132 87 // The return type of functor Func given a parameter of type T, with the special exception that if
cannam@132 88 // T is void, this is the return type of Func called with no arguments.
cannam@132 89
cannam@132 90 template <typename T> struct SplitTuplePromise_ { typedef Promise<T> Type; };
cannam@132 91 template <typename... T>
cannam@132 92 struct SplitTuplePromise_<kj::_::Tuple<T...>> {
cannam@132 93 typedef kj::Tuple<Promise<JoinPromises<T>>...> Type;
cannam@132 94 };
cannam@132 95
cannam@132 96 template <typename T>
cannam@132 97 using SplitTuplePromise = typename SplitTuplePromise_<T>::Type;
cannam@132 98 // T -> Promise<T>
cannam@132 99 // Tuple<T> -> Tuple<Promise<T>>
cannam@132 100
cannam@132 101 struct Void {};
cannam@132 102 // Application code should NOT refer to this! See `kj::READY_NOW` instead.
cannam@132 103
cannam@132 104 template <typename T> struct FixVoid_ { typedef T Type; };
cannam@132 105 template <> struct FixVoid_<void> { typedef Void Type; };
cannam@132 106 template <typename T> using FixVoid = typename FixVoid_<T>::Type;
cannam@132 107 // FixVoid<T> is just T unless T is void in which case it is _::Void (an empty struct).
cannam@132 108
cannam@132 109 template <typename T> struct UnfixVoid_ { typedef T Type; };
cannam@132 110 template <> struct UnfixVoid_<Void> { typedef void Type; };
cannam@132 111 template <typename T> using UnfixVoid = typename UnfixVoid_<T>::Type;
cannam@132 112 // UnfixVoid is the opposite of FixVoid.
cannam@132 113
cannam@132 114 template <typename In, typename Out>
cannam@132 115 struct MaybeVoidCaller {
cannam@132 116 // Calls the function converting a Void input to an empty parameter list and a void return
cannam@132 117 // value to a Void output.
cannam@132 118
cannam@132 119 template <typename Func>
cannam@132 120 static inline Out apply(Func& func, In&& in) {
cannam@132 121 return func(kj::mv(in));
cannam@132 122 }
cannam@132 123 };
cannam@132 124 template <typename In, typename Out>
cannam@132 125 struct MaybeVoidCaller<In&, Out> {
cannam@132 126 template <typename Func>
cannam@132 127 static inline Out apply(Func& func, In& in) {
cannam@132 128 return func(in);
cannam@132 129 }
cannam@132 130 };
cannam@132 131 template <typename Out>
cannam@132 132 struct MaybeVoidCaller<Void, Out> {
cannam@132 133 template <typename Func>
cannam@132 134 static inline Out apply(Func& func, Void&& in) {
cannam@132 135 return func();
cannam@132 136 }
cannam@132 137 };
cannam@132 138 template <typename In>
cannam@132 139 struct MaybeVoidCaller<In, Void> {
cannam@132 140 template <typename Func>
cannam@132 141 static inline Void apply(Func& func, In&& in) {
cannam@132 142 func(kj::mv(in));
cannam@132 143 return Void();
cannam@132 144 }
cannam@132 145 };
cannam@132 146 template <typename In>
cannam@132 147 struct MaybeVoidCaller<In&, Void> {
cannam@132 148 template <typename Func>
cannam@132 149 static inline Void apply(Func& func, In& in) {
cannam@132 150 func(in);
cannam@132 151 return Void();
cannam@132 152 }
cannam@132 153 };
cannam@132 154 template <>
cannam@132 155 struct MaybeVoidCaller<Void, Void> {
cannam@132 156 template <typename Func>
cannam@132 157 static inline Void apply(Func& func, Void&& in) {
cannam@132 158 func();
cannam@132 159 return Void();
cannam@132 160 }
cannam@132 161 };
cannam@132 162
cannam@132 163 template <typename T>
cannam@132 164 inline T&& returnMaybeVoid(T&& t) {
cannam@132 165 return kj::fwd<T>(t);
cannam@132 166 }
cannam@132 167 inline void returnMaybeVoid(Void&& v) {}
cannam@132 168
cannam@132 169 class ExceptionOrValue;
cannam@132 170 class PromiseNode;
cannam@132 171 class ChainPromiseNode;
cannam@132 172 template <typename T>
cannam@132 173 class ForkHub;
cannam@132 174
cannam@132 175 class TaskSetImpl;
cannam@132 176
cannam@132 177 class Event;
cannam@132 178
cannam@132 179 class PromiseBase {
cannam@132 180 public:
cannam@132 181 kj::String trace();
cannam@132 182 // Dump debug info about this promise.
cannam@132 183
cannam@132 184 private:
cannam@132 185 Own<PromiseNode> node;
cannam@132 186
cannam@132 187 PromiseBase() = default;
cannam@132 188 PromiseBase(Own<PromiseNode>&& node): node(kj::mv(node)) {}
cannam@132 189
cannam@132 190 friend class kj::EventLoop;
cannam@132 191 friend class ChainPromiseNode;
cannam@132 192 template <typename>
cannam@132 193 friend class kj::Promise;
cannam@132 194 friend class TaskSetImpl;
cannam@132 195 template <typename U>
cannam@132 196 friend Promise<Array<U>> kj::joinPromises(Array<Promise<U>>&& promises);
cannam@132 197 friend Promise<void> kj::joinPromises(Array<Promise<void>>&& promises);
cannam@132 198 };
cannam@132 199
cannam@132 200 void detach(kj::Promise<void>&& promise);
cannam@132 201 void waitImpl(Own<_::PromiseNode>&& node, _::ExceptionOrValue& result, WaitScope& waitScope);
cannam@132 202 Promise<void> yield();
cannam@132 203 Own<PromiseNode> neverDone();
cannam@132 204
cannam@132 205 class NeverDone {
cannam@132 206 public:
cannam@132 207 template <typename T>
cannam@132 208 operator Promise<T>() const {
cannam@132 209 return Promise<T>(false, neverDone());
cannam@132 210 }
cannam@132 211
cannam@132 212 KJ_NORETURN(void wait(WaitScope& waitScope) const);
cannam@132 213 };
cannam@132 214
cannam@132 215 } // namespace _ (private)
cannam@132 216 } // namespace kj
cannam@132 217
cannam@132 218 #endif // KJ_ASYNC_PRELUDE_H_