bind_internal.h 106 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789
  1. // This file was GENERATED by command:
  2. // pump.py bind_internal.h.pump
  3. // DO NOT EDIT BY HAND!!!
  4. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  5. // Use of this source code is governed by a BSD-style license that can be
  6. // found in the LICENSE file.
  7. #ifndef BASE_BIND_INTERNAL_H_
  8. #define BASE_BIND_INTERNAL_H_
  9. #include "butil/bind_helpers.h"
  10. #include "butil/callback_internal.h"
  11. #include "butil/memory/raw_scoped_refptr_mismatch_checker.h"
  12. #include "butil/memory/weak_ptr.h"
  13. #include "butil/type_traits.h"
  14. #include "butil/build_config.h"
  15. #if defined(OS_WIN)
  16. #include "butil/bind_internal_win.h"
  17. #endif
  18. namespace butil {
  19. namespace internal {
  20. // See butil/callback.h for user documentation.
  21. //
  22. //
  23. // CONCEPTS:
  24. // Runnable -- A type (really a type class) that has a single Run() method
  25. // and a RunType typedef that corresponds to the type of Run().
  26. // A Runnable can declare that it should treated like a method
  27. // call by including a typedef named IsMethod. The value of
  28. // this typedef is NOT inspected, only the existence. When a
  29. // Runnable declares itself a method, Bind() will enforce special
  30. // refcounting + WeakPtr handling semantics for the first
  31. // parameter which is expected to be an object.
  32. // Functor -- A copyable type representing something that should be called.
  33. // All function pointers, Callback<>, and Runnables are functors
  34. // even if the invocation syntax differs.
  35. // RunType -- A function type (as opposed to function _pointer_ type) for
  36. // a Run() function. Usually just a convenience typedef.
  37. // (Bound)ArgsType -- A function type that is being (ab)used to store the
  38. // types of set of arguments. The "return" type is always
  39. // void here. We use this hack so that we do not need
  40. // a new type name for each arity of type. (eg.,
  41. // BindState1, BindState2). This makes forward
  42. // declarations and friending much much easier.
  43. //
  44. // Types:
  45. // RunnableAdapter<> -- Wraps the various "function" pointer types into an
  46. // object that adheres to the Runnable interface.
  47. // There are |3*ARITY| RunnableAdapter types.
  48. // FunctionTraits<> -- Type traits that unwrap a function signature into a
  49. // a set of easier to use typedefs. Used mainly for
  50. // compile time asserts.
  51. // There are |ARITY| FunctionTraits types.
  52. // ForceVoidReturn<> -- Helper class for translating function signatures to
  53. // equivalent forms with a "void" return type.
  54. // There are |ARITY| ForceVoidReturn types.
  55. // FunctorTraits<> -- Type traits used determine the correct RunType and
  56. // RunnableType for a Functor. This is where function
  57. // signature adapters are applied.
  58. // There are |ARITY| ForceVoidReturn types.
  59. // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable
  60. // type class that represents the underlying Functor.
  61. // There are |O(1)| MakeRunnable types.
  62. // InvokeHelper<> -- Take a Runnable + arguments and actully invokes it.
  63. // Handle the differing syntaxes needed for WeakPtr<> support,
  64. // and for ignoring return values. This is separate from
  65. // Invoker to avoid creating multiple version of Invoker<>
  66. // which grows at O(n^2) with the arity.
  67. // There are |k*ARITY| InvokeHelper types.
  68. // Invoker<> -- Unwraps the curried parameters and executes the Runnable.
  69. // There are |(ARITY^2 + ARITY)/2| Invoketypes.
  70. // BindState<> -- Stores the curried parameters, and is the main entry point
  71. // into the Bind() system, doing most of the type resolution.
  72. // There are ARITY BindState types.
  73. // RunnableAdapter<>
  74. //
  75. // The RunnableAdapter<> templates provide a uniform interface for invoking
  76. // a function pointer, method pointer, or const method pointer. The adapter
  77. // exposes a Run() method with an appropriate signature. Using this wrapper
  78. // allows for writing code that supports all three pointer types without
  79. // undue repetition. Without it, a lot of code would need to be repeated 3
  80. // times.
  81. //
  82. // For method pointers and const method pointers the first argument to Run()
  83. // is considered to be the received of the method. This is similar to STL's
  84. // mem_fun().
  85. //
  86. // This class also exposes a RunType typedef that is the function type of the
  87. // Run() function.
  88. //
  89. // If and only if the wrapper contains a method or const method pointer, an
  90. // IsMethod typedef is exposed. The existence of this typedef (NOT the value)
  91. // marks that the wrapper should be considered a method wrapper.
  92. template <typename Functor>
  93. class RunnableAdapter;
  94. // Function: Arity 0.
  95. template <typename R>
  96. class RunnableAdapter<R(*)()> {
  97. public:
  98. typedef R (RunType)();
  99. explicit RunnableAdapter(R(*function)())
  100. : function_(function) {
  101. }
  102. R Run() {
  103. return function_();
  104. }
  105. private:
  106. R (*function_)();
  107. };
  108. // Method: Arity 0.
  109. template <typename R, typename T>
  110. class RunnableAdapter<R(T::*)()> {
  111. public:
  112. typedef R (RunType)(T*);
  113. typedef true_type IsMethod;
  114. explicit RunnableAdapter(R(T::*method)())
  115. : method_(method) {
  116. }
  117. R Run(T* object) {
  118. return (object->*method_)();
  119. }
  120. private:
  121. R (T::*method_)();
  122. };
  123. // Const Method: Arity 0.
  124. template <typename R, typename T>
  125. class RunnableAdapter<R(T::*)() const> {
  126. public:
  127. typedef R (RunType)(const T*);
  128. typedef true_type IsMethod;
  129. explicit RunnableAdapter(R(T::*method)() const)
  130. : method_(method) {
  131. }
  132. R Run(const T* object) {
  133. return (object->*method_)();
  134. }
  135. private:
  136. R (T::*method_)() const;
  137. };
  138. // Function: Arity 1.
  139. template <typename R, typename A1>
  140. class RunnableAdapter<R(*)(A1)> {
  141. public:
  142. typedef R (RunType)(A1);
  143. explicit RunnableAdapter(R(*function)(A1))
  144. : function_(function) {
  145. }
  146. R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
  147. return function_(CallbackForward(a1));
  148. }
  149. private:
  150. R (*function_)(A1);
  151. };
  152. // Method: Arity 1.
  153. template <typename R, typename T, typename A1>
  154. class RunnableAdapter<R(T::*)(A1)> {
  155. public:
  156. typedef R (RunType)(T*, A1);
  157. typedef true_type IsMethod;
  158. explicit RunnableAdapter(R(T::*method)(A1))
  159. : method_(method) {
  160. }
  161. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
  162. return (object->*method_)(CallbackForward(a1));
  163. }
  164. private:
  165. R (T::*method_)(A1);
  166. };
  167. // Const Method: Arity 1.
  168. template <typename R, typename T, typename A1>
  169. class RunnableAdapter<R(T::*)(A1) const> {
  170. public:
  171. typedef R (RunType)(const T*, A1);
  172. typedef true_type IsMethod;
  173. explicit RunnableAdapter(R(T::*method)(A1) const)
  174. : method_(method) {
  175. }
  176. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
  177. return (object->*method_)(CallbackForward(a1));
  178. }
  179. private:
  180. R (T::*method_)(A1) const;
  181. };
  182. // Function: Arity 2.
  183. template <typename R, typename A1, typename A2>
  184. class RunnableAdapter<R(*)(A1, A2)> {
  185. public:
  186. typedef R (RunType)(A1, A2);
  187. explicit RunnableAdapter(R(*function)(A1, A2))
  188. : function_(function) {
  189. }
  190. R Run(typename CallbackParamTraits<A1>::ForwardType a1,
  191. typename CallbackParamTraits<A2>::ForwardType a2) {
  192. return function_(CallbackForward(a1), CallbackForward(a2));
  193. }
  194. private:
  195. R (*function_)(A1, A2);
  196. };
  197. // Method: Arity 2.
  198. template <typename R, typename T, typename A1, typename A2>
  199. class RunnableAdapter<R(T::*)(A1, A2)> {
  200. public:
  201. typedef R (RunType)(T*, A1, A2);
  202. typedef true_type IsMethod;
  203. explicit RunnableAdapter(R(T::*method)(A1, A2))
  204. : method_(method) {
  205. }
  206. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  207. typename CallbackParamTraits<A2>::ForwardType a2) {
  208. return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
  209. }
  210. private:
  211. R (T::*method_)(A1, A2);
  212. };
  213. // Const Method: Arity 2.
  214. template <typename R, typename T, typename A1, typename A2>
  215. class RunnableAdapter<R(T::*)(A1, A2) const> {
  216. public:
  217. typedef R (RunType)(const T*, A1, A2);
  218. typedef true_type IsMethod;
  219. explicit RunnableAdapter(R(T::*method)(A1, A2) const)
  220. : method_(method) {
  221. }
  222. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  223. typename CallbackParamTraits<A2>::ForwardType a2) {
  224. return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
  225. }
  226. private:
  227. R (T::*method_)(A1, A2) const;
  228. };
  229. // Function: Arity 3.
  230. template <typename R, typename A1, typename A2, typename A3>
  231. class RunnableAdapter<R(*)(A1, A2, A3)> {
  232. public:
  233. typedef R (RunType)(A1, A2, A3);
  234. explicit RunnableAdapter(R(*function)(A1, A2, A3))
  235. : function_(function) {
  236. }
  237. R Run(typename CallbackParamTraits<A1>::ForwardType a1,
  238. typename CallbackParamTraits<A2>::ForwardType a2,
  239. typename CallbackParamTraits<A3>::ForwardType a3) {
  240. return function_(CallbackForward(a1), CallbackForward(a2),
  241. CallbackForward(a3));
  242. }
  243. private:
  244. R (*function_)(A1, A2, A3);
  245. };
  246. // Method: Arity 3.
  247. template <typename R, typename T, typename A1, typename A2, typename A3>
  248. class RunnableAdapter<R(T::*)(A1, A2, A3)> {
  249. public:
  250. typedef R (RunType)(T*, A1, A2, A3);
  251. typedef true_type IsMethod;
  252. explicit RunnableAdapter(R(T::*method)(A1, A2, A3))
  253. : method_(method) {
  254. }
  255. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  256. typename CallbackParamTraits<A2>::ForwardType a2,
  257. typename CallbackParamTraits<A3>::ForwardType a3) {
  258. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  259. CallbackForward(a3));
  260. }
  261. private:
  262. R (T::*method_)(A1, A2, A3);
  263. };
  264. // Const Method: Arity 3.
  265. template <typename R, typename T, typename A1, typename A2, typename A3>
  266. class RunnableAdapter<R(T::*)(A1, A2, A3) const> {
  267. public:
  268. typedef R (RunType)(const T*, A1, A2, A3);
  269. typedef true_type IsMethod;
  270. explicit RunnableAdapter(R(T::*method)(A1, A2, A3) const)
  271. : method_(method) {
  272. }
  273. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  274. typename CallbackParamTraits<A2>::ForwardType a2,
  275. typename CallbackParamTraits<A3>::ForwardType a3) {
  276. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  277. CallbackForward(a3));
  278. }
  279. private:
  280. R (T::*method_)(A1, A2, A3) const;
  281. };
  282. // Function: Arity 4.
  283. template <typename R, typename A1, typename A2, typename A3, typename A4>
  284. class RunnableAdapter<R(*)(A1, A2, A3, A4)> {
  285. public:
  286. typedef R (RunType)(A1, A2, A3, A4);
  287. explicit RunnableAdapter(R(*function)(A1, A2, A3, A4))
  288. : function_(function) {
  289. }
  290. R Run(typename CallbackParamTraits<A1>::ForwardType a1,
  291. typename CallbackParamTraits<A2>::ForwardType a2,
  292. typename CallbackParamTraits<A3>::ForwardType a3,
  293. typename CallbackParamTraits<A4>::ForwardType a4) {
  294. return function_(CallbackForward(a1), CallbackForward(a2),
  295. CallbackForward(a3), CallbackForward(a4));
  296. }
  297. private:
  298. R (*function_)(A1, A2, A3, A4);
  299. };
  300. // Method: Arity 4.
  301. template <typename R, typename T, typename A1, typename A2, typename A3,
  302. typename A4>
  303. class RunnableAdapter<R(T::*)(A1, A2, A3, A4)> {
  304. public:
  305. typedef R (RunType)(T*, A1, A2, A3, A4);
  306. typedef true_type IsMethod;
  307. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4))
  308. : method_(method) {
  309. }
  310. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  311. typename CallbackParamTraits<A2>::ForwardType a2,
  312. typename CallbackParamTraits<A3>::ForwardType a3,
  313. typename CallbackParamTraits<A4>::ForwardType a4) {
  314. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  315. CallbackForward(a3), CallbackForward(a4));
  316. }
  317. private:
  318. R (T::*method_)(A1, A2, A3, A4);
  319. };
  320. // Const Method: Arity 4.
  321. template <typename R, typename T, typename A1, typename A2, typename A3,
  322. typename A4>
  323. class RunnableAdapter<R(T::*)(A1, A2, A3, A4) const> {
  324. public:
  325. typedef R (RunType)(const T*, A1, A2, A3, A4);
  326. typedef true_type IsMethod;
  327. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4) const)
  328. : method_(method) {
  329. }
  330. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  331. typename CallbackParamTraits<A2>::ForwardType a2,
  332. typename CallbackParamTraits<A3>::ForwardType a3,
  333. typename CallbackParamTraits<A4>::ForwardType a4) {
  334. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  335. CallbackForward(a3), CallbackForward(a4));
  336. }
  337. private:
  338. R (T::*method_)(A1, A2, A3, A4) const;
  339. };
  340. // Function: Arity 5.
  341. template <typename R, typename A1, typename A2, typename A3, typename A4,
  342. typename A5>
  343. class RunnableAdapter<R(*)(A1, A2, A3, A4, A5)> {
  344. public:
  345. typedef R (RunType)(A1, A2, A3, A4, A5);
  346. explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5))
  347. : function_(function) {
  348. }
  349. R Run(typename CallbackParamTraits<A1>::ForwardType a1,
  350. typename CallbackParamTraits<A2>::ForwardType a2,
  351. typename CallbackParamTraits<A3>::ForwardType a3,
  352. typename CallbackParamTraits<A4>::ForwardType a4,
  353. typename CallbackParamTraits<A5>::ForwardType a5) {
  354. return function_(CallbackForward(a1), CallbackForward(a2),
  355. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
  356. }
  357. private:
  358. R (*function_)(A1, A2, A3, A4, A5);
  359. };
  360. // Method: Arity 5.
  361. template <typename R, typename T, typename A1, typename A2, typename A3,
  362. typename A4, typename A5>
  363. class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5)> {
  364. public:
  365. typedef R (RunType)(T*, A1, A2, A3, A4, A5);
  366. typedef true_type IsMethod;
  367. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5))
  368. : method_(method) {
  369. }
  370. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  371. typename CallbackParamTraits<A2>::ForwardType a2,
  372. typename CallbackParamTraits<A3>::ForwardType a3,
  373. typename CallbackParamTraits<A4>::ForwardType a4,
  374. typename CallbackParamTraits<A5>::ForwardType a5) {
  375. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  376. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
  377. }
  378. private:
  379. R (T::*method_)(A1, A2, A3, A4, A5);
  380. };
  381. // Const Method: Arity 5.
  382. template <typename R, typename T, typename A1, typename A2, typename A3,
  383. typename A4, typename A5>
  384. class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5) const> {
  385. public:
  386. typedef R (RunType)(const T*, A1, A2, A3, A4, A5);
  387. typedef true_type IsMethod;
  388. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5) const)
  389. : method_(method) {
  390. }
  391. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  392. typename CallbackParamTraits<A2>::ForwardType a2,
  393. typename CallbackParamTraits<A3>::ForwardType a3,
  394. typename CallbackParamTraits<A4>::ForwardType a4,
  395. typename CallbackParamTraits<A5>::ForwardType a5) {
  396. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  397. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
  398. }
  399. private:
  400. R (T::*method_)(A1, A2, A3, A4, A5) const;
  401. };
  402. // Function: Arity 6.
  403. template <typename R, typename A1, typename A2, typename A3, typename A4,
  404. typename A5, typename A6>
  405. class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6)> {
  406. public:
  407. typedef R (RunType)(A1, A2, A3, A4, A5, A6);
  408. explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6))
  409. : function_(function) {
  410. }
  411. R Run(typename CallbackParamTraits<A1>::ForwardType a1,
  412. typename CallbackParamTraits<A2>::ForwardType a2,
  413. typename CallbackParamTraits<A3>::ForwardType a3,
  414. typename CallbackParamTraits<A4>::ForwardType a4,
  415. typename CallbackParamTraits<A5>::ForwardType a5,
  416. typename CallbackParamTraits<A6>::ForwardType a6) {
  417. return function_(CallbackForward(a1), CallbackForward(a2),
  418. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  419. CallbackForward(a6));
  420. }
  421. private:
  422. R (*function_)(A1, A2, A3, A4, A5, A6);
  423. };
  424. // Method: Arity 6.
  425. template <typename R, typename T, typename A1, typename A2, typename A3,
  426. typename A4, typename A5, typename A6>
  427. class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6)> {
  428. public:
  429. typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6);
  430. typedef true_type IsMethod;
  431. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6))
  432. : method_(method) {
  433. }
  434. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  435. typename CallbackParamTraits<A2>::ForwardType a2,
  436. typename CallbackParamTraits<A3>::ForwardType a3,
  437. typename CallbackParamTraits<A4>::ForwardType a4,
  438. typename CallbackParamTraits<A5>::ForwardType a5,
  439. typename CallbackParamTraits<A6>::ForwardType a6) {
  440. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  441. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  442. CallbackForward(a6));
  443. }
  444. private:
  445. R (T::*method_)(A1, A2, A3, A4, A5, A6);
  446. };
  447. // Const Method: Arity 6.
  448. template <typename R, typename T, typename A1, typename A2, typename A3,
  449. typename A4, typename A5, typename A6>
  450. class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6) const> {
  451. public:
  452. typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6);
  453. typedef true_type IsMethod;
  454. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6) const)
  455. : method_(method) {
  456. }
  457. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  458. typename CallbackParamTraits<A2>::ForwardType a2,
  459. typename CallbackParamTraits<A3>::ForwardType a3,
  460. typename CallbackParamTraits<A4>::ForwardType a4,
  461. typename CallbackParamTraits<A5>::ForwardType a5,
  462. typename CallbackParamTraits<A6>::ForwardType a6) {
  463. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  464. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  465. CallbackForward(a6));
  466. }
  467. private:
  468. R (T::*method_)(A1, A2, A3, A4, A5, A6) const;
  469. };
  470. // Function: Arity 7.
  471. template <typename R, typename A1, typename A2, typename A3, typename A4,
  472. typename A5, typename A6, typename A7>
  473. class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6, A7)> {
  474. public:
  475. typedef R (RunType)(A1, A2, A3, A4, A5, A6, A7);
  476. explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6, A7))
  477. : function_(function) {
  478. }
  479. R Run(typename CallbackParamTraits<A1>::ForwardType a1,
  480. typename CallbackParamTraits<A2>::ForwardType a2,
  481. typename CallbackParamTraits<A3>::ForwardType a3,
  482. typename CallbackParamTraits<A4>::ForwardType a4,
  483. typename CallbackParamTraits<A5>::ForwardType a5,
  484. typename CallbackParamTraits<A6>::ForwardType a6,
  485. typename CallbackParamTraits<A7>::ForwardType a7) {
  486. return function_(CallbackForward(a1), CallbackForward(a2),
  487. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  488. CallbackForward(a6), CallbackForward(a7));
  489. }
  490. private:
  491. R (*function_)(A1, A2, A3, A4, A5, A6, A7);
  492. };
  493. // Method: Arity 7.
  494. template <typename R, typename T, typename A1, typename A2, typename A3,
  495. typename A4, typename A5, typename A6, typename A7>
  496. class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7)> {
  497. public:
  498. typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6, A7);
  499. typedef true_type IsMethod;
  500. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7))
  501. : method_(method) {
  502. }
  503. R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  504. typename CallbackParamTraits<A2>::ForwardType a2,
  505. typename CallbackParamTraits<A3>::ForwardType a3,
  506. typename CallbackParamTraits<A4>::ForwardType a4,
  507. typename CallbackParamTraits<A5>::ForwardType a5,
  508. typename CallbackParamTraits<A6>::ForwardType a6,
  509. typename CallbackParamTraits<A7>::ForwardType a7) {
  510. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  511. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  512. CallbackForward(a6), CallbackForward(a7));
  513. }
  514. private:
  515. R (T::*method_)(A1, A2, A3, A4, A5, A6, A7);
  516. };
  517. // Const Method: Arity 7.
  518. template <typename R, typename T, typename A1, typename A2, typename A3,
  519. typename A4, typename A5, typename A6, typename A7>
  520. class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7) const> {
  521. public:
  522. typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6, A7);
  523. typedef true_type IsMethod;
  524. explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7) const)
  525. : method_(method) {
  526. }
  527. R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
  528. typename CallbackParamTraits<A2>::ForwardType a2,
  529. typename CallbackParamTraits<A3>::ForwardType a3,
  530. typename CallbackParamTraits<A4>::ForwardType a4,
  531. typename CallbackParamTraits<A5>::ForwardType a5,
  532. typename CallbackParamTraits<A6>::ForwardType a6,
  533. typename CallbackParamTraits<A7>::ForwardType a7) {
  534. return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
  535. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  536. CallbackForward(a6), CallbackForward(a7));
  537. }
  538. private:
  539. R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const;
  540. };
  541. // FunctionTraits<>
  542. //
  543. // Breaks a function signature apart into typedefs for easier introspection.
  544. template <typename Sig>
  545. struct FunctionTraits;
  546. template <typename R>
  547. struct FunctionTraits<R()> {
  548. typedef R ReturnType;
  549. };
  550. template <typename R, typename A1>
  551. struct FunctionTraits<R(A1)> {
  552. typedef R ReturnType;
  553. typedef A1 A1Type;
  554. };
  555. template <typename R, typename A1, typename A2>
  556. struct FunctionTraits<R(A1, A2)> {
  557. typedef R ReturnType;
  558. typedef A1 A1Type;
  559. typedef A2 A2Type;
  560. };
  561. template <typename R, typename A1, typename A2, typename A3>
  562. struct FunctionTraits<R(A1, A2, A3)> {
  563. typedef R ReturnType;
  564. typedef A1 A1Type;
  565. typedef A2 A2Type;
  566. typedef A3 A3Type;
  567. };
  568. template <typename R, typename A1, typename A2, typename A3, typename A4>
  569. struct FunctionTraits<R(A1, A2, A3, A4)> {
  570. typedef R ReturnType;
  571. typedef A1 A1Type;
  572. typedef A2 A2Type;
  573. typedef A3 A3Type;
  574. typedef A4 A4Type;
  575. };
  576. template <typename R, typename A1, typename A2, typename A3, typename A4,
  577. typename A5>
  578. struct FunctionTraits<R(A1, A2, A3, A4, A5)> {
  579. typedef R ReturnType;
  580. typedef A1 A1Type;
  581. typedef A2 A2Type;
  582. typedef A3 A3Type;
  583. typedef A4 A4Type;
  584. typedef A5 A5Type;
  585. };
  586. template <typename R, typename A1, typename A2, typename A3, typename A4,
  587. typename A5, typename A6>
  588. struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> {
  589. typedef R ReturnType;
  590. typedef A1 A1Type;
  591. typedef A2 A2Type;
  592. typedef A3 A3Type;
  593. typedef A4 A4Type;
  594. typedef A5 A5Type;
  595. typedef A6 A6Type;
  596. };
  597. template <typename R, typename A1, typename A2, typename A3, typename A4,
  598. typename A5, typename A6, typename A7>
  599. struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> {
  600. typedef R ReturnType;
  601. typedef A1 A1Type;
  602. typedef A2 A2Type;
  603. typedef A3 A3Type;
  604. typedef A4 A4Type;
  605. typedef A5 A5Type;
  606. typedef A6 A6Type;
  607. typedef A7 A7Type;
  608. };
  609. // ForceVoidReturn<>
  610. //
  611. // Set of templates that support forcing the function return type to void.
  612. template <typename Sig>
  613. struct ForceVoidReturn;
  614. template <typename R>
  615. struct ForceVoidReturn<R()> {
  616. typedef void(RunType)();
  617. };
  618. template <typename R, typename A1>
  619. struct ForceVoidReturn<R(A1)> {
  620. typedef void(RunType)(A1);
  621. };
  622. template <typename R, typename A1, typename A2>
  623. struct ForceVoidReturn<R(A1, A2)> {
  624. typedef void(RunType)(A1, A2);
  625. };
  626. template <typename R, typename A1, typename A2, typename A3>
  627. struct ForceVoidReturn<R(A1, A2, A3)> {
  628. typedef void(RunType)(A1, A2, A3);
  629. };
  630. template <typename R, typename A1, typename A2, typename A3, typename A4>
  631. struct ForceVoidReturn<R(A1, A2, A3, A4)> {
  632. typedef void(RunType)(A1, A2, A3, A4);
  633. };
  634. template <typename R, typename A1, typename A2, typename A3, typename A4,
  635. typename A5>
  636. struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> {
  637. typedef void(RunType)(A1, A2, A3, A4, A5);
  638. };
  639. template <typename R, typename A1, typename A2, typename A3, typename A4,
  640. typename A5, typename A6>
  641. struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> {
  642. typedef void(RunType)(A1, A2, A3, A4, A5, A6);
  643. };
  644. template <typename R, typename A1, typename A2, typename A3, typename A4,
  645. typename A5, typename A6, typename A7>
  646. struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> {
  647. typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7);
  648. };
  649. // FunctorTraits<>
  650. //
  651. // See description at top of file.
  652. template <typename T>
  653. struct FunctorTraits {
  654. typedef RunnableAdapter<T> RunnableType;
  655. typedef typename RunnableType::RunType RunType;
  656. };
  657. template <typename T>
  658. struct FunctorTraits<IgnoreResultHelper<T> > {
  659. typedef typename FunctorTraits<T>::RunnableType RunnableType;
  660. typedef typename ForceVoidReturn<
  661. typename RunnableType::RunType>::RunType RunType;
  662. };
  663. template <typename T>
  664. struct FunctorTraits<Callback<T> > {
  665. typedef Callback<T> RunnableType;
  666. typedef typename Callback<T>::RunType RunType;
  667. };
  668. // MakeRunnable<>
  669. //
  670. // Converts a passed in functor to a RunnableType using type inference.
  671. template <typename T>
  672. typename FunctorTraits<T>::RunnableType MakeRunnable(const T& t) {
  673. return RunnableAdapter<T>(t);
  674. }
  675. template <typename T>
  676. typename FunctorTraits<T>::RunnableType
  677. MakeRunnable(const IgnoreResultHelper<T>& t) {
  678. return MakeRunnable(t.functor_);
  679. }
  680. template <typename T>
  681. const typename FunctorTraits<Callback<T> >::RunnableType&
  682. MakeRunnable(const Callback<T>& t) {
  683. DCHECK(!t.is_null());
  684. return t;
  685. }
  686. // InvokeHelper<>
  687. //
  688. // There are 3 logical InvokeHelper<> specializations: normal, void-return,
  689. // WeakCalls.
  690. //
  691. // The normal type just calls the underlying runnable.
  692. //
  693. // We need a InvokeHelper to handle void return types in order to support
  694. // IgnoreResult(). Normally, if the Runnable's RunType had a void return,
  695. // the template system would just accept "return functor.Run()" ignoring
  696. // the fact that a void function is being used with return. This piece of
  697. // sugar breaks though when the Runnable's RunType is not void. Thus, we
  698. // need a partial specialization to change the syntax to drop the "return"
  699. // from the invocation call.
  700. //
  701. // WeakCalls similarly need special syntax that is applied to the first
  702. // argument to check if they should no-op themselves.
  703. template <bool IsWeakCall, typename ReturnType, typename Runnable,
  704. typename ArgsType>
  705. struct InvokeHelper;
  706. template <typename ReturnType, typename Runnable>
  707. struct InvokeHelper<false, ReturnType, Runnable,
  708. void()> {
  709. static ReturnType MakeItSo(Runnable runnable) {
  710. return runnable.Run();
  711. }
  712. };
  713. template <typename Runnable>
  714. struct InvokeHelper<false, void, Runnable,
  715. void()> {
  716. static void MakeItSo(Runnable runnable) {
  717. runnable.Run();
  718. }
  719. };
  720. template <typename ReturnType, typename Runnable,typename A1>
  721. struct InvokeHelper<false, ReturnType, Runnable,
  722. void(A1)> {
  723. static ReturnType MakeItSo(Runnable runnable, A1 a1) {
  724. return runnable.Run(CallbackForward(a1));
  725. }
  726. };
  727. template <typename Runnable,typename A1>
  728. struct InvokeHelper<false, void, Runnable,
  729. void(A1)> {
  730. static void MakeItSo(Runnable runnable, A1 a1) {
  731. runnable.Run(CallbackForward(a1));
  732. }
  733. };
  734. template <typename Runnable, typename BoundWeakPtr>
  735. struct InvokeHelper<true, void, Runnable,
  736. void(BoundWeakPtr)> {
  737. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr) {
  738. if (!weak_ptr.get()) {
  739. return;
  740. }
  741. runnable.Run(weak_ptr.get());
  742. }
  743. };
  744. template <typename ReturnType, typename Runnable,typename A1, typename A2>
  745. struct InvokeHelper<false, ReturnType, Runnable,
  746. void(A1, A2)> {
  747. static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) {
  748. return runnable.Run(CallbackForward(a1), CallbackForward(a2));
  749. }
  750. };
  751. template <typename Runnable,typename A1, typename A2>
  752. struct InvokeHelper<false, void, Runnable,
  753. void(A1, A2)> {
  754. static void MakeItSo(Runnable runnable, A1 a1, A2 a2) {
  755. runnable.Run(CallbackForward(a1), CallbackForward(a2));
  756. }
  757. };
  758. template <typename Runnable, typename BoundWeakPtr, typename A2>
  759. struct InvokeHelper<true, void, Runnable,
  760. void(BoundWeakPtr, A2)> {
  761. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2) {
  762. if (!weak_ptr.get()) {
  763. return;
  764. }
  765. runnable.Run(weak_ptr.get(), CallbackForward(a2));
  766. }
  767. };
  768. template <typename ReturnType, typename Runnable,typename A1, typename A2,
  769. typename A3>
  770. struct InvokeHelper<false, ReturnType, Runnable,
  771. void(A1, A2, A3)> {
  772. static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
  773. return runnable.Run(CallbackForward(a1), CallbackForward(a2),
  774. CallbackForward(a3));
  775. }
  776. };
  777. template <typename Runnable,typename A1, typename A2, typename A3>
  778. struct InvokeHelper<false, void, Runnable,
  779. void(A1, A2, A3)> {
  780. static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
  781. runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3));
  782. }
  783. };
  784. template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3>
  785. struct InvokeHelper<true, void, Runnable,
  786. void(BoundWeakPtr, A2, A3)> {
  787. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3) {
  788. if (!weak_ptr.get()) {
  789. return;
  790. }
  791. runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3));
  792. }
  793. };
  794. template <typename ReturnType, typename Runnable,typename A1, typename A2,
  795. typename A3, typename A4>
  796. struct InvokeHelper<false, ReturnType, Runnable,
  797. void(A1, A2, A3, A4)> {
  798. static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
  799. return runnable.Run(CallbackForward(a1), CallbackForward(a2),
  800. CallbackForward(a3), CallbackForward(a4));
  801. }
  802. };
  803. template <typename Runnable,typename A1, typename A2, typename A3, typename A4>
  804. struct InvokeHelper<false, void, Runnable,
  805. void(A1, A2, A3, A4)> {
  806. static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
  807. runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
  808. CallbackForward(a4));
  809. }
  810. };
  811. template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3,
  812. typename A4>
  813. struct InvokeHelper<true, void, Runnable,
  814. void(BoundWeakPtr, A2, A3, A4)> {
  815. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3,
  816. A4 a4) {
  817. if (!weak_ptr.get()) {
  818. return;
  819. }
  820. runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
  821. CallbackForward(a4));
  822. }
  823. };
  824. template <typename ReturnType, typename Runnable,typename A1, typename A2,
  825. typename A3, typename A4, typename A5>
  826. struct InvokeHelper<false, ReturnType, Runnable,
  827. void(A1, A2, A3, A4, A5)> {
  828. static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
  829. A5 a5) {
  830. return runnable.Run(CallbackForward(a1), CallbackForward(a2),
  831. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
  832. }
  833. };
  834. template <typename Runnable,typename A1, typename A2, typename A3, typename A4,
  835. typename A5>
  836. struct InvokeHelper<false, void, Runnable,
  837. void(A1, A2, A3, A4, A5)> {
  838. static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
  839. runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
  840. CallbackForward(a4), CallbackForward(a5));
  841. }
  842. };
  843. template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3,
  844. typename A4, typename A5>
  845. struct InvokeHelper<true, void, Runnable,
  846. void(BoundWeakPtr, A2, A3, A4, A5)> {
  847. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3,
  848. A4 a4, A5 a5) {
  849. if (!weak_ptr.get()) {
  850. return;
  851. }
  852. runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
  853. CallbackForward(a4), CallbackForward(a5));
  854. }
  855. };
  856. template <typename ReturnType, typename Runnable,typename A1, typename A2,
  857. typename A3, typename A4, typename A5, typename A6>
  858. struct InvokeHelper<false, ReturnType, Runnable,
  859. void(A1, A2, A3, A4, A5, A6)> {
  860. static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
  861. A5 a5, A6 a6) {
  862. return runnable.Run(CallbackForward(a1), CallbackForward(a2),
  863. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  864. CallbackForward(a6));
  865. }
  866. };
  867. template <typename Runnable,typename A1, typename A2, typename A3, typename A4,
  868. typename A5, typename A6>
  869. struct InvokeHelper<false, void, Runnable,
  870. void(A1, A2, A3, A4, A5, A6)> {
  871. static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
  872. A6 a6) {
  873. runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
  874. CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
  875. }
  876. };
  877. template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3,
  878. typename A4, typename A5, typename A6>
  879. struct InvokeHelper<true, void, Runnable,
  880. void(BoundWeakPtr, A2, A3, A4, A5, A6)> {
  881. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3,
  882. A4 a4, A5 a5, A6 a6) {
  883. if (!weak_ptr.get()) {
  884. return;
  885. }
  886. runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
  887. CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
  888. }
  889. };
  890. template <typename ReturnType, typename Runnable,typename A1, typename A2,
  891. typename A3, typename A4, typename A5, typename A6, typename A7>
  892. struct InvokeHelper<false, ReturnType, Runnable,
  893. void(A1, A2, A3, A4, A5, A6, A7)> {
  894. static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
  895. A5 a5, A6 a6, A7 a7) {
  896. return runnable.Run(CallbackForward(a1), CallbackForward(a2),
  897. CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
  898. CallbackForward(a6), CallbackForward(a7));
  899. }
  900. };
  901. template <typename Runnable,typename A1, typename A2, typename A3, typename A4,
  902. typename A5, typename A6, typename A7>
  903. struct InvokeHelper<false, void, Runnable,
  904. void(A1, A2, A3, A4, A5, A6, A7)> {
  905. static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
  906. A6 a6, A7 a7) {
  907. runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
  908. CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
  909. CallbackForward(a7));
  910. }
  911. };
  912. template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3,
  913. typename A4, typename A5, typename A6, typename A7>
  914. struct InvokeHelper<true, void, Runnable,
  915. void(BoundWeakPtr, A2, A3, A4, A5, A6, A7)> {
  916. static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3,
  917. A4 a4, A5 a5, A6 a6, A7 a7) {
  918. if (!weak_ptr.get()) {
  919. return;
  920. }
  921. runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3),
  922. CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
  923. CallbackForward(a7));
  924. }
  925. };
  926. #if !defined(_MSC_VER)
  927. template <typename ReturnType, typename Runnable, typename ArgsType>
  928. struct InvokeHelper<true, ReturnType, Runnable, ArgsType> {
  929. // WeakCalls are only supported for functions with a void return type.
  930. // Otherwise, the function result would be undefined if the the WeakPtr<>
  931. // is invalidated.
  932. COMPILE_ASSERT(is_void<ReturnType>::value,
  933. weak_ptrs_can_only_bind_to_methods_without_return_values);
  934. };
  935. #endif
  936. // Invoker<>
  937. //
  938. // See description at the top of the file.
  939. template <int NumBound, typename Storage, typename RunType>
  940. struct Invoker;
  941. // Arity 0 -> 0.
  942. template <typename StorageType, typename R>
  943. struct Invoker<0, StorageType, R()> {
  944. typedef R(RunType)(BindStateBase*);
  945. typedef R(UnboundRunType)();
  946. static R Run(BindStateBase* base) {
  947. StorageType* storage = static_cast<StorageType*>(base);
  948. // Local references to make debugger stepping easier. If in a debugger,
  949. // you really want to warp ahead and step through the
  950. // InvokeHelper<>::MakeItSo() call below.
  951. return InvokeHelper<StorageType::IsWeakCall::value, R,
  952. typename StorageType::RunnableType,
  953. void()>
  954. ::MakeItSo(storage->runnable_);
  955. }
  956. };
  957. // Arity 1 -> 1.
  958. template <typename StorageType, typename R,typename X1>
  959. struct Invoker<0, StorageType, R(X1)> {
  960. typedef R(RunType)(BindStateBase*,
  961. typename CallbackParamTraits<X1>::ForwardType);
  962. typedef R(UnboundRunType)(X1);
  963. static R Run(BindStateBase* base,
  964. typename CallbackParamTraits<X1>::ForwardType x1) {
  965. StorageType* storage = static_cast<StorageType*>(base);
  966. // Local references to make debugger stepping easier. If in a debugger,
  967. // you really want to warp ahead and step through the
  968. // InvokeHelper<>::MakeItSo() call below.
  969. return InvokeHelper<StorageType::IsWeakCall::value, R,
  970. typename StorageType::RunnableType,
  971. void(typename CallbackParamTraits<X1>::ForwardType x1)>
  972. ::MakeItSo(storage->runnable_, CallbackForward(x1));
  973. }
  974. };
  975. // Arity 1 -> 0.
  976. template <typename StorageType, typename R,typename X1>
  977. struct Invoker<1, StorageType, R(X1)> {
  978. typedef R(RunType)(BindStateBase*);
  979. typedef R(UnboundRunType)();
  980. static R Run(BindStateBase* base) {
  981. StorageType* storage = static_cast<StorageType*>(base);
  982. // Local references to make debugger stepping easier. If in a debugger,
  983. // you really want to warp ahead and step through the
  984. // InvokeHelper<>::MakeItSo() call below.
  985. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  986. typename Bound1UnwrapTraits::ForwardType x1 =
  987. Bound1UnwrapTraits::Unwrap(storage->p1_);
  988. return InvokeHelper<StorageType::IsWeakCall::value, R,
  989. typename StorageType::RunnableType,
  990. void(typename Bound1UnwrapTraits::ForwardType)>
  991. ::MakeItSo(storage->runnable_, CallbackForward(x1));
  992. }
  993. };
  994. // Arity 2 -> 2.
  995. template <typename StorageType, typename R,typename X1, typename X2>
  996. struct Invoker<0, StorageType, R(X1, X2)> {
  997. typedef R(RunType)(BindStateBase*,
  998. typename CallbackParamTraits<X1>::ForwardType,
  999. typename CallbackParamTraits<X2>::ForwardType);
  1000. typedef R(UnboundRunType)(X1, X2);
  1001. static R Run(BindStateBase* base,
  1002. typename CallbackParamTraits<X1>::ForwardType x1,
  1003. typename CallbackParamTraits<X2>::ForwardType x2) {
  1004. StorageType* storage = static_cast<StorageType*>(base);
  1005. // Local references to make debugger stepping easier. If in a debugger,
  1006. // you really want to warp ahead and step through the
  1007. // InvokeHelper<>::MakeItSo() call below.
  1008. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1009. typename StorageType::RunnableType,
  1010. void(typename CallbackParamTraits<X1>::ForwardType x1,
  1011. typename CallbackParamTraits<X2>::ForwardType x2)>
  1012. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1013. CallbackForward(x2));
  1014. }
  1015. };
  1016. // Arity 2 -> 1.
  1017. template <typename StorageType, typename R,typename X1, typename X2>
  1018. struct Invoker<1, StorageType, R(X1, X2)> {
  1019. typedef R(RunType)(BindStateBase*,
  1020. typename CallbackParamTraits<X2>::ForwardType);
  1021. typedef R(UnboundRunType)(X2);
  1022. static R Run(BindStateBase* base,
  1023. typename CallbackParamTraits<X2>::ForwardType x2) {
  1024. StorageType* storage = static_cast<StorageType*>(base);
  1025. // Local references to make debugger stepping easier. If in a debugger,
  1026. // you really want to warp ahead and step through the
  1027. // InvokeHelper<>::MakeItSo() call below.
  1028. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1029. typename Bound1UnwrapTraits::ForwardType x1 =
  1030. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1031. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1032. typename StorageType::RunnableType,
  1033. void(typename Bound1UnwrapTraits::ForwardType,
  1034. typename CallbackParamTraits<X2>::ForwardType x2)>
  1035. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1036. CallbackForward(x2));
  1037. }
  1038. };
  1039. // Arity 2 -> 0.
  1040. template <typename StorageType, typename R,typename X1, typename X2>
  1041. struct Invoker<2, StorageType, R(X1, X2)> {
  1042. typedef R(RunType)(BindStateBase*);
  1043. typedef R(UnboundRunType)();
  1044. static R Run(BindStateBase* base) {
  1045. StorageType* storage = static_cast<StorageType*>(base);
  1046. // Local references to make debugger stepping easier. If in a debugger,
  1047. // you really want to warp ahead and step through the
  1048. // InvokeHelper<>::MakeItSo() call below.
  1049. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1050. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1051. typename Bound1UnwrapTraits::ForwardType x1 =
  1052. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1053. typename Bound2UnwrapTraits::ForwardType x2 =
  1054. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1055. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1056. typename StorageType::RunnableType,
  1057. void(typename Bound1UnwrapTraits::ForwardType,
  1058. typename Bound2UnwrapTraits::ForwardType)>
  1059. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1060. CallbackForward(x2));
  1061. }
  1062. };
  1063. // Arity 3 -> 3.
  1064. template <typename StorageType, typename R,typename X1, typename X2,
  1065. typename X3>
  1066. struct Invoker<0, StorageType, R(X1, X2, X3)> {
  1067. typedef R(RunType)(BindStateBase*,
  1068. typename CallbackParamTraits<X1>::ForwardType,
  1069. typename CallbackParamTraits<X2>::ForwardType,
  1070. typename CallbackParamTraits<X3>::ForwardType);
  1071. typedef R(UnboundRunType)(X1, X2, X3);
  1072. static R Run(BindStateBase* base,
  1073. typename CallbackParamTraits<X1>::ForwardType x1,
  1074. typename CallbackParamTraits<X2>::ForwardType x2,
  1075. typename CallbackParamTraits<X3>::ForwardType x3) {
  1076. StorageType* storage = static_cast<StorageType*>(base);
  1077. // Local references to make debugger stepping easier. If in a debugger,
  1078. // you really want to warp ahead and step through the
  1079. // InvokeHelper<>::MakeItSo() call below.
  1080. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1081. typename StorageType::RunnableType,
  1082. void(typename CallbackParamTraits<X1>::ForwardType x1,
  1083. typename CallbackParamTraits<X2>::ForwardType x2,
  1084. typename CallbackParamTraits<X3>::ForwardType x3)>
  1085. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1086. CallbackForward(x2), CallbackForward(x3));
  1087. }
  1088. };
  1089. // Arity 3 -> 2.
  1090. template <typename StorageType, typename R,typename X1, typename X2,
  1091. typename X3>
  1092. struct Invoker<1, StorageType, R(X1, X2, X3)> {
  1093. typedef R(RunType)(BindStateBase*,
  1094. typename CallbackParamTraits<X2>::ForwardType,
  1095. typename CallbackParamTraits<X3>::ForwardType);
  1096. typedef R(UnboundRunType)(X2, X3);
  1097. static R Run(BindStateBase* base,
  1098. typename CallbackParamTraits<X2>::ForwardType x2,
  1099. typename CallbackParamTraits<X3>::ForwardType x3) {
  1100. StorageType* storage = static_cast<StorageType*>(base);
  1101. // Local references to make debugger stepping easier. If in a debugger,
  1102. // you really want to warp ahead and step through the
  1103. // InvokeHelper<>::MakeItSo() call below.
  1104. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1105. typename Bound1UnwrapTraits::ForwardType x1 =
  1106. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1107. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1108. typename StorageType::RunnableType,
  1109. void(typename Bound1UnwrapTraits::ForwardType,
  1110. typename CallbackParamTraits<X2>::ForwardType x2,
  1111. typename CallbackParamTraits<X3>::ForwardType x3)>
  1112. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1113. CallbackForward(x2), CallbackForward(x3));
  1114. }
  1115. };
  1116. // Arity 3 -> 1.
  1117. template <typename StorageType, typename R,typename X1, typename X2,
  1118. typename X3>
  1119. struct Invoker<2, StorageType, R(X1, X2, X3)> {
  1120. typedef R(RunType)(BindStateBase*,
  1121. typename CallbackParamTraits<X3>::ForwardType);
  1122. typedef R(UnboundRunType)(X3);
  1123. static R Run(BindStateBase* base,
  1124. typename CallbackParamTraits<X3>::ForwardType x3) {
  1125. StorageType* storage = static_cast<StorageType*>(base);
  1126. // Local references to make debugger stepping easier. If in a debugger,
  1127. // you really want to warp ahead and step through the
  1128. // InvokeHelper<>::MakeItSo() call below.
  1129. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1130. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1131. typename Bound1UnwrapTraits::ForwardType x1 =
  1132. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1133. typename Bound2UnwrapTraits::ForwardType x2 =
  1134. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1135. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1136. typename StorageType::RunnableType,
  1137. void(typename Bound1UnwrapTraits::ForwardType,
  1138. typename Bound2UnwrapTraits::ForwardType,
  1139. typename CallbackParamTraits<X3>::ForwardType x3)>
  1140. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1141. CallbackForward(x2), CallbackForward(x3));
  1142. }
  1143. };
  1144. // Arity 3 -> 0.
  1145. template <typename StorageType, typename R,typename X1, typename X2,
  1146. typename X3>
  1147. struct Invoker<3, StorageType, R(X1, X2, X3)> {
  1148. typedef R(RunType)(BindStateBase*);
  1149. typedef R(UnboundRunType)();
  1150. static R Run(BindStateBase* base) {
  1151. StorageType* storage = static_cast<StorageType*>(base);
  1152. // Local references to make debugger stepping easier. If in a debugger,
  1153. // you really want to warp ahead and step through the
  1154. // InvokeHelper<>::MakeItSo() call below.
  1155. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1156. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1157. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1158. typename Bound1UnwrapTraits::ForwardType x1 =
  1159. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1160. typename Bound2UnwrapTraits::ForwardType x2 =
  1161. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1162. typename Bound3UnwrapTraits::ForwardType x3 =
  1163. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1164. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1165. typename StorageType::RunnableType,
  1166. void(typename Bound1UnwrapTraits::ForwardType,
  1167. typename Bound2UnwrapTraits::ForwardType,
  1168. typename Bound3UnwrapTraits::ForwardType)>
  1169. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1170. CallbackForward(x2), CallbackForward(x3));
  1171. }
  1172. };
  1173. // Arity 4 -> 4.
  1174. template <typename StorageType, typename R,typename X1, typename X2,
  1175. typename X3, typename X4>
  1176. struct Invoker<0, StorageType, R(X1, X2, X3, X4)> {
  1177. typedef R(RunType)(BindStateBase*,
  1178. typename CallbackParamTraits<X1>::ForwardType,
  1179. typename CallbackParamTraits<X2>::ForwardType,
  1180. typename CallbackParamTraits<X3>::ForwardType,
  1181. typename CallbackParamTraits<X4>::ForwardType);
  1182. typedef R(UnboundRunType)(X1, X2, X3, X4);
  1183. static R Run(BindStateBase* base,
  1184. typename CallbackParamTraits<X1>::ForwardType x1,
  1185. typename CallbackParamTraits<X2>::ForwardType x2,
  1186. typename CallbackParamTraits<X3>::ForwardType x3,
  1187. typename CallbackParamTraits<X4>::ForwardType x4) {
  1188. StorageType* storage = static_cast<StorageType*>(base);
  1189. // Local references to make debugger stepping easier. If in a debugger,
  1190. // you really want to warp ahead and step through the
  1191. // InvokeHelper<>::MakeItSo() call below.
  1192. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1193. typename StorageType::RunnableType,
  1194. void(typename CallbackParamTraits<X1>::ForwardType x1,
  1195. typename CallbackParamTraits<X2>::ForwardType x2,
  1196. typename CallbackParamTraits<X3>::ForwardType x3,
  1197. typename CallbackParamTraits<X4>::ForwardType x4)>
  1198. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1199. CallbackForward(x2), CallbackForward(x3),
  1200. CallbackForward(x4));
  1201. }
  1202. };
  1203. // Arity 4 -> 3.
  1204. template <typename StorageType, typename R,typename X1, typename X2,
  1205. typename X3, typename X4>
  1206. struct Invoker<1, StorageType, R(X1, X2, X3, X4)> {
  1207. typedef R(RunType)(BindStateBase*,
  1208. typename CallbackParamTraits<X2>::ForwardType,
  1209. typename CallbackParamTraits<X3>::ForwardType,
  1210. typename CallbackParamTraits<X4>::ForwardType);
  1211. typedef R(UnboundRunType)(X2, X3, X4);
  1212. static R Run(BindStateBase* base,
  1213. typename CallbackParamTraits<X2>::ForwardType x2,
  1214. typename CallbackParamTraits<X3>::ForwardType x3,
  1215. typename CallbackParamTraits<X4>::ForwardType x4) {
  1216. StorageType* storage = static_cast<StorageType*>(base);
  1217. // Local references to make debugger stepping easier. If in a debugger,
  1218. // you really want to warp ahead and step through the
  1219. // InvokeHelper<>::MakeItSo() call below.
  1220. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1221. typename Bound1UnwrapTraits::ForwardType x1 =
  1222. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1223. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1224. typename StorageType::RunnableType,
  1225. void(typename Bound1UnwrapTraits::ForwardType,
  1226. typename CallbackParamTraits<X2>::ForwardType x2,
  1227. typename CallbackParamTraits<X3>::ForwardType x3,
  1228. typename CallbackParamTraits<X4>::ForwardType x4)>
  1229. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1230. CallbackForward(x2), CallbackForward(x3),
  1231. CallbackForward(x4));
  1232. }
  1233. };
  1234. // Arity 4 -> 2.
  1235. template <typename StorageType, typename R,typename X1, typename X2,
  1236. typename X3, typename X4>
  1237. struct Invoker<2, StorageType, R(X1, X2, X3, X4)> {
  1238. typedef R(RunType)(BindStateBase*,
  1239. typename CallbackParamTraits<X3>::ForwardType,
  1240. typename CallbackParamTraits<X4>::ForwardType);
  1241. typedef R(UnboundRunType)(X3, X4);
  1242. static R Run(BindStateBase* base,
  1243. typename CallbackParamTraits<X3>::ForwardType x3,
  1244. typename CallbackParamTraits<X4>::ForwardType x4) {
  1245. StorageType* storage = static_cast<StorageType*>(base);
  1246. // Local references to make debugger stepping easier. If in a debugger,
  1247. // you really want to warp ahead and step through the
  1248. // InvokeHelper<>::MakeItSo() call below.
  1249. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1250. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1251. typename Bound1UnwrapTraits::ForwardType x1 =
  1252. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1253. typename Bound2UnwrapTraits::ForwardType x2 =
  1254. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1255. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1256. typename StorageType::RunnableType,
  1257. void(typename Bound1UnwrapTraits::ForwardType,
  1258. typename Bound2UnwrapTraits::ForwardType,
  1259. typename CallbackParamTraits<X3>::ForwardType x3,
  1260. typename CallbackParamTraits<X4>::ForwardType x4)>
  1261. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1262. CallbackForward(x2), CallbackForward(x3),
  1263. CallbackForward(x4));
  1264. }
  1265. };
  1266. // Arity 4 -> 1.
  1267. template <typename StorageType, typename R,typename X1, typename X2,
  1268. typename X3, typename X4>
  1269. struct Invoker<3, StorageType, R(X1, X2, X3, X4)> {
  1270. typedef R(RunType)(BindStateBase*,
  1271. typename CallbackParamTraits<X4>::ForwardType);
  1272. typedef R(UnboundRunType)(X4);
  1273. static R Run(BindStateBase* base,
  1274. typename CallbackParamTraits<X4>::ForwardType x4) {
  1275. StorageType* storage = static_cast<StorageType*>(base);
  1276. // Local references to make debugger stepping easier. If in a debugger,
  1277. // you really want to warp ahead and step through the
  1278. // InvokeHelper<>::MakeItSo() call below.
  1279. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1280. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1281. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1282. typename Bound1UnwrapTraits::ForwardType x1 =
  1283. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1284. typename Bound2UnwrapTraits::ForwardType x2 =
  1285. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1286. typename Bound3UnwrapTraits::ForwardType x3 =
  1287. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1288. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1289. typename StorageType::RunnableType,
  1290. void(typename Bound1UnwrapTraits::ForwardType,
  1291. typename Bound2UnwrapTraits::ForwardType,
  1292. typename Bound3UnwrapTraits::ForwardType,
  1293. typename CallbackParamTraits<X4>::ForwardType x4)>
  1294. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1295. CallbackForward(x2), CallbackForward(x3),
  1296. CallbackForward(x4));
  1297. }
  1298. };
  1299. // Arity 4 -> 0.
  1300. template <typename StorageType, typename R,typename X1, typename X2,
  1301. typename X3, typename X4>
  1302. struct Invoker<4, StorageType, R(X1, X2, X3, X4)> {
  1303. typedef R(RunType)(BindStateBase*);
  1304. typedef R(UnboundRunType)();
  1305. static R Run(BindStateBase* base) {
  1306. StorageType* storage = static_cast<StorageType*>(base);
  1307. // Local references to make debugger stepping easier. If in a debugger,
  1308. // you really want to warp ahead and step through the
  1309. // InvokeHelper<>::MakeItSo() call below.
  1310. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1311. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1312. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1313. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  1314. typename Bound1UnwrapTraits::ForwardType x1 =
  1315. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1316. typename Bound2UnwrapTraits::ForwardType x2 =
  1317. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1318. typename Bound3UnwrapTraits::ForwardType x3 =
  1319. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1320. typename Bound4UnwrapTraits::ForwardType x4 =
  1321. Bound4UnwrapTraits::Unwrap(storage->p4_);
  1322. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1323. typename StorageType::RunnableType,
  1324. void(typename Bound1UnwrapTraits::ForwardType,
  1325. typename Bound2UnwrapTraits::ForwardType,
  1326. typename Bound3UnwrapTraits::ForwardType,
  1327. typename Bound4UnwrapTraits::ForwardType)>
  1328. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1329. CallbackForward(x2), CallbackForward(x3),
  1330. CallbackForward(x4));
  1331. }
  1332. };
  1333. // Arity 5 -> 5.
  1334. template <typename StorageType, typename R,typename X1, typename X2,
  1335. typename X3, typename X4, typename X5>
  1336. struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5)> {
  1337. typedef R(RunType)(BindStateBase*,
  1338. typename CallbackParamTraits<X1>::ForwardType,
  1339. typename CallbackParamTraits<X2>::ForwardType,
  1340. typename CallbackParamTraits<X3>::ForwardType,
  1341. typename CallbackParamTraits<X4>::ForwardType,
  1342. typename CallbackParamTraits<X5>::ForwardType);
  1343. typedef R(UnboundRunType)(X1, X2, X3, X4, X5);
  1344. static R Run(BindStateBase* base,
  1345. typename CallbackParamTraits<X1>::ForwardType x1,
  1346. typename CallbackParamTraits<X2>::ForwardType x2,
  1347. typename CallbackParamTraits<X3>::ForwardType x3,
  1348. typename CallbackParamTraits<X4>::ForwardType x4,
  1349. typename CallbackParamTraits<X5>::ForwardType x5) {
  1350. StorageType* storage = static_cast<StorageType*>(base);
  1351. // Local references to make debugger stepping easier. If in a debugger,
  1352. // you really want to warp ahead and step through the
  1353. // InvokeHelper<>::MakeItSo() call below.
  1354. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1355. typename StorageType::RunnableType,
  1356. void(typename CallbackParamTraits<X1>::ForwardType x1,
  1357. typename CallbackParamTraits<X2>::ForwardType x2,
  1358. typename CallbackParamTraits<X3>::ForwardType x3,
  1359. typename CallbackParamTraits<X4>::ForwardType x4,
  1360. typename CallbackParamTraits<X5>::ForwardType x5)>
  1361. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1362. CallbackForward(x2), CallbackForward(x3),
  1363. CallbackForward(x4), CallbackForward(x5));
  1364. }
  1365. };
  1366. // Arity 5 -> 4.
  1367. template <typename StorageType, typename R,typename X1, typename X2,
  1368. typename X3, typename X4, typename X5>
  1369. struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5)> {
  1370. typedef R(RunType)(BindStateBase*,
  1371. typename CallbackParamTraits<X2>::ForwardType,
  1372. typename CallbackParamTraits<X3>::ForwardType,
  1373. typename CallbackParamTraits<X4>::ForwardType,
  1374. typename CallbackParamTraits<X5>::ForwardType);
  1375. typedef R(UnboundRunType)(X2, X3, X4, X5);
  1376. static R Run(BindStateBase* base,
  1377. typename CallbackParamTraits<X2>::ForwardType x2,
  1378. typename CallbackParamTraits<X3>::ForwardType x3,
  1379. typename CallbackParamTraits<X4>::ForwardType x4,
  1380. typename CallbackParamTraits<X5>::ForwardType x5) {
  1381. StorageType* storage = static_cast<StorageType*>(base);
  1382. // Local references to make debugger stepping easier. If in a debugger,
  1383. // you really want to warp ahead and step through the
  1384. // InvokeHelper<>::MakeItSo() call below.
  1385. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1386. typename Bound1UnwrapTraits::ForwardType x1 =
  1387. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1388. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1389. typename StorageType::RunnableType,
  1390. void(typename Bound1UnwrapTraits::ForwardType,
  1391. typename CallbackParamTraits<X2>::ForwardType x2,
  1392. typename CallbackParamTraits<X3>::ForwardType x3,
  1393. typename CallbackParamTraits<X4>::ForwardType x4,
  1394. typename CallbackParamTraits<X5>::ForwardType x5)>
  1395. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1396. CallbackForward(x2), CallbackForward(x3),
  1397. CallbackForward(x4), CallbackForward(x5));
  1398. }
  1399. };
  1400. // Arity 5 -> 3.
  1401. template <typename StorageType, typename R,typename X1, typename X2,
  1402. typename X3, typename X4, typename X5>
  1403. struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5)> {
  1404. typedef R(RunType)(BindStateBase*,
  1405. typename CallbackParamTraits<X3>::ForwardType,
  1406. typename CallbackParamTraits<X4>::ForwardType,
  1407. typename CallbackParamTraits<X5>::ForwardType);
  1408. typedef R(UnboundRunType)(X3, X4, X5);
  1409. static R Run(BindStateBase* base,
  1410. typename CallbackParamTraits<X3>::ForwardType x3,
  1411. typename CallbackParamTraits<X4>::ForwardType x4,
  1412. typename CallbackParamTraits<X5>::ForwardType x5) {
  1413. StorageType* storage = static_cast<StorageType*>(base);
  1414. // Local references to make debugger stepping easier. If in a debugger,
  1415. // you really want to warp ahead and step through the
  1416. // InvokeHelper<>::MakeItSo() call below.
  1417. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1418. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1419. typename Bound1UnwrapTraits::ForwardType x1 =
  1420. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1421. typename Bound2UnwrapTraits::ForwardType x2 =
  1422. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1423. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1424. typename StorageType::RunnableType,
  1425. void(typename Bound1UnwrapTraits::ForwardType,
  1426. typename Bound2UnwrapTraits::ForwardType,
  1427. typename CallbackParamTraits<X3>::ForwardType x3,
  1428. typename CallbackParamTraits<X4>::ForwardType x4,
  1429. typename CallbackParamTraits<X5>::ForwardType x5)>
  1430. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1431. CallbackForward(x2), CallbackForward(x3),
  1432. CallbackForward(x4), CallbackForward(x5));
  1433. }
  1434. };
  1435. // Arity 5 -> 2.
  1436. template <typename StorageType, typename R,typename X1, typename X2,
  1437. typename X3, typename X4, typename X5>
  1438. struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5)> {
  1439. typedef R(RunType)(BindStateBase*,
  1440. typename CallbackParamTraits<X4>::ForwardType,
  1441. typename CallbackParamTraits<X5>::ForwardType);
  1442. typedef R(UnboundRunType)(X4, X5);
  1443. static R Run(BindStateBase* base,
  1444. typename CallbackParamTraits<X4>::ForwardType x4,
  1445. typename CallbackParamTraits<X5>::ForwardType x5) {
  1446. StorageType* storage = static_cast<StorageType*>(base);
  1447. // Local references to make debugger stepping easier. If in a debugger,
  1448. // you really want to warp ahead and step through the
  1449. // InvokeHelper<>::MakeItSo() call below.
  1450. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1451. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1452. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1453. typename Bound1UnwrapTraits::ForwardType x1 =
  1454. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1455. typename Bound2UnwrapTraits::ForwardType x2 =
  1456. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1457. typename Bound3UnwrapTraits::ForwardType x3 =
  1458. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1459. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1460. typename StorageType::RunnableType,
  1461. void(typename Bound1UnwrapTraits::ForwardType,
  1462. typename Bound2UnwrapTraits::ForwardType,
  1463. typename Bound3UnwrapTraits::ForwardType,
  1464. typename CallbackParamTraits<X4>::ForwardType x4,
  1465. typename CallbackParamTraits<X5>::ForwardType x5)>
  1466. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1467. CallbackForward(x2), CallbackForward(x3),
  1468. CallbackForward(x4), CallbackForward(x5));
  1469. }
  1470. };
  1471. // Arity 5 -> 1.
  1472. template <typename StorageType, typename R,typename X1, typename X2,
  1473. typename X3, typename X4, typename X5>
  1474. struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5)> {
  1475. typedef R(RunType)(BindStateBase*,
  1476. typename CallbackParamTraits<X5>::ForwardType);
  1477. typedef R(UnboundRunType)(X5);
  1478. static R Run(BindStateBase* base,
  1479. typename CallbackParamTraits<X5>::ForwardType x5) {
  1480. StorageType* storage = static_cast<StorageType*>(base);
  1481. // Local references to make debugger stepping easier. If in a debugger,
  1482. // you really want to warp ahead and step through the
  1483. // InvokeHelper<>::MakeItSo() call below.
  1484. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1485. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1486. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1487. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  1488. typename Bound1UnwrapTraits::ForwardType x1 =
  1489. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1490. typename Bound2UnwrapTraits::ForwardType x2 =
  1491. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1492. typename Bound3UnwrapTraits::ForwardType x3 =
  1493. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1494. typename Bound4UnwrapTraits::ForwardType x4 =
  1495. Bound4UnwrapTraits::Unwrap(storage->p4_);
  1496. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1497. typename StorageType::RunnableType,
  1498. void(typename Bound1UnwrapTraits::ForwardType,
  1499. typename Bound2UnwrapTraits::ForwardType,
  1500. typename Bound3UnwrapTraits::ForwardType,
  1501. typename Bound4UnwrapTraits::ForwardType,
  1502. typename CallbackParamTraits<X5>::ForwardType x5)>
  1503. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1504. CallbackForward(x2), CallbackForward(x3),
  1505. CallbackForward(x4), CallbackForward(x5));
  1506. }
  1507. };
  1508. // Arity 5 -> 0.
  1509. template <typename StorageType, typename R,typename X1, typename X2,
  1510. typename X3, typename X4, typename X5>
  1511. struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5)> {
  1512. typedef R(RunType)(BindStateBase*);
  1513. typedef R(UnboundRunType)();
  1514. static R Run(BindStateBase* base) {
  1515. StorageType* storage = static_cast<StorageType*>(base);
  1516. // Local references to make debugger stepping easier. If in a debugger,
  1517. // you really want to warp ahead and step through the
  1518. // InvokeHelper<>::MakeItSo() call below.
  1519. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1520. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1521. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1522. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  1523. typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
  1524. typename Bound1UnwrapTraits::ForwardType x1 =
  1525. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1526. typename Bound2UnwrapTraits::ForwardType x2 =
  1527. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1528. typename Bound3UnwrapTraits::ForwardType x3 =
  1529. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1530. typename Bound4UnwrapTraits::ForwardType x4 =
  1531. Bound4UnwrapTraits::Unwrap(storage->p4_);
  1532. typename Bound5UnwrapTraits::ForwardType x5 =
  1533. Bound5UnwrapTraits::Unwrap(storage->p5_);
  1534. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1535. typename StorageType::RunnableType,
  1536. void(typename Bound1UnwrapTraits::ForwardType,
  1537. typename Bound2UnwrapTraits::ForwardType,
  1538. typename Bound3UnwrapTraits::ForwardType,
  1539. typename Bound4UnwrapTraits::ForwardType,
  1540. typename Bound5UnwrapTraits::ForwardType)>
  1541. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1542. CallbackForward(x2), CallbackForward(x3),
  1543. CallbackForward(x4), CallbackForward(x5));
  1544. }
  1545. };
  1546. // Arity 6 -> 6.
  1547. template <typename StorageType, typename R,typename X1, typename X2,
  1548. typename X3, typename X4, typename X5, typename X6>
  1549. struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1550. typedef R(RunType)(BindStateBase*,
  1551. typename CallbackParamTraits<X1>::ForwardType,
  1552. typename CallbackParamTraits<X2>::ForwardType,
  1553. typename CallbackParamTraits<X3>::ForwardType,
  1554. typename CallbackParamTraits<X4>::ForwardType,
  1555. typename CallbackParamTraits<X5>::ForwardType,
  1556. typename CallbackParamTraits<X6>::ForwardType);
  1557. typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6);
  1558. static R Run(BindStateBase* base,
  1559. typename CallbackParamTraits<X1>::ForwardType x1,
  1560. typename CallbackParamTraits<X2>::ForwardType x2,
  1561. typename CallbackParamTraits<X3>::ForwardType x3,
  1562. typename CallbackParamTraits<X4>::ForwardType x4,
  1563. typename CallbackParamTraits<X5>::ForwardType x5,
  1564. typename CallbackParamTraits<X6>::ForwardType x6) {
  1565. StorageType* storage = static_cast<StorageType*>(base);
  1566. // Local references to make debugger stepping easier. If in a debugger,
  1567. // you really want to warp ahead and step through the
  1568. // InvokeHelper<>::MakeItSo() call below.
  1569. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1570. typename StorageType::RunnableType,
  1571. void(typename CallbackParamTraits<X1>::ForwardType x1,
  1572. typename CallbackParamTraits<X2>::ForwardType x2,
  1573. typename CallbackParamTraits<X3>::ForwardType x3,
  1574. typename CallbackParamTraits<X4>::ForwardType x4,
  1575. typename CallbackParamTraits<X5>::ForwardType x5,
  1576. typename CallbackParamTraits<X6>::ForwardType x6)>
  1577. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1578. CallbackForward(x2), CallbackForward(x3),
  1579. CallbackForward(x4), CallbackForward(x5),
  1580. CallbackForward(x6));
  1581. }
  1582. };
  1583. // Arity 6 -> 5.
  1584. template <typename StorageType, typename R,typename X1, typename X2,
  1585. typename X3, typename X4, typename X5, typename X6>
  1586. struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1587. typedef R(RunType)(BindStateBase*,
  1588. typename CallbackParamTraits<X2>::ForwardType,
  1589. typename CallbackParamTraits<X3>::ForwardType,
  1590. typename CallbackParamTraits<X4>::ForwardType,
  1591. typename CallbackParamTraits<X5>::ForwardType,
  1592. typename CallbackParamTraits<X6>::ForwardType);
  1593. typedef R(UnboundRunType)(X2, X3, X4, X5, X6);
  1594. static R Run(BindStateBase* base,
  1595. typename CallbackParamTraits<X2>::ForwardType x2,
  1596. typename CallbackParamTraits<X3>::ForwardType x3,
  1597. typename CallbackParamTraits<X4>::ForwardType x4,
  1598. typename CallbackParamTraits<X5>::ForwardType x5,
  1599. typename CallbackParamTraits<X6>::ForwardType x6) {
  1600. StorageType* storage = static_cast<StorageType*>(base);
  1601. // Local references to make debugger stepping easier. If in a debugger,
  1602. // you really want to warp ahead and step through the
  1603. // InvokeHelper<>::MakeItSo() call below.
  1604. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1605. typename Bound1UnwrapTraits::ForwardType x1 =
  1606. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1607. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1608. typename StorageType::RunnableType,
  1609. void(typename Bound1UnwrapTraits::ForwardType,
  1610. typename CallbackParamTraits<X2>::ForwardType x2,
  1611. typename CallbackParamTraits<X3>::ForwardType x3,
  1612. typename CallbackParamTraits<X4>::ForwardType x4,
  1613. typename CallbackParamTraits<X5>::ForwardType x5,
  1614. typename CallbackParamTraits<X6>::ForwardType x6)>
  1615. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1616. CallbackForward(x2), CallbackForward(x3),
  1617. CallbackForward(x4), CallbackForward(x5),
  1618. CallbackForward(x6));
  1619. }
  1620. };
  1621. // Arity 6 -> 4.
  1622. template <typename StorageType, typename R,typename X1, typename X2,
  1623. typename X3, typename X4, typename X5, typename X6>
  1624. struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1625. typedef R(RunType)(BindStateBase*,
  1626. typename CallbackParamTraits<X3>::ForwardType,
  1627. typename CallbackParamTraits<X4>::ForwardType,
  1628. typename CallbackParamTraits<X5>::ForwardType,
  1629. typename CallbackParamTraits<X6>::ForwardType);
  1630. typedef R(UnboundRunType)(X3, X4, X5, X6);
  1631. static R Run(BindStateBase* base,
  1632. typename CallbackParamTraits<X3>::ForwardType x3,
  1633. typename CallbackParamTraits<X4>::ForwardType x4,
  1634. typename CallbackParamTraits<X5>::ForwardType x5,
  1635. typename CallbackParamTraits<X6>::ForwardType x6) {
  1636. StorageType* storage = static_cast<StorageType*>(base);
  1637. // Local references to make debugger stepping easier. If in a debugger,
  1638. // you really want to warp ahead and step through the
  1639. // InvokeHelper<>::MakeItSo() call below.
  1640. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1641. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1642. typename Bound1UnwrapTraits::ForwardType x1 =
  1643. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1644. typename Bound2UnwrapTraits::ForwardType x2 =
  1645. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1646. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1647. typename StorageType::RunnableType,
  1648. void(typename Bound1UnwrapTraits::ForwardType,
  1649. typename Bound2UnwrapTraits::ForwardType,
  1650. typename CallbackParamTraits<X3>::ForwardType x3,
  1651. typename CallbackParamTraits<X4>::ForwardType x4,
  1652. typename CallbackParamTraits<X5>::ForwardType x5,
  1653. typename CallbackParamTraits<X6>::ForwardType x6)>
  1654. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1655. CallbackForward(x2), CallbackForward(x3),
  1656. CallbackForward(x4), CallbackForward(x5),
  1657. CallbackForward(x6));
  1658. }
  1659. };
  1660. // Arity 6 -> 3.
  1661. template <typename StorageType, typename R,typename X1, typename X2,
  1662. typename X3, typename X4, typename X5, typename X6>
  1663. struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1664. typedef R(RunType)(BindStateBase*,
  1665. typename CallbackParamTraits<X4>::ForwardType,
  1666. typename CallbackParamTraits<X5>::ForwardType,
  1667. typename CallbackParamTraits<X6>::ForwardType);
  1668. typedef R(UnboundRunType)(X4, X5, X6);
  1669. static R Run(BindStateBase* base,
  1670. typename CallbackParamTraits<X4>::ForwardType x4,
  1671. typename CallbackParamTraits<X5>::ForwardType x5,
  1672. typename CallbackParamTraits<X6>::ForwardType x6) {
  1673. StorageType* storage = static_cast<StorageType*>(base);
  1674. // Local references to make debugger stepping easier. If in a debugger,
  1675. // you really want to warp ahead and step through the
  1676. // InvokeHelper<>::MakeItSo() call below.
  1677. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1678. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1679. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1680. typename Bound1UnwrapTraits::ForwardType x1 =
  1681. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1682. typename Bound2UnwrapTraits::ForwardType x2 =
  1683. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1684. typename Bound3UnwrapTraits::ForwardType x3 =
  1685. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1686. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1687. typename StorageType::RunnableType,
  1688. void(typename Bound1UnwrapTraits::ForwardType,
  1689. typename Bound2UnwrapTraits::ForwardType,
  1690. typename Bound3UnwrapTraits::ForwardType,
  1691. typename CallbackParamTraits<X4>::ForwardType x4,
  1692. typename CallbackParamTraits<X5>::ForwardType x5,
  1693. typename CallbackParamTraits<X6>::ForwardType x6)>
  1694. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1695. CallbackForward(x2), CallbackForward(x3),
  1696. CallbackForward(x4), CallbackForward(x5),
  1697. CallbackForward(x6));
  1698. }
  1699. };
  1700. // Arity 6 -> 2.
  1701. template <typename StorageType, typename R,typename X1, typename X2,
  1702. typename X3, typename X4, typename X5, typename X6>
  1703. struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1704. typedef R(RunType)(BindStateBase*,
  1705. typename CallbackParamTraits<X5>::ForwardType,
  1706. typename CallbackParamTraits<X6>::ForwardType);
  1707. typedef R(UnboundRunType)(X5, X6);
  1708. static R Run(BindStateBase* base,
  1709. typename CallbackParamTraits<X5>::ForwardType x5,
  1710. typename CallbackParamTraits<X6>::ForwardType x6) {
  1711. StorageType* storage = static_cast<StorageType*>(base);
  1712. // Local references to make debugger stepping easier. If in a debugger,
  1713. // you really want to warp ahead and step through the
  1714. // InvokeHelper<>::MakeItSo() call below.
  1715. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1716. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1717. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1718. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  1719. typename Bound1UnwrapTraits::ForwardType x1 =
  1720. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1721. typename Bound2UnwrapTraits::ForwardType x2 =
  1722. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1723. typename Bound3UnwrapTraits::ForwardType x3 =
  1724. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1725. typename Bound4UnwrapTraits::ForwardType x4 =
  1726. Bound4UnwrapTraits::Unwrap(storage->p4_);
  1727. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1728. typename StorageType::RunnableType,
  1729. void(typename Bound1UnwrapTraits::ForwardType,
  1730. typename Bound2UnwrapTraits::ForwardType,
  1731. typename Bound3UnwrapTraits::ForwardType,
  1732. typename Bound4UnwrapTraits::ForwardType,
  1733. typename CallbackParamTraits<X5>::ForwardType x5,
  1734. typename CallbackParamTraits<X6>::ForwardType x6)>
  1735. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1736. CallbackForward(x2), CallbackForward(x3),
  1737. CallbackForward(x4), CallbackForward(x5),
  1738. CallbackForward(x6));
  1739. }
  1740. };
  1741. // Arity 6 -> 1.
  1742. template <typename StorageType, typename R,typename X1, typename X2,
  1743. typename X3, typename X4, typename X5, typename X6>
  1744. struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1745. typedef R(RunType)(BindStateBase*,
  1746. typename CallbackParamTraits<X6>::ForwardType);
  1747. typedef R(UnboundRunType)(X6);
  1748. static R Run(BindStateBase* base,
  1749. typename CallbackParamTraits<X6>::ForwardType x6) {
  1750. StorageType* storage = static_cast<StorageType*>(base);
  1751. // Local references to make debugger stepping easier. If in a debugger,
  1752. // you really want to warp ahead and step through the
  1753. // InvokeHelper<>::MakeItSo() call below.
  1754. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1755. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1756. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1757. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  1758. typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
  1759. typename Bound1UnwrapTraits::ForwardType x1 =
  1760. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1761. typename Bound2UnwrapTraits::ForwardType x2 =
  1762. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1763. typename Bound3UnwrapTraits::ForwardType x3 =
  1764. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1765. typename Bound4UnwrapTraits::ForwardType x4 =
  1766. Bound4UnwrapTraits::Unwrap(storage->p4_);
  1767. typename Bound5UnwrapTraits::ForwardType x5 =
  1768. Bound5UnwrapTraits::Unwrap(storage->p5_);
  1769. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1770. typename StorageType::RunnableType,
  1771. void(typename Bound1UnwrapTraits::ForwardType,
  1772. typename Bound2UnwrapTraits::ForwardType,
  1773. typename Bound3UnwrapTraits::ForwardType,
  1774. typename Bound4UnwrapTraits::ForwardType,
  1775. typename Bound5UnwrapTraits::ForwardType,
  1776. typename CallbackParamTraits<X6>::ForwardType x6)>
  1777. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1778. CallbackForward(x2), CallbackForward(x3),
  1779. CallbackForward(x4), CallbackForward(x5),
  1780. CallbackForward(x6));
  1781. }
  1782. };
  1783. // Arity 6 -> 0.
  1784. template <typename StorageType, typename R,typename X1, typename X2,
  1785. typename X3, typename X4, typename X5, typename X6>
  1786. struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6)> {
  1787. typedef R(RunType)(BindStateBase*);
  1788. typedef R(UnboundRunType)();
  1789. static R Run(BindStateBase* base) {
  1790. StorageType* storage = static_cast<StorageType*>(base);
  1791. // Local references to make debugger stepping easier. If in a debugger,
  1792. // you really want to warp ahead and step through the
  1793. // InvokeHelper<>::MakeItSo() call below.
  1794. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1795. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1796. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1797. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  1798. typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
  1799. typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
  1800. typename Bound1UnwrapTraits::ForwardType x1 =
  1801. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1802. typename Bound2UnwrapTraits::ForwardType x2 =
  1803. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1804. typename Bound3UnwrapTraits::ForwardType x3 =
  1805. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1806. typename Bound4UnwrapTraits::ForwardType x4 =
  1807. Bound4UnwrapTraits::Unwrap(storage->p4_);
  1808. typename Bound5UnwrapTraits::ForwardType x5 =
  1809. Bound5UnwrapTraits::Unwrap(storage->p5_);
  1810. typename Bound6UnwrapTraits::ForwardType x6 =
  1811. Bound6UnwrapTraits::Unwrap(storage->p6_);
  1812. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1813. typename StorageType::RunnableType,
  1814. void(typename Bound1UnwrapTraits::ForwardType,
  1815. typename Bound2UnwrapTraits::ForwardType,
  1816. typename Bound3UnwrapTraits::ForwardType,
  1817. typename Bound4UnwrapTraits::ForwardType,
  1818. typename Bound5UnwrapTraits::ForwardType,
  1819. typename Bound6UnwrapTraits::ForwardType)>
  1820. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1821. CallbackForward(x2), CallbackForward(x3),
  1822. CallbackForward(x4), CallbackForward(x5),
  1823. CallbackForward(x6));
  1824. }
  1825. };
  1826. // Arity 7 -> 7.
  1827. template <typename StorageType, typename R,typename X1, typename X2,
  1828. typename X3, typename X4, typename X5, typename X6, typename X7>
  1829. struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  1830. typedef R(RunType)(BindStateBase*,
  1831. typename CallbackParamTraits<X1>::ForwardType,
  1832. typename CallbackParamTraits<X2>::ForwardType,
  1833. typename CallbackParamTraits<X3>::ForwardType,
  1834. typename CallbackParamTraits<X4>::ForwardType,
  1835. typename CallbackParamTraits<X5>::ForwardType,
  1836. typename CallbackParamTraits<X6>::ForwardType,
  1837. typename CallbackParamTraits<X7>::ForwardType);
  1838. typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6, X7);
  1839. static R Run(BindStateBase* base,
  1840. typename CallbackParamTraits<X1>::ForwardType x1,
  1841. typename CallbackParamTraits<X2>::ForwardType x2,
  1842. typename CallbackParamTraits<X3>::ForwardType x3,
  1843. typename CallbackParamTraits<X4>::ForwardType x4,
  1844. typename CallbackParamTraits<X5>::ForwardType x5,
  1845. typename CallbackParamTraits<X6>::ForwardType x6,
  1846. typename CallbackParamTraits<X7>::ForwardType x7) {
  1847. StorageType* storage = static_cast<StorageType*>(base);
  1848. // Local references to make debugger stepping easier. If in a debugger,
  1849. // you really want to warp ahead and step through the
  1850. // InvokeHelper<>::MakeItSo() call below.
  1851. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1852. typename StorageType::RunnableType,
  1853. void(typename CallbackParamTraits<X1>::ForwardType x1,
  1854. typename CallbackParamTraits<X2>::ForwardType x2,
  1855. typename CallbackParamTraits<X3>::ForwardType x3,
  1856. typename CallbackParamTraits<X4>::ForwardType x4,
  1857. typename CallbackParamTraits<X5>::ForwardType x5,
  1858. typename CallbackParamTraits<X6>::ForwardType x6,
  1859. typename CallbackParamTraits<X7>::ForwardType x7)>
  1860. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1861. CallbackForward(x2), CallbackForward(x3),
  1862. CallbackForward(x4), CallbackForward(x5),
  1863. CallbackForward(x6), CallbackForward(x7));
  1864. }
  1865. };
  1866. // Arity 7 -> 6.
  1867. template <typename StorageType, typename R,typename X1, typename X2,
  1868. typename X3, typename X4, typename X5, typename X6, typename X7>
  1869. struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  1870. typedef R(RunType)(BindStateBase*,
  1871. typename CallbackParamTraits<X2>::ForwardType,
  1872. typename CallbackParamTraits<X3>::ForwardType,
  1873. typename CallbackParamTraits<X4>::ForwardType,
  1874. typename CallbackParamTraits<X5>::ForwardType,
  1875. typename CallbackParamTraits<X6>::ForwardType,
  1876. typename CallbackParamTraits<X7>::ForwardType);
  1877. typedef R(UnboundRunType)(X2, X3, X4, X5, X6, X7);
  1878. static R Run(BindStateBase* base,
  1879. typename CallbackParamTraits<X2>::ForwardType x2,
  1880. typename CallbackParamTraits<X3>::ForwardType x3,
  1881. typename CallbackParamTraits<X4>::ForwardType x4,
  1882. typename CallbackParamTraits<X5>::ForwardType x5,
  1883. typename CallbackParamTraits<X6>::ForwardType x6,
  1884. typename CallbackParamTraits<X7>::ForwardType x7) {
  1885. StorageType* storage = static_cast<StorageType*>(base);
  1886. // Local references to make debugger stepping easier. If in a debugger,
  1887. // you really want to warp ahead and step through the
  1888. // InvokeHelper<>::MakeItSo() call below.
  1889. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1890. typename Bound1UnwrapTraits::ForwardType x1 =
  1891. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1892. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1893. typename StorageType::RunnableType,
  1894. void(typename Bound1UnwrapTraits::ForwardType,
  1895. typename CallbackParamTraits<X2>::ForwardType x2,
  1896. typename CallbackParamTraits<X3>::ForwardType x3,
  1897. typename CallbackParamTraits<X4>::ForwardType x4,
  1898. typename CallbackParamTraits<X5>::ForwardType x5,
  1899. typename CallbackParamTraits<X6>::ForwardType x6,
  1900. typename CallbackParamTraits<X7>::ForwardType x7)>
  1901. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1902. CallbackForward(x2), CallbackForward(x3),
  1903. CallbackForward(x4), CallbackForward(x5),
  1904. CallbackForward(x6), CallbackForward(x7));
  1905. }
  1906. };
  1907. // Arity 7 -> 5.
  1908. template <typename StorageType, typename R,typename X1, typename X2,
  1909. typename X3, typename X4, typename X5, typename X6, typename X7>
  1910. struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  1911. typedef R(RunType)(BindStateBase*,
  1912. typename CallbackParamTraits<X3>::ForwardType,
  1913. typename CallbackParamTraits<X4>::ForwardType,
  1914. typename CallbackParamTraits<X5>::ForwardType,
  1915. typename CallbackParamTraits<X6>::ForwardType,
  1916. typename CallbackParamTraits<X7>::ForwardType);
  1917. typedef R(UnboundRunType)(X3, X4, X5, X6, X7);
  1918. static R Run(BindStateBase* base,
  1919. typename CallbackParamTraits<X3>::ForwardType x3,
  1920. typename CallbackParamTraits<X4>::ForwardType x4,
  1921. typename CallbackParamTraits<X5>::ForwardType x5,
  1922. typename CallbackParamTraits<X6>::ForwardType x6,
  1923. typename CallbackParamTraits<X7>::ForwardType x7) {
  1924. StorageType* storage = static_cast<StorageType*>(base);
  1925. // Local references to make debugger stepping easier. If in a debugger,
  1926. // you really want to warp ahead and step through the
  1927. // InvokeHelper<>::MakeItSo() call below.
  1928. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1929. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1930. typename Bound1UnwrapTraits::ForwardType x1 =
  1931. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1932. typename Bound2UnwrapTraits::ForwardType x2 =
  1933. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1934. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1935. typename StorageType::RunnableType,
  1936. void(typename Bound1UnwrapTraits::ForwardType,
  1937. typename Bound2UnwrapTraits::ForwardType,
  1938. typename CallbackParamTraits<X3>::ForwardType x3,
  1939. typename CallbackParamTraits<X4>::ForwardType x4,
  1940. typename CallbackParamTraits<X5>::ForwardType x5,
  1941. typename CallbackParamTraits<X6>::ForwardType x6,
  1942. typename CallbackParamTraits<X7>::ForwardType x7)>
  1943. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1944. CallbackForward(x2), CallbackForward(x3),
  1945. CallbackForward(x4), CallbackForward(x5),
  1946. CallbackForward(x6), CallbackForward(x7));
  1947. }
  1948. };
  1949. // Arity 7 -> 4.
  1950. template <typename StorageType, typename R,typename X1, typename X2,
  1951. typename X3, typename X4, typename X5, typename X6, typename X7>
  1952. struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  1953. typedef R(RunType)(BindStateBase*,
  1954. typename CallbackParamTraits<X4>::ForwardType,
  1955. typename CallbackParamTraits<X5>::ForwardType,
  1956. typename CallbackParamTraits<X6>::ForwardType,
  1957. typename CallbackParamTraits<X7>::ForwardType);
  1958. typedef R(UnboundRunType)(X4, X5, X6, X7);
  1959. static R Run(BindStateBase* base,
  1960. typename CallbackParamTraits<X4>::ForwardType x4,
  1961. typename CallbackParamTraits<X5>::ForwardType x5,
  1962. typename CallbackParamTraits<X6>::ForwardType x6,
  1963. typename CallbackParamTraits<X7>::ForwardType x7) {
  1964. StorageType* storage = static_cast<StorageType*>(base);
  1965. // Local references to make debugger stepping easier. If in a debugger,
  1966. // you really want to warp ahead and step through the
  1967. // InvokeHelper<>::MakeItSo() call below.
  1968. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  1969. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  1970. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  1971. typename Bound1UnwrapTraits::ForwardType x1 =
  1972. Bound1UnwrapTraits::Unwrap(storage->p1_);
  1973. typename Bound2UnwrapTraits::ForwardType x2 =
  1974. Bound2UnwrapTraits::Unwrap(storage->p2_);
  1975. typename Bound3UnwrapTraits::ForwardType x3 =
  1976. Bound3UnwrapTraits::Unwrap(storage->p3_);
  1977. return InvokeHelper<StorageType::IsWeakCall::value, R,
  1978. typename StorageType::RunnableType,
  1979. void(typename Bound1UnwrapTraits::ForwardType,
  1980. typename Bound2UnwrapTraits::ForwardType,
  1981. typename Bound3UnwrapTraits::ForwardType,
  1982. typename CallbackParamTraits<X4>::ForwardType x4,
  1983. typename CallbackParamTraits<X5>::ForwardType x5,
  1984. typename CallbackParamTraits<X6>::ForwardType x6,
  1985. typename CallbackParamTraits<X7>::ForwardType x7)>
  1986. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  1987. CallbackForward(x2), CallbackForward(x3),
  1988. CallbackForward(x4), CallbackForward(x5),
  1989. CallbackForward(x6), CallbackForward(x7));
  1990. }
  1991. };
  1992. // Arity 7 -> 3.
  1993. template <typename StorageType, typename R,typename X1, typename X2,
  1994. typename X3, typename X4, typename X5, typename X6, typename X7>
  1995. struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  1996. typedef R(RunType)(BindStateBase*,
  1997. typename CallbackParamTraits<X5>::ForwardType,
  1998. typename CallbackParamTraits<X6>::ForwardType,
  1999. typename CallbackParamTraits<X7>::ForwardType);
  2000. typedef R(UnboundRunType)(X5, X6, X7);
  2001. static R Run(BindStateBase* base,
  2002. typename CallbackParamTraits<X5>::ForwardType x5,
  2003. typename CallbackParamTraits<X6>::ForwardType x6,
  2004. typename CallbackParamTraits<X7>::ForwardType x7) {
  2005. StorageType* storage = static_cast<StorageType*>(base);
  2006. // Local references to make debugger stepping easier. If in a debugger,
  2007. // you really want to warp ahead and step through the
  2008. // InvokeHelper<>::MakeItSo() call below.
  2009. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  2010. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  2011. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  2012. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  2013. typename Bound1UnwrapTraits::ForwardType x1 =
  2014. Bound1UnwrapTraits::Unwrap(storage->p1_);
  2015. typename Bound2UnwrapTraits::ForwardType x2 =
  2016. Bound2UnwrapTraits::Unwrap(storage->p2_);
  2017. typename Bound3UnwrapTraits::ForwardType x3 =
  2018. Bound3UnwrapTraits::Unwrap(storage->p3_);
  2019. typename Bound4UnwrapTraits::ForwardType x4 =
  2020. Bound4UnwrapTraits::Unwrap(storage->p4_);
  2021. return InvokeHelper<StorageType::IsWeakCall::value, R,
  2022. typename StorageType::RunnableType,
  2023. void(typename Bound1UnwrapTraits::ForwardType,
  2024. typename Bound2UnwrapTraits::ForwardType,
  2025. typename Bound3UnwrapTraits::ForwardType,
  2026. typename Bound4UnwrapTraits::ForwardType,
  2027. typename CallbackParamTraits<X5>::ForwardType x5,
  2028. typename CallbackParamTraits<X6>::ForwardType x6,
  2029. typename CallbackParamTraits<X7>::ForwardType x7)>
  2030. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  2031. CallbackForward(x2), CallbackForward(x3),
  2032. CallbackForward(x4), CallbackForward(x5),
  2033. CallbackForward(x6), CallbackForward(x7));
  2034. }
  2035. };
  2036. // Arity 7 -> 2.
  2037. template <typename StorageType, typename R,typename X1, typename X2,
  2038. typename X3, typename X4, typename X5, typename X6, typename X7>
  2039. struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  2040. typedef R(RunType)(BindStateBase*,
  2041. typename CallbackParamTraits<X6>::ForwardType,
  2042. typename CallbackParamTraits<X7>::ForwardType);
  2043. typedef R(UnboundRunType)(X6, X7);
  2044. static R Run(BindStateBase* base,
  2045. typename CallbackParamTraits<X6>::ForwardType x6,
  2046. typename CallbackParamTraits<X7>::ForwardType x7) {
  2047. StorageType* storage = static_cast<StorageType*>(base);
  2048. // Local references to make debugger stepping easier. If in a debugger,
  2049. // you really want to warp ahead and step through the
  2050. // InvokeHelper<>::MakeItSo() call below.
  2051. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  2052. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  2053. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  2054. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  2055. typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
  2056. typename Bound1UnwrapTraits::ForwardType x1 =
  2057. Bound1UnwrapTraits::Unwrap(storage->p1_);
  2058. typename Bound2UnwrapTraits::ForwardType x2 =
  2059. Bound2UnwrapTraits::Unwrap(storage->p2_);
  2060. typename Bound3UnwrapTraits::ForwardType x3 =
  2061. Bound3UnwrapTraits::Unwrap(storage->p3_);
  2062. typename Bound4UnwrapTraits::ForwardType x4 =
  2063. Bound4UnwrapTraits::Unwrap(storage->p4_);
  2064. typename Bound5UnwrapTraits::ForwardType x5 =
  2065. Bound5UnwrapTraits::Unwrap(storage->p5_);
  2066. return InvokeHelper<StorageType::IsWeakCall::value, R,
  2067. typename StorageType::RunnableType,
  2068. void(typename Bound1UnwrapTraits::ForwardType,
  2069. typename Bound2UnwrapTraits::ForwardType,
  2070. typename Bound3UnwrapTraits::ForwardType,
  2071. typename Bound4UnwrapTraits::ForwardType,
  2072. typename Bound5UnwrapTraits::ForwardType,
  2073. typename CallbackParamTraits<X6>::ForwardType x6,
  2074. typename CallbackParamTraits<X7>::ForwardType x7)>
  2075. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  2076. CallbackForward(x2), CallbackForward(x3),
  2077. CallbackForward(x4), CallbackForward(x5),
  2078. CallbackForward(x6), CallbackForward(x7));
  2079. }
  2080. };
  2081. // Arity 7 -> 1.
  2082. template <typename StorageType, typename R,typename X1, typename X2,
  2083. typename X3, typename X4, typename X5, typename X6, typename X7>
  2084. struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  2085. typedef R(RunType)(BindStateBase*,
  2086. typename CallbackParamTraits<X7>::ForwardType);
  2087. typedef R(UnboundRunType)(X7);
  2088. static R Run(BindStateBase* base,
  2089. typename CallbackParamTraits<X7>::ForwardType x7) {
  2090. StorageType* storage = static_cast<StorageType*>(base);
  2091. // Local references to make debugger stepping easier. If in a debugger,
  2092. // you really want to warp ahead and step through the
  2093. // InvokeHelper<>::MakeItSo() call below.
  2094. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  2095. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  2096. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  2097. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  2098. typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
  2099. typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
  2100. typename Bound1UnwrapTraits::ForwardType x1 =
  2101. Bound1UnwrapTraits::Unwrap(storage->p1_);
  2102. typename Bound2UnwrapTraits::ForwardType x2 =
  2103. Bound2UnwrapTraits::Unwrap(storage->p2_);
  2104. typename Bound3UnwrapTraits::ForwardType x3 =
  2105. Bound3UnwrapTraits::Unwrap(storage->p3_);
  2106. typename Bound4UnwrapTraits::ForwardType x4 =
  2107. Bound4UnwrapTraits::Unwrap(storage->p4_);
  2108. typename Bound5UnwrapTraits::ForwardType x5 =
  2109. Bound5UnwrapTraits::Unwrap(storage->p5_);
  2110. typename Bound6UnwrapTraits::ForwardType x6 =
  2111. Bound6UnwrapTraits::Unwrap(storage->p6_);
  2112. return InvokeHelper<StorageType::IsWeakCall::value, R,
  2113. typename StorageType::RunnableType,
  2114. void(typename Bound1UnwrapTraits::ForwardType,
  2115. typename Bound2UnwrapTraits::ForwardType,
  2116. typename Bound3UnwrapTraits::ForwardType,
  2117. typename Bound4UnwrapTraits::ForwardType,
  2118. typename Bound5UnwrapTraits::ForwardType,
  2119. typename Bound6UnwrapTraits::ForwardType,
  2120. typename CallbackParamTraits<X7>::ForwardType x7)>
  2121. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  2122. CallbackForward(x2), CallbackForward(x3),
  2123. CallbackForward(x4), CallbackForward(x5),
  2124. CallbackForward(x6), CallbackForward(x7));
  2125. }
  2126. };
  2127. // Arity 7 -> 0.
  2128. template <typename StorageType, typename R,typename X1, typename X2,
  2129. typename X3, typename X4, typename X5, typename X6, typename X7>
  2130. struct Invoker<7, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
  2131. typedef R(RunType)(BindStateBase*);
  2132. typedef R(UnboundRunType)();
  2133. static R Run(BindStateBase* base) {
  2134. StorageType* storage = static_cast<StorageType*>(base);
  2135. // Local references to make debugger stepping easier. If in a debugger,
  2136. // you really want to warp ahead and step through the
  2137. // InvokeHelper<>::MakeItSo() call below.
  2138. typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
  2139. typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
  2140. typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
  2141. typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
  2142. typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
  2143. typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
  2144. typedef typename StorageType::Bound7UnwrapTraits Bound7UnwrapTraits;
  2145. typename Bound1UnwrapTraits::ForwardType x1 =
  2146. Bound1UnwrapTraits::Unwrap(storage->p1_);
  2147. typename Bound2UnwrapTraits::ForwardType x2 =
  2148. Bound2UnwrapTraits::Unwrap(storage->p2_);
  2149. typename Bound3UnwrapTraits::ForwardType x3 =
  2150. Bound3UnwrapTraits::Unwrap(storage->p3_);
  2151. typename Bound4UnwrapTraits::ForwardType x4 =
  2152. Bound4UnwrapTraits::Unwrap(storage->p4_);
  2153. typename Bound5UnwrapTraits::ForwardType x5 =
  2154. Bound5UnwrapTraits::Unwrap(storage->p5_);
  2155. typename Bound6UnwrapTraits::ForwardType x6 =
  2156. Bound6UnwrapTraits::Unwrap(storage->p6_);
  2157. typename Bound7UnwrapTraits::ForwardType x7 =
  2158. Bound7UnwrapTraits::Unwrap(storage->p7_);
  2159. return InvokeHelper<StorageType::IsWeakCall::value, R,
  2160. typename StorageType::RunnableType,
  2161. void(typename Bound1UnwrapTraits::ForwardType,
  2162. typename Bound2UnwrapTraits::ForwardType,
  2163. typename Bound3UnwrapTraits::ForwardType,
  2164. typename Bound4UnwrapTraits::ForwardType,
  2165. typename Bound5UnwrapTraits::ForwardType,
  2166. typename Bound6UnwrapTraits::ForwardType,
  2167. typename Bound7UnwrapTraits::ForwardType)>
  2168. ::MakeItSo(storage->runnable_, CallbackForward(x1),
  2169. CallbackForward(x2), CallbackForward(x3),
  2170. CallbackForward(x4), CallbackForward(x5),
  2171. CallbackForward(x6), CallbackForward(x7));
  2172. }
  2173. };
  2174. // BindState<>
  2175. //
  2176. // This stores all the state passed into Bind() and is also where most
  2177. // of the template resolution magic occurs.
  2178. //
  2179. // Runnable is the functor we are binding arguments to.
  2180. // RunType is type of the Run() function that the Invoker<> should use.
  2181. // Normally, this is the same as the RunType of the Runnable, but it can
  2182. // be different if an adapter like IgnoreResult() has been used.
  2183. //
  2184. // BoundArgsType contains the storage type for all the bound arguments by
  2185. // (ab)using a function type.
  2186. template <typename Runnable, typename RunType, typename BoundArgsType>
  2187. struct BindState;
  2188. template <typename Runnable, typename RunType>
  2189. struct BindState<Runnable, RunType, void()> : public BindStateBase {
  2190. typedef Runnable RunnableType;
  2191. typedef false_type IsWeakCall;
  2192. typedef Invoker<0, BindState, RunType> InvokerType;
  2193. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2194. explicit BindState(const Runnable& runnable)
  2195. : runnable_(runnable) {
  2196. }
  2197. virtual ~BindState() { }
  2198. RunnableType runnable_;
  2199. };
  2200. template <typename Runnable, typename RunType, typename P1>
  2201. struct BindState<Runnable, RunType, void(P1)> : public BindStateBase {
  2202. typedef Runnable RunnableType;
  2203. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2204. typedef Invoker<1, BindState, RunType> InvokerType;
  2205. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2206. // Convenience typedefs for bound argument types.
  2207. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2208. BindState(const Runnable& runnable, const P1& p1)
  2209. : runnable_(runnable),
  2210. p1_(p1) {
  2211. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2212. }
  2213. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2214. P1>::Release(p1_); }
  2215. RunnableType runnable_;
  2216. P1 p1_;
  2217. };
  2218. template <typename Runnable, typename RunType, typename P1, typename P2>
  2219. struct BindState<Runnable, RunType, void(P1, P2)> : public BindStateBase {
  2220. typedef Runnable RunnableType;
  2221. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2222. typedef Invoker<2, BindState, RunType> InvokerType;
  2223. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2224. // Convenience typedefs for bound argument types.
  2225. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2226. typedef UnwrapTraits<P2> Bound2UnwrapTraits;
  2227. BindState(const Runnable& runnable, const P1& p1, const P2& p2)
  2228. : runnable_(runnable),
  2229. p1_(p1),
  2230. p2_(p2) {
  2231. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2232. }
  2233. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2234. P1>::Release(p1_); }
  2235. RunnableType runnable_;
  2236. P1 p1_;
  2237. P2 p2_;
  2238. };
  2239. template <typename Runnable, typename RunType, typename P1, typename P2,
  2240. typename P3>
  2241. struct BindState<Runnable, RunType, void(P1, P2, P3)> : public BindStateBase {
  2242. typedef Runnable RunnableType;
  2243. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2244. typedef Invoker<3, BindState, RunType> InvokerType;
  2245. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2246. // Convenience typedefs for bound argument types.
  2247. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2248. typedef UnwrapTraits<P2> Bound2UnwrapTraits;
  2249. typedef UnwrapTraits<P3> Bound3UnwrapTraits;
  2250. BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3)
  2251. : runnable_(runnable),
  2252. p1_(p1),
  2253. p2_(p2),
  2254. p3_(p3) {
  2255. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2256. }
  2257. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2258. P1>::Release(p1_); }
  2259. RunnableType runnable_;
  2260. P1 p1_;
  2261. P2 p2_;
  2262. P3 p3_;
  2263. };
  2264. template <typename Runnable, typename RunType, typename P1, typename P2,
  2265. typename P3, typename P4>
  2266. struct BindState<Runnable, RunType, void(P1, P2, P3,
  2267. P4)> : public BindStateBase {
  2268. typedef Runnable RunnableType;
  2269. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2270. typedef Invoker<4, BindState, RunType> InvokerType;
  2271. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2272. // Convenience typedefs for bound argument types.
  2273. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2274. typedef UnwrapTraits<P2> Bound2UnwrapTraits;
  2275. typedef UnwrapTraits<P3> Bound3UnwrapTraits;
  2276. typedef UnwrapTraits<P4> Bound4UnwrapTraits;
  2277. BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
  2278. const P4& p4)
  2279. : runnable_(runnable),
  2280. p1_(p1),
  2281. p2_(p2),
  2282. p3_(p3),
  2283. p4_(p4) {
  2284. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2285. }
  2286. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2287. P1>::Release(p1_); }
  2288. RunnableType runnable_;
  2289. P1 p1_;
  2290. P2 p2_;
  2291. P3 p3_;
  2292. P4 p4_;
  2293. };
  2294. template <typename Runnable, typename RunType, typename P1, typename P2,
  2295. typename P3, typename P4, typename P5>
  2296. struct BindState<Runnable, RunType, void(P1, P2, P3, P4,
  2297. P5)> : public BindStateBase {
  2298. typedef Runnable RunnableType;
  2299. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2300. typedef Invoker<5, BindState, RunType> InvokerType;
  2301. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2302. // Convenience typedefs for bound argument types.
  2303. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2304. typedef UnwrapTraits<P2> Bound2UnwrapTraits;
  2305. typedef UnwrapTraits<P3> Bound3UnwrapTraits;
  2306. typedef UnwrapTraits<P4> Bound4UnwrapTraits;
  2307. typedef UnwrapTraits<P5> Bound5UnwrapTraits;
  2308. BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
  2309. const P4& p4, const P5& p5)
  2310. : runnable_(runnable),
  2311. p1_(p1),
  2312. p2_(p2),
  2313. p3_(p3),
  2314. p4_(p4),
  2315. p5_(p5) {
  2316. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2317. }
  2318. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2319. P1>::Release(p1_); }
  2320. RunnableType runnable_;
  2321. P1 p1_;
  2322. P2 p2_;
  2323. P3 p3_;
  2324. P4 p4_;
  2325. P5 p5_;
  2326. };
  2327. template <typename Runnable, typename RunType, typename P1, typename P2,
  2328. typename P3, typename P4, typename P5, typename P6>
  2329. struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5,
  2330. P6)> : public BindStateBase {
  2331. typedef Runnable RunnableType;
  2332. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2333. typedef Invoker<6, BindState, RunType> InvokerType;
  2334. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2335. // Convenience typedefs for bound argument types.
  2336. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2337. typedef UnwrapTraits<P2> Bound2UnwrapTraits;
  2338. typedef UnwrapTraits<P3> Bound3UnwrapTraits;
  2339. typedef UnwrapTraits<P4> Bound4UnwrapTraits;
  2340. typedef UnwrapTraits<P5> Bound5UnwrapTraits;
  2341. typedef UnwrapTraits<P6> Bound6UnwrapTraits;
  2342. BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
  2343. const P4& p4, const P5& p5, const P6& p6)
  2344. : runnable_(runnable),
  2345. p1_(p1),
  2346. p2_(p2),
  2347. p3_(p3),
  2348. p4_(p4),
  2349. p5_(p5),
  2350. p6_(p6) {
  2351. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2352. }
  2353. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2354. P1>::Release(p1_); }
  2355. RunnableType runnable_;
  2356. P1 p1_;
  2357. P2 p2_;
  2358. P3 p3_;
  2359. P4 p4_;
  2360. P5 p5_;
  2361. P6 p6_;
  2362. };
  2363. template <typename Runnable, typename RunType, typename P1, typename P2,
  2364. typename P3, typename P4, typename P5, typename P6, typename P7>
  2365. struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6,
  2366. P7)> : public BindStateBase {
  2367. typedef Runnable RunnableType;
  2368. typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
  2369. typedef Invoker<7, BindState, RunType> InvokerType;
  2370. typedef typename InvokerType::UnboundRunType UnboundRunType;
  2371. // Convenience typedefs for bound argument types.
  2372. typedef UnwrapTraits<P1> Bound1UnwrapTraits;
  2373. typedef UnwrapTraits<P2> Bound2UnwrapTraits;
  2374. typedef UnwrapTraits<P3> Bound3UnwrapTraits;
  2375. typedef UnwrapTraits<P4> Bound4UnwrapTraits;
  2376. typedef UnwrapTraits<P5> Bound5UnwrapTraits;
  2377. typedef UnwrapTraits<P6> Bound6UnwrapTraits;
  2378. typedef UnwrapTraits<P7> Bound7UnwrapTraits;
  2379. BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
  2380. const P4& p4, const P5& p5, const P6& p6, const P7& p7)
  2381. : runnable_(runnable),
  2382. p1_(p1),
  2383. p2_(p2),
  2384. p3_(p3),
  2385. p4_(p4),
  2386. p5_(p5),
  2387. p6_(p6),
  2388. p7_(p7) {
  2389. MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
  2390. }
  2391. virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
  2392. P1>::Release(p1_); }
  2393. RunnableType runnable_;
  2394. P1 p1_;
  2395. P2 p2_;
  2396. P3 p3_;
  2397. P4 p4_;
  2398. P5 p5_;
  2399. P6 p6_;
  2400. P7 p7_;
  2401. };
  2402. } // namespace internal
  2403. } // namespace butil
  2404. #endif // BASE_BIND_INTERNAL_H_