@@ -162,15 +162,16 @@ class DomainBase
162162 // /////////////////////////////////////////////////////////////////////////////////////////////////
163163 template
164164 <
165- typename F,
166- typename ... TArgs
165+ typename FIn,
166+ typename ... TArgs,
167+ typename F = std::decay<FIn>::type,
168+ typename S = std::result_of<F(TArgs...)>::type,
169+ typename TOp = REACT_IMPL::FunctionOp<S,F,REACT_IMPL::SignalNodePtr<D,TArgs> ...>
167170 >
168- static auto MakeSignal (F && func, const SignalT<TArgs>& ... args)
169- -> SignalT<typename std::result_of<F(TArgs...)>::type >
171+ static auto MakeSignal (FIn && func, const SignalT<TArgs>& ... args)
172+ -> TempSignal<D,S,TOp >
170173 {
171- using S = typename std::result_of<F (TArgs...)>::type;
172-
173- return REACT::MakeSignal<D>(std::forward<F>(func), args ...);
174+ return REACT::MakeSignal<D>(std::forward<FIn>(func), args ...);
174175 }
175176
176177 // /////////////////////////////////////////////////////////////////////////////////////////////////
@@ -195,7 +196,7 @@ class DomainBase
195196 template <typename F>
196197 static void DoTransaction (F&& func)
197198 {
198- DoTransaction (turnFlags_ , std::forward<F>(func));
199+ DoTransaction (0 , std::forward<F>(func));
199200 }
200201
201202 template <typename F>
@@ -238,7 +239,7 @@ class DomainBase
238239 template <typename R, typename V>
239240 static void AddInput (R&& r, V&& v)
240241 {
241- if (! ContinuationHolder_::IsNull () )
242+ if (ContinuationHolder<D>:: Get () != nullptr )
242243 {
243244 addContinuationInput (std::forward<R>(r), std::forward<V>(v));
244245 }
@@ -252,48 +253,7 @@ class DomainBase
252253 }
253254 }
254255
255- // /////////////////////////////////////////////////////////////////////////////////////////////////
256- // / Set/Clear continuation
257- // /////////////////////////////////////////////////////////////////////////////////////////////////
258- static void SetCurrentContinuation (TurnT& turn)
259- {
260- ContinuationHolder_::Set (&turn.continuation_ );
261- }
262-
263- static void ClearCurrentContinuation ()
264- {
265- ContinuationHolder_::Reset ();
266- }
267-
268- // /////////////////////////////////////////////////////////////////////////////////////////////////
269- // / Options - TODO: This sucks
270- // /////////////////////////////////////////////////////////////////////////////////////////////////
271- template <typename Opt>
272- static void Set (uint v) { static_assert (false , " Set option not implemented." ); }
273-
274- template <typename Opt>
275- static bool IsSet (uint v) { static_assert (false , " IsSet option not implemented." ); }
276-
277- template <typename Opt>
278- static void Unset (uint v) { static_assert (false , " Unset option not implemented." ); }
279-
280- template <typename Opt>
281- static void Reset () { static_assert (false , " Reset option not implemented." ); }
282-
283- template <> static void Set<ETurnFlags>(uint v) { turnFlags_ |= v; }
284- template <> static bool IsSet<ETurnFlags>(uint v) { return (turnFlags_ & v) != 0 ; }
285- template <> static void Unset<ETurnFlags>(uint v) { turnFlags_ &= ~v; }
286- template <> static void Reset<ETurnFlags>() { turnFlags_ = 0 ; }
287-
288256private:
289-
290- // /////////////////////////////////////////////////////////////////////////////////////////////////
291- // / Transaction input continuation
292- // /////////////////////////////////////////////////////////////////////////////////////////////////
293- struct ContinuationHolder_ : public ThreadLocalStaticPtr <ContinuationInput> {};
294-
295- static __declspec (thread) TurnFlagsT turnFlags_;
296-
297257 static std::atomic<TurnIdT> nextTurnId_;
298258
299259 static TurnIdT nextTurnId ()
@@ -350,7 +310,7 @@ class DomainBase
350310 static void addContinuationInput (R&& r, V&& v)
351311 {
352312 // Copy v
353- ContinuationHolder_ ::Get ()->Add (
313+ ContinuationHolder<D> ::Get ()->Add (
354314 [&r,v] { addTransactionInput (r, std::move (v)); }
355315 );
356316 }
@@ -403,9 +363,6 @@ class DomainBase
403363template <typename D, typename TPolicy>
404364std::atomic<TurnIdT> DomainBase<D,TPolicy>::nextTurnId_( 0 );
405365
406- template <typename D, typename TPolicy>
407- TurnFlagsT DomainBase<D,TPolicy>::turnFlags_( 0 );
408-
409366template <typename D, typename TPolicy>
410367typename DomainBase<D,TPolicy>::TransactionState DomainBase<D,TPolicy>::transactionState_;
411368
@@ -426,6 +383,28 @@ class DomainInitializer
426383 }
427384};
428385
386+ // /////////////////////////////////////////////////////////////////////////////////////////////////
387+ // / ContinuationHolder
388+ // /////////////////////////////////////////////////////////////////////////////////////////////////
389+ template <typename D>
390+ class ContinuationHolder
391+ {
392+ public:
393+ using TurnT = typename D::TurnT;
394+
395+ ContinuationHolder () = delete ;
396+
397+ static void SetTurn (TurnT& turn) { ptr_ = &turn.continuation_ ; }
398+ static void Clear () { ptr_ = nullptr ; }
399+ static ContinuationInput* Get () { return ptr_; }
400+
401+ private:
402+ static __declspec (thread) ContinuationInput* ptr_;
403+ };
404+
405+ template <typename D>
406+ ContinuationInput* ContinuationHolder<D>::ptr_(nullptr );
407+
429408/* ***************************************/ REACT_IMPL_END /* **************************************/
430409
431410#define REACTIVE_DOMAIN (name, ...) \
0 commit comments