Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: base/bind_internal.h

Issue 8728010: Increase Bind/Callback Arity from 6 -> 7. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated comments. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/bind.h.pump ('k') | base/bind_internal.h.pump » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // This file was GENERATED by command: 1 // This file was GENERATED by command:
2 // pump.py bind_internal.h.pump 2 // pump.py bind_internal.h.pump
3 // DO NOT EDIT BY HAND!!! 3 // DO NOT EDIT BY HAND!!!
4 4
5 5
6
7 // TODO(ajwong): If you create an fully unbound method, is there a way to
8 // enforce the first argument must be refcounted? Or do we just say
9 // "oh well"?
10 //
11 // Do we want to allow creating a fully unbound method??
awong 2011/11/28 20:16:38 Stale TODO. I thought this through and realized th
12
13 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 6 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
14 // Use of this source code is governed by a BSD-style license that can be 7 // Use of this source code is governed by a BSD-style license that can be
15 // found in the LICENSE file. 8 // found in the LICENSE file.
16 9
17 #ifndef BASE_BIND_INTERNAL_H_ 10 #ifndef BASE_BIND_INTERNAL_H_
18 #define BASE_BIND_INTERNAL_H_ 11 #define BASE_BIND_INTERNAL_H_
19 #pragma once 12 #pragma once
20 13
21 #include "base/bind_helpers.h" 14 #include "base/bind_helpers.h"
22 #include "base/callback_internal.h" 15 #include "base/callback_internal.h"
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 typename CallbackParamTraits<A4>::ForwardType a4, 538 typename CallbackParamTraits<A4>::ForwardType a4,
546 typename CallbackParamTraits<A5>::ForwardType a5, 539 typename CallbackParamTraits<A5>::ForwardType a5,
547 typename CallbackParamTraits<A6>::ForwardType a6) { 540 typename CallbackParamTraits<A6>::ForwardType a6) {
548 return (object->*method_)(a1, a2, a3, a4, a5, a6); 541 return (object->*method_)(a1, a2, a3, a4, a5, a6);
549 } 542 }
550 543
551 private: 544 private:
552 R (T::*method_)(A1, A2, A3, A4, A5, A6) const; 545 R (T::*method_)(A1, A2, A3, A4, A5, A6) const;
553 }; 546 };
554 547
548 // Function: Arity 7.
549 template <typename R, typename A1, typename A2, typename A3, typename A4,
550 typename A5, typename A6, typename A7>
551 class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6, A7)> {
552 public:
553 typedef R (RunType)(A1, A2, A3, A4, A5, A6, A7);
554
555 explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6, A7))
556 : function_(function) {
557 }
558
559 R Run(typename CallbackParamTraits<A1>::ForwardType a1,
560 typename CallbackParamTraits<A2>::ForwardType a2,
561 typename CallbackParamTraits<A3>::ForwardType a3,
562 typename CallbackParamTraits<A4>::ForwardType a4,
563 typename CallbackParamTraits<A5>::ForwardType a5,
564 typename CallbackParamTraits<A6>::ForwardType a6,
565 typename CallbackParamTraits<A7>::ForwardType a7) {
566 return function_(a1, a2, a3, a4, a5, a6, a7);
567 }
568
569 private:
570 R (*function_)(A1, A2, A3, A4, A5, A6, A7);
571 };
572
573 // Method: Arity 7.
574 template <typename R, typename T, typename A1, typename A2, typename A3,
575 typename A4, typename A5, typename A6, typename A7>
576 class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7)> {
577 public:
578 typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6, A7);
579 typedef true_type IsMethod;
580
581 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7))
582 : method_(method) {
583 }
584
585 R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
586 typename CallbackParamTraits<A2>::ForwardType a2,
587 typename CallbackParamTraits<A3>::ForwardType a3,
588 typename CallbackParamTraits<A4>::ForwardType a4,
589 typename CallbackParamTraits<A5>::ForwardType a5,
590 typename CallbackParamTraits<A6>::ForwardType a6,
591 typename CallbackParamTraits<A7>::ForwardType a7) {
592 return (object->*method_)(a1, a2, a3, a4, a5, a6, a7);
593 }
594
595 private:
596 R (T::*method_)(A1, A2, A3, A4, A5, A6, A7);
597 };
598
599 // Const Method: Arity 7.
600 template <typename R, typename T, typename A1, typename A2, typename A3,
601 typename A4, typename A5, typename A6, typename A7>
602 class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7) const> {
603 public:
604 typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6, A7);
605 typedef true_type IsMethod;
606
607 explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7) const)
608 : method_(method) {
609 }
610
611 R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
612 typename CallbackParamTraits<A2>::ForwardType a2,
613 typename CallbackParamTraits<A3>::ForwardType a3,
614 typename CallbackParamTraits<A4>::ForwardType a4,
615 typename CallbackParamTraits<A5>::ForwardType a5,
616 typename CallbackParamTraits<A6>::ForwardType a6,
617 typename CallbackParamTraits<A7>::ForwardType a7) {
618 return (object->*method_)(a1, a2, a3, a4, a5, a6, a7);
619 }
620
621 private:
622 R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const;
623 };
624
555 625
556 // FunctionTraits<> 626 // FunctionTraits<>
557 // 627 //
558 // Breaks a function signature apart into typedefs for easier introspection. 628 // Breaks a function signature apart into typedefs for easier introspection.
559 template <typename Sig> 629 template <typename Sig>
560 struct FunctionTraits; 630 struct FunctionTraits;
561 631
562 template <typename R> 632 template <typename R>
563 struct FunctionTraits<R()> { 633 struct FunctionTraits<R()> {
564 typedef R ReturnType; 634 typedef R ReturnType;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> { 680 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6)> {
611 typedef R ReturnType; 681 typedef R ReturnType;
612 typedef A1 A1Type; 682 typedef A1 A1Type;
613 typedef A2 A2Type; 683 typedef A2 A2Type;
614 typedef A3 A3Type; 684 typedef A3 A3Type;
615 typedef A4 A4Type; 685 typedef A4 A4Type;
616 typedef A5 A5Type; 686 typedef A5 A5Type;
617 typedef A6 A6Type; 687 typedef A6 A6Type;
618 }; 688 };
619 689
690 template <typename R, typename A1, typename A2, typename A3, typename A4,
691 typename A5, typename A6, typename A7>
692 struct FunctionTraits<R(A1, A2, A3, A4, A5, A6, A7)> {
693 typedef R ReturnType;
694 typedef A1 A1Type;
695 typedef A2 A2Type;
696 typedef A3 A3Type;
697 typedef A4 A4Type;
698 typedef A5 A5Type;
699 typedef A6 A6Type;
700 typedef A7 A7Type;
701 };
702
620 703
621 // ForceVoidReturn<> 704 // ForceVoidReturn<>
622 // 705 //
623 // Set of templates that support forcing the function return type to void. 706 // Set of templates that support forcing the function return type to void.
624 template <typename Sig> 707 template <typename Sig>
625 struct ForceVoidReturn; 708 struct ForceVoidReturn;
626 709
627 template <typename R> 710 template <typename R>
628 struct ForceVoidReturn<R()> { 711 struct ForceVoidReturn<R()> {
629 typedef void(RunType)(); 712 typedef void(RunType)();
(...skipping 24 matching lines...) Expand all
654 struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> { 737 struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> {
655 typedef void(RunType)(A1, A2, A3, A4, A5); 738 typedef void(RunType)(A1, A2, A3, A4, A5);
656 }; 739 };
657 740
658 template <typename R, typename A1, typename A2, typename A3, typename A4, 741 template <typename R, typename A1, typename A2, typename A3, typename A4,
659 typename A5, typename A6> 742 typename A5, typename A6>
660 struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> { 743 struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> {
661 typedef void(RunType)(A1, A2, A3, A4, A5, A6); 744 typedef void(RunType)(A1, A2, A3, A4, A5, A6);
662 }; 745 };
663 746
747 template <typename R, typename A1, typename A2, typename A3, typename A4,
748 typename A5, typename A6, typename A7>
749 struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> {
750 typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7);
751 };
752
664 753
665 // FunctorTraits<> 754 // FunctorTraits<>
666 // 755 //
667 // See description at top of file. 756 // See description at top of file.
668 template <typename T> 757 template <typename T>
669 struct FunctorTraits { 758 struct FunctorTraits {
670 typedef RunnableAdapter<T> RunnableType; 759 typedef RunnableAdapter<T> RunnableType;
671 typedef typename RunnableType::RunType RunType; 760 typedef typename RunnableType::RunType RunType;
672 }; 761 };
673 762
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, 1006 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
918 A6 a6) { 1007 A6 a6) {
919 if (!a1.get()) { 1008 if (!a1.get()) {
920 return; 1009 return;
921 } 1010 }
922 1011
923 runnable.Run(a1, a2, a3, a4, a5, a6); 1012 runnable.Run(a1, a2, a3, a4, a5, a6);
924 } 1013 }
925 }; 1014 };
926 1015
1016 template <typename ReturnType, typename Runnable,typename A1, typename A2,
1017 typename A3, typename A4, typename A5, typename A6, typename A7>
1018 struct InvokeHelper<false, ReturnType, Runnable,
1019 void(A1, A2, A3, A4, A5, A6, A7)> {
1020 static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
1021 A5 a5, A6 a6, A7 a7) {
1022 return runnable.Run(a1, a2, a3, a4, a5, a6, a7);
1023 }
1024 };
1025
1026 template <typename Runnable,typename A1, typename A2, typename A3, typename A4,
1027 typename A5, typename A6, typename A7>
1028 struct InvokeHelper<false, void, Runnable,
1029 void(A1, A2, A3, A4, A5, A6, A7)> {
1030 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
1031 A6 a6, A7 a7) {
1032 runnable.Run(a1, a2, a3, a4, a5, a6, a7);
1033 }
1034 };
1035
1036 template <typename Runnable, typename A1, typename A2, typename A3,
1037 typename A4, typename A5, typename A6, typename A7>
1038 struct InvokeHelper<true, void, Runnable,
1039 void(A1, A2, A3, A4, A5, A6, A7)> {
1040 static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
1041 A6 a6, A7 a7) {
1042 if (!a1.get()) {
1043 return;
1044 }
1045
1046 runnable.Run(a1, a2, a3, a4, a5, a6, a7);
1047 }
1048 };
1049
927 #if !defined(_MSC_VER) 1050 #if !defined(_MSC_VER)
928 1051
929 template <typename ReturnType, typename Runnable, typename ArgsType> 1052 template <typename ReturnType, typename Runnable, typename ArgsType>
930 struct InvokeHelper<true, ReturnType, Runnable, ArgsType> { 1053 struct InvokeHelper<true, ReturnType, Runnable, ArgsType> {
931 // WeakCalls are only supported for functions with a void return type. 1054 // WeakCalls are only supported for functions with a void return type.
932 // Otherwise, the function result would be undefined if the the WeakPtr<> 1055 // Otherwise, the function result would be undefined if the the WeakPtr<>
933 // is invalidated. 1056 // is invalidated.
934 COMPILE_ASSERT(is_void<ReturnType>::value, 1057 COMPILE_ASSERT(is_void<ReturnType>::value,
935 weak_ptrs_can_only_bind_to_methods_without_return_values); 1058 weak_ptrs_can_only_bind_to_methods_without_return_values);
936 }; 1059 };
(...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after
1911 void(typename Bound1UnwrapTraits::ForwardType, 2034 void(typename Bound1UnwrapTraits::ForwardType,
1912 typename Bound2UnwrapTraits::ForwardType, 2035 typename Bound2UnwrapTraits::ForwardType,
1913 typename Bound3UnwrapTraits::ForwardType, 2036 typename Bound3UnwrapTraits::ForwardType,
1914 typename Bound4UnwrapTraits::ForwardType, 2037 typename Bound4UnwrapTraits::ForwardType,
1915 typename Bound5UnwrapTraits::ForwardType, 2038 typename Bound5UnwrapTraits::ForwardType,
1916 typename Bound6UnwrapTraits::ForwardType)> 2039 typename Bound6UnwrapTraits::ForwardType)>
1917 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6); 2040 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
1918 } 2041 }
1919 }; 2042 };
1920 2043
2044 // Arity 7 -> 7.
2045 template <typename StorageType, typename R,typename X1, typename X2,
2046 typename X3, typename X4, typename X5, typename X6, typename X7>
2047 struct Invoker<0, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2048 typedef R(RunType)(BindStateBase*,
2049 typename CallbackParamTraits<X1>::ForwardType,
2050 typename CallbackParamTraits<X2>::ForwardType,
2051 typename CallbackParamTraits<X3>::ForwardType,
2052 typename CallbackParamTraits<X4>::ForwardType,
2053 typename CallbackParamTraits<X5>::ForwardType,
2054 typename CallbackParamTraits<X6>::ForwardType,
2055 typename CallbackParamTraits<X7>::ForwardType);
2056
2057 typedef R(UnboundRunType)(X1, X2, X3, X4, X5, X6, X7);
2058
2059 static R Run(BindStateBase* base,
2060 typename CallbackParamTraits<X1>::ForwardType x1,
2061 typename CallbackParamTraits<X2>::ForwardType x2,
2062 typename CallbackParamTraits<X3>::ForwardType x3,
2063 typename CallbackParamTraits<X4>::ForwardType x4,
2064 typename CallbackParamTraits<X5>::ForwardType x5,
2065 typename CallbackParamTraits<X6>::ForwardType x6,
2066 typename CallbackParamTraits<X7>::ForwardType x7) {
2067 StorageType* storage = static_cast<StorageType*>(base);
2068
2069 // Local references to make debugger stepping easier. If in a debugger,
2070 // you really want to warp ahead and step through the
2071 // InvokeHelper<>::MakeItSo() call below.
2072
2073 return InvokeHelper<StorageType::IsWeakCall::value, R,
2074 typename StorageType::RunnableType,
2075 void(typename CallbackParamTraits<X1>::ForwardType x1,
2076 typename CallbackParamTraits<X2>::ForwardType x2,
2077 typename CallbackParamTraits<X3>::ForwardType x3,
2078 typename CallbackParamTraits<X4>::ForwardType x4,
2079 typename CallbackParamTraits<X5>::ForwardType x5,
2080 typename CallbackParamTraits<X6>::ForwardType x6,
2081 typename CallbackParamTraits<X7>::ForwardType x7)>
2082 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2083 }
2084 };
2085
2086 // Arity 7 -> 6.
2087 template <typename StorageType, typename R,typename X1, typename X2,
2088 typename X3, typename X4, typename X5, typename X6, typename X7>
2089 struct Invoker<1, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2090 typedef R(RunType)(BindStateBase*,
2091 typename CallbackParamTraits<X2>::ForwardType,
2092 typename CallbackParamTraits<X3>::ForwardType,
2093 typename CallbackParamTraits<X4>::ForwardType,
2094 typename CallbackParamTraits<X5>::ForwardType,
2095 typename CallbackParamTraits<X6>::ForwardType,
2096 typename CallbackParamTraits<X7>::ForwardType);
2097
2098 typedef R(UnboundRunType)(X2, X3, X4, X5, X6, X7);
2099
2100 static R Run(BindStateBase* base,
2101 typename CallbackParamTraits<X2>::ForwardType x2,
2102 typename CallbackParamTraits<X3>::ForwardType x3,
2103 typename CallbackParamTraits<X4>::ForwardType x4,
2104 typename CallbackParamTraits<X5>::ForwardType x5,
2105 typename CallbackParamTraits<X6>::ForwardType x6,
2106 typename CallbackParamTraits<X7>::ForwardType x7) {
2107 StorageType* storage = static_cast<StorageType*>(base);
2108
2109 // Local references to make debugger stepping easier. If in a debugger,
2110 // you really want to warp ahead and step through the
2111 // InvokeHelper<>::MakeItSo() call below.
2112 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2113
2114 typename Bound1UnwrapTraits::ForwardType x1 =
2115 Bound1UnwrapTraits::Unwrap(storage->p1_);
2116 return InvokeHelper<StorageType::IsWeakCall::value, R,
2117 typename StorageType::RunnableType,
2118 void(typename Bound1UnwrapTraits::ForwardType,
2119 typename CallbackParamTraits<X2>::ForwardType x2,
2120 typename CallbackParamTraits<X3>::ForwardType x3,
2121 typename CallbackParamTraits<X4>::ForwardType x4,
2122 typename CallbackParamTraits<X5>::ForwardType x5,
2123 typename CallbackParamTraits<X6>::ForwardType x6,
2124 typename CallbackParamTraits<X7>::ForwardType x7)>
2125 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2126 }
2127 };
2128
2129 // Arity 7 -> 5.
2130 template <typename StorageType, typename R,typename X1, typename X2,
2131 typename X3, typename X4, typename X5, typename X6, typename X7>
2132 struct Invoker<2, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2133 typedef R(RunType)(BindStateBase*,
2134 typename CallbackParamTraits<X3>::ForwardType,
2135 typename CallbackParamTraits<X4>::ForwardType,
2136 typename CallbackParamTraits<X5>::ForwardType,
2137 typename CallbackParamTraits<X6>::ForwardType,
2138 typename CallbackParamTraits<X7>::ForwardType);
2139
2140 typedef R(UnboundRunType)(X3, X4, X5, X6, X7);
2141
2142 static R Run(BindStateBase* base,
2143 typename CallbackParamTraits<X3>::ForwardType x3,
2144 typename CallbackParamTraits<X4>::ForwardType x4,
2145 typename CallbackParamTraits<X5>::ForwardType x5,
2146 typename CallbackParamTraits<X6>::ForwardType x6,
2147 typename CallbackParamTraits<X7>::ForwardType x7) {
2148 StorageType* storage = static_cast<StorageType*>(base);
2149
2150 // Local references to make debugger stepping easier. If in a debugger,
2151 // you really want to warp ahead and step through the
2152 // InvokeHelper<>::MakeItSo() call below.
2153 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2154 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2155
2156 typename Bound1UnwrapTraits::ForwardType x1 =
2157 Bound1UnwrapTraits::Unwrap(storage->p1_);
2158 typename Bound2UnwrapTraits::ForwardType x2 =
2159 Bound2UnwrapTraits::Unwrap(storage->p2_);
2160 return InvokeHelper<StorageType::IsWeakCall::value, R,
2161 typename StorageType::RunnableType,
2162 void(typename Bound1UnwrapTraits::ForwardType,
2163 typename Bound2UnwrapTraits::ForwardType,
2164 typename CallbackParamTraits<X3>::ForwardType x3,
2165 typename CallbackParamTraits<X4>::ForwardType x4,
2166 typename CallbackParamTraits<X5>::ForwardType x5,
2167 typename CallbackParamTraits<X6>::ForwardType x6,
2168 typename CallbackParamTraits<X7>::ForwardType x7)>
2169 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2170 }
2171 };
2172
2173 // Arity 7 -> 4.
2174 template <typename StorageType, typename R,typename X1, typename X2,
2175 typename X3, typename X4, typename X5, typename X6, typename X7>
2176 struct Invoker<3, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2177 typedef R(RunType)(BindStateBase*,
2178 typename CallbackParamTraits<X4>::ForwardType,
2179 typename CallbackParamTraits<X5>::ForwardType,
2180 typename CallbackParamTraits<X6>::ForwardType,
2181 typename CallbackParamTraits<X7>::ForwardType);
2182
2183 typedef R(UnboundRunType)(X4, X5, X6, X7);
2184
2185 static R Run(BindStateBase* base,
2186 typename CallbackParamTraits<X4>::ForwardType x4,
2187 typename CallbackParamTraits<X5>::ForwardType x5,
2188 typename CallbackParamTraits<X6>::ForwardType x6,
2189 typename CallbackParamTraits<X7>::ForwardType x7) {
2190 StorageType* storage = static_cast<StorageType*>(base);
2191
2192 // Local references to make debugger stepping easier. If in a debugger,
2193 // you really want to warp ahead and step through the
2194 // InvokeHelper<>::MakeItSo() call below.
2195 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2196 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2197 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2198
2199 typename Bound1UnwrapTraits::ForwardType x1 =
2200 Bound1UnwrapTraits::Unwrap(storage->p1_);
2201 typename Bound2UnwrapTraits::ForwardType x2 =
2202 Bound2UnwrapTraits::Unwrap(storage->p2_);
2203 typename Bound3UnwrapTraits::ForwardType x3 =
2204 Bound3UnwrapTraits::Unwrap(storage->p3_);
2205 return InvokeHelper<StorageType::IsWeakCall::value, R,
2206 typename StorageType::RunnableType,
2207 void(typename Bound1UnwrapTraits::ForwardType,
2208 typename Bound2UnwrapTraits::ForwardType,
2209 typename Bound3UnwrapTraits::ForwardType,
2210 typename CallbackParamTraits<X4>::ForwardType x4,
2211 typename CallbackParamTraits<X5>::ForwardType x5,
2212 typename CallbackParamTraits<X6>::ForwardType x6,
2213 typename CallbackParamTraits<X7>::ForwardType x7)>
2214 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2215 }
2216 };
2217
2218 // Arity 7 -> 3.
2219 template <typename StorageType, typename R,typename X1, typename X2,
2220 typename X3, typename X4, typename X5, typename X6, typename X7>
2221 struct Invoker<4, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2222 typedef R(RunType)(BindStateBase*,
2223 typename CallbackParamTraits<X5>::ForwardType,
2224 typename CallbackParamTraits<X6>::ForwardType,
2225 typename CallbackParamTraits<X7>::ForwardType);
2226
2227 typedef R(UnboundRunType)(X5, X6, X7);
2228
2229 static R Run(BindStateBase* base,
2230 typename CallbackParamTraits<X5>::ForwardType x5,
2231 typename CallbackParamTraits<X6>::ForwardType x6,
2232 typename CallbackParamTraits<X7>::ForwardType x7) {
2233 StorageType* storage = static_cast<StorageType*>(base);
2234
2235 // Local references to make debugger stepping easier. If in a debugger,
2236 // you really want to warp ahead and step through the
2237 // InvokeHelper<>::MakeItSo() call below.
2238 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2239 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2240 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2241 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2242
2243 typename Bound1UnwrapTraits::ForwardType x1 =
2244 Bound1UnwrapTraits::Unwrap(storage->p1_);
2245 typename Bound2UnwrapTraits::ForwardType x2 =
2246 Bound2UnwrapTraits::Unwrap(storage->p2_);
2247 typename Bound3UnwrapTraits::ForwardType x3 =
2248 Bound3UnwrapTraits::Unwrap(storage->p3_);
2249 typename Bound4UnwrapTraits::ForwardType x4 =
2250 Bound4UnwrapTraits::Unwrap(storage->p4_);
2251 return InvokeHelper<StorageType::IsWeakCall::value, R,
2252 typename StorageType::RunnableType,
2253 void(typename Bound1UnwrapTraits::ForwardType,
2254 typename Bound2UnwrapTraits::ForwardType,
2255 typename Bound3UnwrapTraits::ForwardType,
2256 typename Bound4UnwrapTraits::ForwardType,
2257 typename CallbackParamTraits<X5>::ForwardType x5,
2258 typename CallbackParamTraits<X6>::ForwardType x6,
2259 typename CallbackParamTraits<X7>::ForwardType x7)>
2260 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2261 }
2262 };
2263
2264 // Arity 7 -> 2.
2265 template <typename StorageType, typename R,typename X1, typename X2,
2266 typename X3, typename X4, typename X5, typename X6, typename X7>
2267 struct Invoker<5, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2268 typedef R(RunType)(BindStateBase*,
2269 typename CallbackParamTraits<X6>::ForwardType,
2270 typename CallbackParamTraits<X7>::ForwardType);
2271
2272 typedef R(UnboundRunType)(X6, X7);
2273
2274 static R Run(BindStateBase* base,
2275 typename CallbackParamTraits<X6>::ForwardType x6,
2276 typename CallbackParamTraits<X7>::ForwardType x7) {
2277 StorageType* storage = static_cast<StorageType*>(base);
2278
2279 // Local references to make debugger stepping easier. If in a debugger,
2280 // you really want to warp ahead and step through the
2281 // InvokeHelper<>::MakeItSo() call below.
2282 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2283 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2284 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2285 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2286 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2287
2288 typename Bound1UnwrapTraits::ForwardType x1 =
2289 Bound1UnwrapTraits::Unwrap(storage->p1_);
2290 typename Bound2UnwrapTraits::ForwardType x2 =
2291 Bound2UnwrapTraits::Unwrap(storage->p2_);
2292 typename Bound3UnwrapTraits::ForwardType x3 =
2293 Bound3UnwrapTraits::Unwrap(storage->p3_);
2294 typename Bound4UnwrapTraits::ForwardType x4 =
2295 Bound4UnwrapTraits::Unwrap(storage->p4_);
2296 typename Bound5UnwrapTraits::ForwardType x5 =
2297 Bound5UnwrapTraits::Unwrap(storage->p5_);
2298 return InvokeHelper<StorageType::IsWeakCall::value, R,
2299 typename StorageType::RunnableType,
2300 void(typename Bound1UnwrapTraits::ForwardType,
2301 typename Bound2UnwrapTraits::ForwardType,
2302 typename Bound3UnwrapTraits::ForwardType,
2303 typename Bound4UnwrapTraits::ForwardType,
2304 typename Bound5UnwrapTraits::ForwardType,
2305 typename CallbackParamTraits<X6>::ForwardType x6,
2306 typename CallbackParamTraits<X7>::ForwardType x7)>
2307 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2308 }
2309 };
2310
2311 // Arity 7 -> 1.
2312 template <typename StorageType, typename R,typename X1, typename X2,
2313 typename X3, typename X4, typename X5, typename X6, typename X7>
2314 struct Invoker<6, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2315 typedef R(RunType)(BindStateBase*,
2316 typename CallbackParamTraits<X7>::ForwardType);
2317
2318 typedef R(UnboundRunType)(X7);
2319
2320 static R Run(BindStateBase* base,
2321 typename CallbackParamTraits<X7>::ForwardType x7) {
2322 StorageType* storage = static_cast<StorageType*>(base);
2323
2324 // Local references to make debugger stepping easier. If in a debugger,
2325 // you really want to warp ahead and step through the
2326 // InvokeHelper<>::MakeItSo() call below.
2327 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2328 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2329 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2330 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2331 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2332 typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
2333
2334 typename Bound1UnwrapTraits::ForwardType x1 =
2335 Bound1UnwrapTraits::Unwrap(storage->p1_);
2336 typename Bound2UnwrapTraits::ForwardType x2 =
2337 Bound2UnwrapTraits::Unwrap(storage->p2_);
2338 typename Bound3UnwrapTraits::ForwardType x3 =
2339 Bound3UnwrapTraits::Unwrap(storage->p3_);
2340 typename Bound4UnwrapTraits::ForwardType x4 =
2341 Bound4UnwrapTraits::Unwrap(storage->p4_);
2342 typename Bound5UnwrapTraits::ForwardType x5 =
2343 Bound5UnwrapTraits::Unwrap(storage->p5_);
2344 typename Bound6UnwrapTraits::ForwardType x6 =
2345 Bound6UnwrapTraits::Unwrap(storage->p6_);
2346 return InvokeHelper<StorageType::IsWeakCall::value, R,
2347 typename StorageType::RunnableType,
2348 void(typename Bound1UnwrapTraits::ForwardType,
2349 typename Bound2UnwrapTraits::ForwardType,
2350 typename Bound3UnwrapTraits::ForwardType,
2351 typename Bound4UnwrapTraits::ForwardType,
2352 typename Bound5UnwrapTraits::ForwardType,
2353 typename Bound6UnwrapTraits::ForwardType,
2354 typename CallbackParamTraits<X7>::ForwardType x7)>
2355 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2356 }
2357 };
2358
2359 // Arity 7 -> 0.
2360 template <typename StorageType, typename R,typename X1, typename X2,
2361 typename X3, typename X4, typename X5, typename X6, typename X7>
2362 struct Invoker<7, StorageType, R(X1, X2, X3, X4, X5, X6, X7)> {
2363 typedef R(RunType)(BindStateBase*);
2364
2365 typedef R(UnboundRunType)();
2366
2367 static R Run(BindStateBase* base) {
2368 StorageType* storage = static_cast<StorageType*>(base);
2369
2370 // Local references to make debugger stepping easier. If in a debugger,
2371 // you really want to warp ahead and step through the
2372 // InvokeHelper<>::MakeItSo() call below.
2373 typedef typename StorageType::Bound1UnwrapTraits Bound1UnwrapTraits;
2374 typedef typename StorageType::Bound2UnwrapTraits Bound2UnwrapTraits;
2375 typedef typename StorageType::Bound3UnwrapTraits Bound3UnwrapTraits;
2376 typedef typename StorageType::Bound4UnwrapTraits Bound4UnwrapTraits;
2377 typedef typename StorageType::Bound5UnwrapTraits Bound5UnwrapTraits;
2378 typedef typename StorageType::Bound6UnwrapTraits Bound6UnwrapTraits;
2379 typedef typename StorageType::Bound7UnwrapTraits Bound7UnwrapTraits;
2380
2381 typename Bound1UnwrapTraits::ForwardType x1 =
2382 Bound1UnwrapTraits::Unwrap(storage->p1_);
2383 typename Bound2UnwrapTraits::ForwardType x2 =
2384 Bound2UnwrapTraits::Unwrap(storage->p2_);
2385 typename Bound3UnwrapTraits::ForwardType x3 =
2386 Bound3UnwrapTraits::Unwrap(storage->p3_);
2387 typename Bound4UnwrapTraits::ForwardType x4 =
2388 Bound4UnwrapTraits::Unwrap(storage->p4_);
2389 typename Bound5UnwrapTraits::ForwardType x5 =
2390 Bound5UnwrapTraits::Unwrap(storage->p5_);
2391 typename Bound6UnwrapTraits::ForwardType x6 =
2392 Bound6UnwrapTraits::Unwrap(storage->p6_);
2393 typename Bound7UnwrapTraits::ForwardType x7 =
2394 Bound7UnwrapTraits::Unwrap(storage->p7_);
2395 return InvokeHelper<StorageType::IsWeakCall::value, R,
2396 typename StorageType::RunnableType,
2397 void(typename Bound1UnwrapTraits::ForwardType,
2398 typename Bound2UnwrapTraits::ForwardType,
2399 typename Bound3UnwrapTraits::ForwardType,
2400 typename Bound4UnwrapTraits::ForwardType,
2401 typename Bound5UnwrapTraits::ForwardType,
2402 typename Bound6UnwrapTraits::ForwardType,
2403 typename Bound7UnwrapTraits::ForwardType)>
2404 ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
2405 }
2406 };
2407
1921 2408
1922 // BindState<> 2409 // BindState<>
1923 // 2410 //
1924 // This stores all the state passed into Bind() and is also where most 2411 // This stores all the state passed into Bind() and is also where most
1925 // of the template resolution magic occurs. 2412 // of the template resolution magic occurs.
1926 // 2413 //
1927 // Runnable is the functor we are binding arguments to. 2414 // Runnable is the functor we are binding arguments to.
1928 // RunType is type of the Run() function that the Invoker<> should use. 2415 // RunType is type of the Run() function that the Invoker<> should use.
1929 // Normally, this is the same as the RunType of the Runnable, but it can 2416 // Normally, this is the same as the RunType of the Runnable, but it can
1930 // be different if an adapter like IgnoreResult() has been used. 2417 // be different if an adapter like IgnoreResult() has been used.
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
2135 2622
2136 RunnableType runnable_; 2623 RunnableType runnable_;
2137 P1 p1_; 2624 P1 p1_;
2138 P2 p2_; 2625 P2 p2_;
2139 P3 p3_; 2626 P3 p3_;
2140 P4 p4_; 2627 P4 p4_;
2141 P5 p5_; 2628 P5 p5_;
2142 P6 p6_; 2629 P6 p6_;
2143 }; 2630 };
2144 2631
2632 template <typename Runnable, typename RunType, typename P1, typename P2,
2633 typename P3, typename P4, typename P5, typename P6, typename P7>
2634 struct BindState<Runnable, RunType, void(P1, P2, P3, P4, P5, P6,
2635 P7)> : public BindStateBase {
2636 typedef Runnable RunnableType;
2637 typedef IsWeakMethod<HasIsMethodTag<Runnable>::value, P1> IsWeakCall;
2638 typedef Invoker<7, BindState, RunType> InvokerType;
2639 typedef typename InvokerType::UnboundRunType UnboundRunType;
2640
2641 // Convenience typedefs for bound argument types.
2642 typedef UnwrapTraits<P1> Bound1UnwrapTraits;
2643 typedef UnwrapTraits<P2> Bound2UnwrapTraits;
2644 typedef UnwrapTraits<P3> Bound3UnwrapTraits;
2645 typedef UnwrapTraits<P4> Bound4UnwrapTraits;
2646 typedef UnwrapTraits<P5> Bound5UnwrapTraits;
2647 typedef UnwrapTraits<P6> Bound6UnwrapTraits;
2648 typedef UnwrapTraits<P7> Bound7UnwrapTraits;
2649
2650 BindState(const Runnable& runnable, const P1& p1, const P2& p2, const P3& p3,
2651 const P4& p4, const P5& p5, const P6& p6, const P7& p7)
2652 : runnable_(runnable),
2653 p1_(p1),
2654 p2_(p2),
2655 p3_(p3),
2656 p4_(p4),
2657 p5_(p5),
2658 p6_(p6),
2659 p7_(p7) {
2660 MaybeRefcount<HasIsMethodTag<Runnable>::value, P1>::AddRef(p1_);
2661 }
2662
2663 virtual ~BindState() { MaybeRefcount<HasIsMethodTag<Runnable>::value,
2664 P1>::Release(p1_); }
2665
2666 RunnableType runnable_;
2667 P1 p1_;
2668 P2 p2_;
2669 P3 p3_;
2670 P4 p4_;
2671 P5 p5_;
2672 P6 p6_;
2673 P7 p7_;
2674 };
2675
2145 } // namespace internal 2676 } // namespace internal
2146 } // namespace base 2677 } // namespace base
2147 2678
2148 #endif // BASE_BIND_INTERNAL_H_ 2679 #endif // BASE_BIND_INTERNAL_H_
OLDNEW
« no previous file with comments | « base/bind.h.pump ('k') | base/bind_internal.h.pump » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698