Update from https://crrev.com/305340 Added a few #includes of base/compiler_specific.h for upstream cleanup. Changed callers for cc::BeginFrameArgs and cc::RendererSettings API changes. Review URL: https://codereview.chromium.org/754433003
diff --git a/allocator/allocator.gyp b/allocator/allocator.gyp index 323d79e..de3b273 100644 --- a/allocator/allocator.gyp +++ b/allocator/allocator.gyp
@@ -8,7 +8,7 @@ # This code gets run a lot and debugged rarely, so it should be fast # by default. See http://crbug.com/388949. 'debug_optimize': '2', - 'win_debug_Optimization': '2', + 'win_debug_Optimization': '0', # Run time checks are incompatible with any level of optimizations. 'win_debug_RuntimeChecks': '0', },
diff --git a/android/java/src/org/chromium/base/ApiCompatibilityUtils.java b/android/java/src/org/chromium/base/ApiCompatibilityUtils.java index 2af146b..8b2438c 100644 --- a/android/java/src/org/chromium/base/ApiCompatibilityUtils.java +++ b/android/java/src/org/chromium/base/ApiCompatibilityUtils.java
@@ -7,7 +7,6 @@ import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.app.ActivityOptions; -import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; @@ -27,9 +26,6 @@ * Utility class to use new APIs that were added after ICS (API level 14). */ public class ApiCompatibilityUtils { - - private static final String TAG = "ApiCompatibilityUtils"; - private ApiCompatibilityUtils() { } @@ -369,18 +365,6 @@ } /** - * @see android.app.Notification.Builder#setLocalOnly(boolean) - */ - @SuppressWarnings("deprecation") - public static Notification build(Notification.Builder builder) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - return builder.build(); - } else { - return builder.getNotification(); - } - } - - /** * @see android.provider.Settings.Global#DEVICE_PROVISIONED */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
diff --git a/android/java/src/org/chromium/base/CommandLine.java b/android/java/src/org/chromium/base/CommandLine.java index b353ec4..406f36b 100644 --- a/android/java/src/org/chromium/base/CommandLine.java +++ b/android/java/src/org/chromium/base/CommandLine.java
@@ -86,7 +86,7 @@ } private static final AtomicReference<CommandLine> sCommandLine = - new AtomicReference<CommandLine>(); + new AtomicReference<CommandLine>(); /** * @returns true if the command line has already been initialized. @@ -149,8 +149,8 @@ char currentQuote = noQuote; for (char c : buffer) { // Detect start or end of quote block. - if ((currentQuote == noQuote && (c == singleQuote || c == doubleQuote)) || - c == currentQuote) { + if ((currentQuote == noQuote && (c == singleQuote || c == doubleQuote)) + || c == currentQuote) { if (arg != null && arg.length() > 0 && arg.charAt(arg.length() - 1) == '\\') { // Last char was a backslash; pop it, and treat c as a literal. arg.setCharAt(arg.length() - 1, c);
diff --git a/android/java/src/org/chromium/base/LocaleUtils.java b/android/java/src/org/chromium/base/LocaleUtils.java index 4f97d3a..82b2c8f 100644 --- a/android/java/src/org/chromium/base/LocaleUtils.java +++ b/android/java/src/org/chromium/base/LocaleUtils.java
@@ -47,9 +47,9 @@ @CalledByNative private static String getDefaultCountryCode() { CommandLine commandLine = CommandLine.getInstance(); - return commandLine.hasSwitch(BaseSwitches.DEFAULT_COUNTRY_CODE_AT_INSTALL) ? - commandLine.getSwitchValue(BaseSwitches.DEFAULT_COUNTRY_CODE_AT_INSTALL) : - Locale.getDefault().getCountry(); + return commandLine.hasSwitch(BaseSwitches.DEFAULT_COUNTRY_CODE_AT_INSTALL) + ? commandLine.getSwitchValue(BaseSwitches.DEFAULT_COUNTRY_CODE_AT_INSTALL) + : Locale.getDefault().getCountry(); } }
diff --git a/android/java/src/org/chromium/base/MemoryPressureListener.java b/android/java/src/org/chromium/base/MemoryPressureListener.java index 28d9651..e7c2030 100644 --- a/android/java/src/org/chromium/base/MemoryPressureListener.java +++ b/android/java/src/org/chromium/base/MemoryPressureListener.java
@@ -86,8 +86,8 @@ public static void maybeNotifyMemoryPresure(int level) { if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) { nativeOnMemoryPressure(MemoryPressureLevel.CRITICAL); - } else if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND || - level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL) { + } else if (level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND + || level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL) { // Don't notifiy on TRIM_MEMORY_UI_HIDDEN, since this class only // dispatches actionable memory pressure signals to native. nativeOnMemoryPressure(MemoryPressureLevel.MODERATE);
diff --git a/android/java/src/org/chromium/base/ObserverList.java b/android/java/src/org/chromium/base/ObserverList.java index c2bb902..e812b0d 100644 --- a/android/java/src/org/chromium/base/ObserverList.java +++ b/android/java/src/org/chromium/base/ObserverList.java
@@ -204,8 +204,8 @@ @Override public boolean hasNext() { int lookupIndex = mIndex; - while (lookupIndex < mListEndMarker && - ObserverList.this.getObserverAt(lookupIndex) == null) { + while (lookupIndex < mListEndMarker + && ObserverList.this.getObserverAt(lookupIndex) == null) { lookupIndex++; } if (lookupIndex < mListEndMarker) return true;
diff --git a/android/java/src/org/chromium/base/PathUtils.java b/android/java/src/org/chromium/base/PathUtils.java index b2c860f..d70c0cc 100644 --- a/android/java/src/org/chromium/base/PathUtils.java +++ b/android/java/src/org/chromium/base/PathUtils.java
@@ -75,8 +75,8 @@ @CalledByNative private static String getNativeLibraryDirectory(Context appContext) { ApplicationInfo ai = appContext.getApplicationInfo(); - if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 || - (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { + if ((ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 + || (ai.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { return ai.nativeLibraryDir; }
diff --git a/android/java/src/org/chromium/base/PowerMonitor.java b/android/java/src/org/chromium/base/PowerMonitor.java index 316d6cc..3d0ed48 100644 --- a/android/java/src/org/chromium/base/PowerMonitor.java +++ b/android/java/src/org/chromium/base/PowerMonitor.java
@@ -31,11 +31,11 @@ // would be too aggressive. An Android activity can be in the "paused" state quite often. This // can happen when a dialog window shows up for instance. private static final Runnable sSuspendTask = new Runnable() { - @Override - public void run() { - nativeOnMainActivitySuspended(); - } - }; + @Override + public void run() { + nativeOnMainActivitySuspended(); + } + }; public static void createForTests(Context context) { // Applications will create this once the JNI side has been fully wired up both sides. For @@ -71,8 +71,8 @@ } int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); // If we're not plugged, assume we're running on battery power. - sInstance.mIsBatteryPower = chargePlug != BatteryManager.BATTERY_PLUGGED_USB && - chargePlug != BatteryManager.BATTERY_PLUGGED_AC; + sInstance.mIsBatteryPower = chargePlug != BatteryManager.BATTERY_PLUGGED_USB + && chargePlug != BatteryManager.BATTERY_PLUGGED_AC; nativeOnBatteryChargingChanged(); }
diff --git a/android/java/src/org/chromium/base/ThreadUtils.java b/android/java/src/org/chromium/base/ThreadUtils.java index 8813a6c..2a8deeb 100644 --- a/android/java/src/org/chromium/base/ThreadUtils.java +++ b/android/java/src/org/chromium/base/ThreadUtils.java
@@ -32,9 +32,9 @@ public static void setUiThread(Looper looper) { synchronized (sLock) { if (sUiThreadHandler != null && sUiThreadHandler.getLooper() != looper) { - throw new RuntimeException("UI thread looper is already set to " + - sUiThreadHandler.getLooper() + " (Main thread looper is " + - Looper.getMainLooper() + "), cannot set to new looper " + looper); + throw new RuntimeException("UI thread looper is already set to " + + sUiThreadHandler.getLooper() + " (Main thread looper is " + + Looper.getMainLooper() + "), cannot set to new looper " + looper); } else { sUiThreadHandler = new Handler(looper); }
diff --git a/android/java/src/org/chromium/base/TraceEvent.java b/android/java/src/org/chromium/base/TraceEvent.java index b67d32d..1c7e534 100644 --- a/android/java/src/org/chromium/base/TraceEvent.java +++ b/android/java/src/org/chromium/base/TraceEvent.java
@@ -158,8 +158,8 @@ // Holder for monitor avoids unnecessary construction on non-debug runs private static final class LooperMonitorHolder { private static final BasicLooperMonitor sInstance = - CommandLine.getInstance().hasSwitch(BaseSwitches.ENABLE_IDLE_TRACING) ? - new IdleTracingLooperMonitor() : new BasicLooperMonitor(); + CommandLine.getInstance().hasSwitch(BaseSwitches.ENABLE_IDLE_TRACING) + ? new IdleTracingLooperMonitor() : new BasicLooperMonitor(); }
diff --git a/android/javatests/src/org/chromium/base/CommandLineTest.java b/android/javatests/src/org/chromium/base/CommandLineTest.java index 4300467..2b1a967 100644 --- a/android/javatests/src/org/chromium/base/CommandLineTest.java +++ b/android/javatests/src/org/chromium/base/CommandLineTest.java
@@ -113,8 +113,8 @@ toParse = " \t\n"; checkTokenizer(expected, toParse); - toParse = " \"a'b\" 'c\"d' \"e\\\"f\" 'g\\'h' \"i\\'j\" 'k\\\"l'" + - " m\"n\\'o\"p q'r\\\"s't"; + toParse = " \"a'b\" 'c\"d' \"e\\\"f\" 'g\\'h' \"i\\'j\" 'k\\\"l'" + + " m\"n\\'o\"p q'r\\\"s't"; expected = new String[] { "a'b", "c\"d", "e\"f",
diff --git a/bind_internal.h b/bind_internal.h index ae17ebf..2142797 100644 --- a/bind_internal.h +++ b/bind_internal.h
@@ -51,18 +51,15 @@ // Types: // RunnableAdapter<> -- Wraps the various "function" pointer types into an // object that adheres to the Runnable interface. -// There are |3*ARITY| RunnableAdapter types. // FunctionTraits<> -- Type traits that unwrap a function signature into a // a set of easier to use typedefs. Used mainly for // compile time asserts. // There are |ARITY| FunctionTraits types. // ForceVoidReturn<> -- Helper class for translating function signatures to // equivalent forms with a "void" return type. -// There are |ARITY| ForceVoidReturn types. // FunctorTraits<> -- Type traits used determine the correct RunType and // RunnableType for a Functor. This is where function // signature adapters are applied. -// There are |ARITY| ForceVoidReturn types. // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable // type class that represents the underlying Functor. // There are |O(1)| MakeRunnable types. @@ -71,7 +68,6 @@ // and for ignoring return values. This is separate from // Invoker to avoid creating multiple version of Invoker<> // which grows at O(n^2) with the arity. -// There are |k*ARITY| InvokeHelper types. // Invoker<> -- Unwraps the curried parameters and executes the Runnable. // There are |(ARITY^2 + ARITY)/2| Invoketypes. // BindState<> -- Stores the curried parameters, and is the main entry point @@ -101,550 +97,64 @@ template <typename Functor> class RunnableAdapter; -// Function: Arity 0. -template <typename R> -class RunnableAdapter<R(*)()> { +// Function. +template <typename R, typename... Args> +class RunnableAdapter<R(*)(Args...)> { public: - typedef R (RunType)(); + typedef R (RunType)(Args...); - explicit RunnableAdapter(R(*function)()) + explicit RunnableAdapter(R(*function)(Args...)) : function_(function) { } - R Run() { - return function_(); + R Run(typename CallbackParamTraits<Args>::ForwardType... args) { + return function_(CallbackForward(args)...); } private: - R (*function_)(); + R (*function_)(Args...); }; -// Method: Arity 0. -template <typename R, typename T> -class RunnableAdapter<R(T::*)()> { +// Method. +template <typename R, typename T, typename... Args> +class RunnableAdapter<R(T::*)(Args...)> { public: - typedef R (RunType)(T*); + typedef R (RunType)(T*, Args...); typedef true_type IsMethod; - explicit RunnableAdapter(R(T::*method)()) + explicit RunnableAdapter(R(T::*method)(Args...)) : method_(method) { } - R Run(T* object) { - return (object->*method_)(); + R Run(T* object, typename CallbackParamTraits<Args>::ForwardType... args) { + return (object->*method_)(CallbackForward(args)...); } private: - R (T::*method_)(); + R (T::*method_)(Args...); }; -// Const Method: Arity 0. -template <typename R, typename T> -class RunnableAdapter<R(T::*)() const> { +// Const Method. +template <typename R, typename T, typename... Args> +class RunnableAdapter<R(T::*)(Args...) const> { public: - typedef R (RunType)(const T*); + typedef R (RunType)(const T*, Args...); typedef true_type IsMethod; - explicit RunnableAdapter(R(T::*method)() const) + explicit RunnableAdapter(R(T::*method)(Args...) const) : method_(method) { } - R Run(const T* object) { - return (object->*method_)(); + R Run(const T* object, + typename CallbackParamTraits<Args>::ForwardType... args) { + return (object->*method_)(CallbackForward(args)...); } private: - R (T::*method_)() const; + R (T::*method_)(Args...) const; }; -// Function: Arity 1. -template <typename R, typename A1> -class RunnableAdapter<R(*)(A1)> { - public: - typedef R (RunType)(A1); - - explicit RunnableAdapter(R(*function)(A1)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1) { - return function_(CallbackForward(a1)); - } - - private: - R (*function_)(A1); -}; - -// Method: Arity 1. -template <typename R, typename T, typename A1> -class RunnableAdapter<R(T::*)(A1)> { - public: - typedef R (RunType)(T*, A1); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) { - return (object->*method_)(CallbackForward(a1)); - } - - private: - R (T::*method_)(A1); -}; - -// Const Method: Arity 1. -template <typename R, typename T, typename A1> -class RunnableAdapter<R(T::*)(A1) const> { - public: - typedef R (RunType)(const T*, A1); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) { - return (object->*method_)(CallbackForward(a1)); - } - - private: - R (T::*method_)(A1) const; -}; - -// Function: Arity 2. -template <typename R, typename A1, typename A2> -class RunnableAdapter<R(*)(A1, A2)> { - public: - typedef R (RunType)(A1, A2); - - explicit RunnableAdapter(R(*function)(A1, A2)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2) { - return function_(CallbackForward(a1), CallbackForward(a2)); - } - - private: - R (*function_)(A1, A2); -}; - -// Method: Arity 2. -template <typename R, typename T, typename A1, typename A2> -class RunnableAdapter<R(T::*)(A1, A2)> { - public: - typedef R (RunType)(T*, A1, A2); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2)); - } - - private: - R (T::*method_)(A1, A2); -}; - -// Const Method: Arity 2. -template <typename R, typename T, typename A1, typename A2> -class RunnableAdapter<R(T::*)(A1, A2) const> { - public: - typedef R (RunType)(const T*, A1, A2); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2)); - } - - private: - R (T::*method_)(A1, A2) const; -}; - -// Function: Arity 3. -template <typename R, typename A1, typename A2, typename A3> -class RunnableAdapter<R(*)(A1, A2, A3)> { - public: - typedef R (RunType)(A1, A2, A3); - - explicit RunnableAdapter(R(*function)(A1, A2, A3)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3) { - return function_(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3)); - } - - private: - R (*function_)(A1, A2, A3); -}; - -// Method: Arity 3. -template <typename R, typename T, typename A1, typename A2, typename A3> -class RunnableAdapter<R(T::*)(A1, A2, A3)> { - public: - typedef R (RunType)(T*, A1, A2, A3); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3)); - } - - private: - R (T::*method_)(A1, A2, A3); -}; - -// Const Method: Arity 3. -template <typename R, typename T, typename A1, typename A2, typename A3> -class RunnableAdapter<R(T::*)(A1, A2, A3) const> { - public: - typedef R (RunType)(const T*, A1, A2, A3); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3)); - } - - private: - R (T::*method_)(A1, A2, A3) const; -}; - -// Function: Arity 4. -template <typename R, typename A1, typename A2, typename A3, typename A4> -class RunnableAdapter<R(*)(A1, A2, A3, A4)> { - public: - typedef R (RunType)(A1, A2, A3, A4); - - explicit RunnableAdapter(R(*function)(A1, A2, A3, A4)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4) { - return function_(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4)); - } - - private: - R (*function_)(A1, A2, A3, A4); -}; - -// Method: Arity 4. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4)> { - public: - typedef R (RunType)(T*, A1, A2, A3, A4); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4)); - } - - private: - R (T::*method_)(A1, A2, A3, A4); -}; - -// Const Method: Arity 4. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4) const> { - public: - typedef R (RunType)(const T*, A1, A2, A3, A4); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4)); - } - - private: - R (T::*method_)(A1, A2, A3, A4) const; -}; - -// Function: Arity 5. -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5> -class RunnableAdapter<R(*)(A1, A2, A3, A4, A5)> { - public: - typedef R (RunType)(A1, A2, A3, A4, A5); - - explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5) { - return function_(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); - } - - private: - R (*function_)(A1, A2, A3, A4, A5); -}; - -// Method: Arity 5. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4, typename A5> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5)> { - public: - typedef R (RunType)(T*, A1, A2, A3, A4, A5); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); - } - - private: - R (T::*method_)(A1, A2, A3, A4, A5); -}; - -// Const Method: Arity 5. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4, typename A5> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5) const> { - public: - typedef R (RunType)(const T*, A1, A2, A3, A4, A5); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); - } - - private: - R (T::*method_)(A1, A2, A3, A4, A5) const; -}; - -// Function: Arity 6. -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6> -class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6)> { - public: - typedef R (RunType)(A1, A2, A3, A4, A5, A6); - - explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5, - typename CallbackParamTraits<A6>::ForwardType a6) { - return function_(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6)); - } - - private: - R (*function_)(A1, A2, A3, A4, A5, A6); -}; - -// Method: Arity 6. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4, typename A5, typename A6> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6)> { - public: - typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5, - typename CallbackParamTraits<A6>::ForwardType a6) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6)); - } - - private: - R (T::*method_)(A1, A2, A3, A4, A5, A6); -}; - -// Const Method: Arity 6. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4, typename A5, typename A6> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6) const> { - public: - typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5, - typename CallbackParamTraits<A6>::ForwardType a6) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6)); - } - - private: - R (T::*method_)(A1, A2, A3, A4, A5, A6) const; -}; - -// Function: Arity 7. -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6, typename A7> -class RunnableAdapter<R(*)(A1, A2, A3, A4, A5, A6, A7)> { - public: - typedef R (RunType)(A1, A2, A3, A4, A5, A6, A7); - - explicit RunnableAdapter(R(*function)(A1, A2, A3, A4, A5, A6, A7)) - : function_(function) { - } - - R Run(typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5, - typename CallbackParamTraits<A6>::ForwardType a6, - typename CallbackParamTraits<A7>::ForwardType a7) { - return function_(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6), CallbackForward(a7)); - } - - private: - R (*function_)(A1, A2, A3, A4, A5, A6, A7); -}; - -// Method: Arity 7. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4, typename A5, typename A6, typename A7> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7)> { - public: - typedef R (RunType)(T*, A1, A2, A3, A4, A5, A6, A7); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7)) - : method_(method) { - } - - R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5, - typename CallbackParamTraits<A6>::ForwardType a6, - typename CallbackParamTraits<A7>::ForwardType a7) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6), CallbackForward(a7)); - } - - private: - R (T::*method_)(A1, A2, A3, A4, A5, A6, A7); -}; - -// Const Method: Arity 7. -template <typename R, typename T, typename A1, typename A2, typename A3, - typename A4, typename A5, typename A6, typename A7> -class RunnableAdapter<R(T::*)(A1, A2, A3, A4, A5, A6, A7) const> { - public: - typedef R (RunType)(const T*, A1, A2, A3, A4, A5, A6, A7); - typedef true_type IsMethod; - - explicit RunnableAdapter(R(T::*method)(A1, A2, A3, A4, A5, A6, A7) const) - : method_(method) { - } - - R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1, - typename CallbackParamTraits<A2>::ForwardType a2, - typename CallbackParamTraits<A3>::ForwardType a3, - typename CallbackParamTraits<A4>::ForwardType a4, - typename CallbackParamTraits<A5>::ForwardType a5, - typename CallbackParamTraits<A6>::ForwardType a6, - typename CallbackParamTraits<A7>::ForwardType a7) { - return (object->*method_)(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6), CallbackForward(a7)); - } - - private: - R (T::*method_)(A1, A2, A3, A4, A5, A6, A7) const; -}; - - +// TODO(tzik): Remove FunctionTraits after we finish removing bind.pump. // FunctionTraits<> // // Breaks a function signature apart into typedefs for easier introspection. @@ -729,47 +239,9 @@ template <typename Sig> struct ForceVoidReturn; -template <typename R> -struct ForceVoidReturn<R()> { - typedef void(RunType)(); -}; - -template <typename R, typename A1> -struct ForceVoidReturn<R(A1)> { - typedef void(RunType)(A1); -}; - -template <typename R, typename A1, typename A2> -struct ForceVoidReturn<R(A1, A2)> { - typedef void(RunType)(A1, A2); -}; - -template <typename R, typename A1, typename A2, typename A3> -struct ForceVoidReturn<R(A1, A2, A3)> { - typedef void(RunType)(A1, A2, A3); -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4> -struct ForceVoidReturn<R(A1, A2, A3, A4)> { - typedef void(RunType)(A1, A2, A3, A4); -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5> -struct ForceVoidReturn<R(A1, A2, A3, A4, A5)> { - typedef void(RunType)(A1, A2, A3, A4, A5); -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6> -struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6)> { - typedef void(RunType)(A1, A2, A3, A4, A5, A6); -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6, typename A7> -struct ForceVoidReturn<R(A1, A2, A3, A4, A5, A6, A7)> { - typedef void(RunType)(A1, A2, A3, A4, A5, A6, A7); +template <typename R, typename... Args> +struct ForceVoidReturn<R(Args...)> { + typedef void(RunType)(Args...); }; @@ -840,246 +312,28 @@ typename ArgsType> struct InvokeHelper; -template <typename ReturnType, typename Runnable> +template <typename ReturnType, typename Runnable, typename... Args> struct InvokeHelper<false, ReturnType, Runnable, - void()> { - static ReturnType MakeItSo(Runnable runnable) { - return runnable.Run(); + void(Args...)> { + static ReturnType MakeItSo(Runnable runnable, Args... args) { + return runnable.Run(CallbackForward(args)...); } }; -template <typename Runnable> -struct InvokeHelper<false, void, Runnable, - void()> { - static void MakeItSo(Runnable runnable) { - runnable.Run(); +template <typename Runnable, typename... Args> +struct InvokeHelper<false, void, Runnable, void(Args...)> { + static void MakeItSo(Runnable runnable, Args... args) { + runnable.Run(CallbackForward(args)...); } }; -template <typename ReturnType, typename Runnable,typename A1> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1) { - return runnable.Run(CallbackForward(a1)); - } -}; - -template <typename Runnable,typename A1> -struct InvokeHelper<false, void, Runnable, - void(A1)> { - static void MakeItSo(Runnable runnable, A1 a1) { - runnable.Run(CallbackForward(a1)); - } -}; - -template <typename Runnable, typename BoundWeakPtr> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr) { +template <typename Runnable, typename BoundWeakPtr, typename... Args> +struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, Args...)> { + static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, Args... args) { if (!weak_ptr.get()) { return; } - runnable.Run(weak_ptr.get()); - } -}; - -template <typename ReturnType, typename Runnable,typename A1, typename A2> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1, A2)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) { - return runnable.Run(CallbackForward(a1), CallbackForward(a2)); - } -}; - -template <typename Runnable,typename A1, typename A2> -struct InvokeHelper<false, void, Runnable, - void(A1, A2)> { - static void MakeItSo(Runnable runnable, A1 a1, A2 a2) { - runnable.Run(CallbackForward(a1), CallbackForward(a2)); - } -}; - -template <typename Runnable, typename BoundWeakPtr, typename A2> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr, A2)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2) { - if (!weak_ptr.get()) { - return; - } - runnable.Run(weak_ptr.get(), CallbackForward(a2)); - } -}; - -template <typename ReturnType, typename Runnable,typename A1, typename A2, - typename A3> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1, A2, A3)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) { - return runnable.Run(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3)); - } -}; - -template <typename Runnable,typename A1, typename A2, typename A3> -struct InvokeHelper<false, void, Runnable, - void(A1, A2, A3)> { - static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) { - runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3)); - } -}; - -template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr, A2, A3)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3) { - if (!weak_ptr.get()) { - return; - } - runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3)); - } -}; - -template <typename ReturnType, typename Runnable,typename A1, typename A2, - typename A3, typename A4> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1, A2, A3, A4)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) { - return runnable.Run(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4)); - } -}; - -template <typename Runnable,typename A1, typename A2, typename A3, typename A4> -struct InvokeHelper<false, void, Runnable, - void(A1, A2, A3, A4)> { - static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) { - runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4)); - } -}; - -template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, - typename A4> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr, A2, A3, A4)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, - A4 a4) { - if (!weak_ptr.get()) { - return; - } - runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4)); - } -}; - -template <typename ReturnType, typename Runnable,typename A1, typename A2, - typename A3, typename A4, typename A5> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1, A2, A3, A4, A5)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, - A5 a5) { - return runnable.Run(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5)); - } -}; - -template <typename Runnable,typename A1, typename A2, typename A3, typename A4, - typename A5> -struct InvokeHelper<false, void, Runnable, - void(A1, A2, A3, A4, A5)> { - static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) { - runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4), CallbackForward(a5)); - } -}; - -template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, - typename A4, typename A5> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr, A2, A3, A4, A5)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, - A4 a4, A5 a5) { - if (!weak_ptr.get()) { - return; - } - runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4), CallbackForward(a5)); - } -}; - -template <typename ReturnType, typename Runnable,typename A1, typename A2, - typename A3, typename A4, typename A5, typename A6> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1, A2, A3, A4, A5, A6)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, - A5 a5, A6 a6) { - return runnable.Run(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6)); - } -}; - -template <typename Runnable,typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6> -struct InvokeHelper<false, void, Runnable, - void(A1, A2, A3, A4, A5, A6)> { - static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, - A6 a6) { - runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4), CallbackForward(a5), CallbackForward(a6)); - } -}; - -template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, - typename A4, typename A5, typename A6> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr, A2, A3, A4, A5, A6)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, - A4 a4, A5 a5, A6 a6) { - if (!weak_ptr.get()) { - return; - } - runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4), CallbackForward(a5), CallbackForward(a6)); - } -}; - -template <typename ReturnType, typename Runnable,typename A1, typename A2, - typename A3, typename A4, typename A5, typename A6, typename A7> -struct InvokeHelper<false, ReturnType, Runnable, - void(A1, A2, A3, A4, A5, A6, A7)> { - static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, - A5 a5, A6 a6, A7 a7) { - return runnable.Run(CallbackForward(a1), CallbackForward(a2), - CallbackForward(a3), CallbackForward(a4), CallbackForward(a5), - CallbackForward(a6), CallbackForward(a7)); - } -}; - -template <typename Runnable,typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6, typename A7> -struct InvokeHelper<false, void, Runnable, - void(A1, A2, A3, A4, A5, A6, A7)> { - static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, - A6 a6, A7 a7) { - runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4), CallbackForward(a5), CallbackForward(a6), - CallbackForward(a7)); - } -}; - -template <typename Runnable, typename BoundWeakPtr, typename A2, typename A3, - typename A4, typename A5, typename A6, typename A7> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr, A2, A3, A4, A5, A6, A7)> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, A2 a2, A3 a3, - A4 a4, A5 a5, A6 a6, A7 a7) { - if (!weak_ptr.get()) { - return; - } - runnable.Run(weak_ptr.get(), CallbackForward(a2), CallbackForward(a3), - CallbackForward(a4), CallbackForward(a5), CallbackForward(a6), - CallbackForward(a7)); + runnable.Run(weak_ptr.get(), CallbackForward(args)...); } };
diff --git a/bind_internal.h.pump b/bind_internal.h.pump index f632b99..9ddca47 100644 --- a/bind_internal.h.pump +++ b/bind_internal.h.pump
@@ -57,18 +57,15 @@ // Types: // RunnableAdapter<> -- Wraps the various "function" pointer types into an // object that adheres to the Runnable interface. -// There are |3*ARITY| RunnableAdapter types. // FunctionTraits<> -- Type traits that unwrap a function signature into a // a set of easier to use typedefs. Used mainly for // compile time asserts. // There are |ARITY| FunctionTraits types. // ForceVoidReturn<> -- Helper class for translating function signatures to // equivalent forms with a "void" return type. -// There are |ARITY| ForceVoidReturn types. // FunctorTraits<> -- Type traits used determine the correct RunType and // RunnableType for a Functor. This is where function // signature adapters are applied. -// There are |ARITY| ForceVoidReturn types. // MakeRunnable<> -- Takes a Functor and returns an object in the Runnable // type class that represents the underlying Functor. // There are |O(1)| MakeRunnable types. @@ -77,7 +74,6 @@ // and for ignoring return values. This is separate from // Invoker to avoid creating multiple version of Invoker<> // which grows at O(n^2) with the arity. -// There are |k*ARITY| InvokeHelper types. // Invoker<> -- Unwraps the curried parameters and executes the Runnable. // There are |(ARITY^2 + ARITY)/2| Invoketypes. // BindState<> -- Stores the curried parameters, and is the main entry point @@ -107,75 +103,64 @@ template <typename Functor> class RunnableAdapter; -$for ARITY [[ -$range ARG 1..ARITY - -// Function: Arity $(ARITY). -template <typename R[[]] -$if ARITY > 0[[, ]] $for ARG , [[typename A$(ARG)]]> -class RunnableAdapter<R(*)($for ARG , [[A$(ARG)]])> { +// Function. +template <typename R, typename... Args> +class RunnableAdapter<R(*)(Args...)> { public: - typedef R (RunType)($for ARG , [[A$(ARG)]]); + typedef R (RunType)(Args...); - explicit RunnableAdapter(R(*function)($for ARG , [[A$(ARG)]])) + explicit RunnableAdapter(R(*function)(Args...)) : function_(function) { } - R Run($for ARG , [[typename CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) { - return function_($for ARG , [[CallbackForward(a$(ARG))]]); + R Run(typename CallbackParamTraits<Args>::ForwardType... args) { + return function_(CallbackForward(args)...); } private: - R (*function_)($for ARG , [[A$(ARG)]]); + R (*function_)(Args...); }; -// Method: Arity $(ARITY). -template <typename R, typename T[[]] -$if ARITY > 0[[, ]] $for ARG , [[typename A$(ARG)]]> -class RunnableAdapter<R(T::*)($for ARG , [[A$(ARG)]])> { +// Method. +template <typename R, typename T, typename... Args> +class RunnableAdapter<R(T::*)(Args...)> { public: - typedef R (RunType)(T*[[]] -$if ARITY > 0[[, ]] $for ARG , [[A$(ARG)]]); + typedef R (RunType)(T*, Args...); typedef true_type IsMethod; - explicit RunnableAdapter(R(T::*method)($for ARG , [[A$(ARG)]])) + explicit RunnableAdapter(R(T::*method)(Args...)) : method_(method) { } - R Run(T* object[[]] -$if ARITY > 0[[, ]] $for ARG, [[typename CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) { - return (object->*method_)($for ARG , [[CallbackForward(a$(ARG))]]); + R Run(T* object, typename CallbackParamTraits<Args>::ForwardType... args) { + return (object->*method_)(CallbackForward(args)...); } private: - R (T::*method_)($for ARG , [[A$(ARG)]]); + R (T::*method_)(Args...); }; -// Const Method: Arity $(ARITY). -template <typename R, typename T[[]] -$if ARITY > 0[[, ]] $for ARG , [[typename A$(ARG)]]> -class RunnableAdapter<R(T::*)($for ARG , [[A$(ARG)]]) const> { +// Const Method. +template <typename R, typename T, typename... Args> +class RunnableAdapter<R(T::*)(Args...) const> { public: - typedef R (RunType)(const T*[[]] -$if ARITY > 0[[, ]] $for ARG , [[A$(ARG)]]); + typedef R (RunType)(const T*, Args...); typedef true_type IsMethod; - explicit RunnableAdapter(R(T::*method)($for ARG , [[A$(ARG)]]) const) + explicit RunnableAdapter(R(T::*method)(Args...) const) : method_(method) { } - R Run(const T* object[[]] -$if ARITY > 0[[, ]] $for ARG, [[typename CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) { - return (object->*method_)($for ARG , [[CallbackForward(a$(ARG))]]); + R Run(const T* object, + typename CallbackParamTraits<Args>::ForwardType... args) { + return (object->*method_)(CallbackForward(args)...); } private: - R (T::*method_)($for ARG , [[A$(ARG)]]) const; + R (T::*method_)(Args...) const; }; -]] $$ for ARITY - - +// TODO(tzik): Remove FunctionTraits after we finish removing bind.pump. // FunctionTraits<> // // Breaks a function signature apart into typedefs for easier introspection. @@ -205,17 +190,11 @@ template <typename Sig> struct ForceVoidReturn; -$for ARITY [[ -$range ARG 1..ARITY - -template <typename R[[]] -$if ARITY > 0[[, ]] $for ARG , [[typename A$(ARG)]]> -struct ForceVoidReturn<R($for ARG , [[A$(ARG)]])> { - typedef void(RunType)($for ARG , [[A$(ARG)]]); +template <typename R, typename... Args> +struct ForceVoidReturn<R(Args...)> { + typedef void(RunType)(Args...); }; -]] $$ for ARITY - // FunctorTraits<> // @@ -284,51 +263,31 @@ typename ArgsType> struct InvokeHelper; -$for ARITY [[ -$range ARG 1..ARITY -$range WEAKCALL_ARG 2..ARITY - -template <typename ReturnType, typename Runnable[[]] -$if ARITY > 0 [[,]] $for ARG , [[typename A$(ARG)]]> +template <typename ReturnType, typename Runnable, typename... Args> struct InvokeHelper<false, ReturnType, Runnable, - void($for ARG , [[A$(ARG)]])> { - static ReturnType MakeItSo(Runnable runnable[[]] -$if ARITY > 0[[, ]] $for ARG , [[A$(ARG) a$(ARG)]]) { - return runnable.Run($for ARG , [[CallbackForward(a$(ARG))]]); + void(Args...)> { + static ReturnType MakeItSo(Runnable runnable, Args... args) { + return runnable.Run(CallbackForward(args)...); } }; -template <typename Runnable[[]] -$if ARITY > 0 [[,]] $for ARG , [[typename A$(ARG)]]> -struct InvokeHelper<false, void, Runnable, - void($for ARG , [[A$(ARG)]])> { - static void MakeItSo(Runnable runnable[[]] -$if ARITY > 0[[, ]] $for ARG , [[A$(ARG) a$(ARG)]]) { - runnable.Run($for ARG , [[CallbackForward(a$(ARG))]]); +template <typename Runnable, typename... Args> +struct InvokeHelper<false, void, Runnable, void(Args...)> { + static void MakeItSo(Runnable runnable, Args... args) { + runnable.Run(CallbackForward(args)...); } }; -$if ARITY > 0 [[ - -template <typename Runnable[[]], typename BoundWeakPtr -$if ARITY > 1[[, ]] $for WEAKCALL_ARG , [[typename A$(WEAKCALL_ARG)]]> -struct InvokeHelper<true, void, Runnable, - void(BoundWeakPtr -$if ARITY > 1[[, ]] $for WEAKCALL_ARG , [[A$(WEAKCALL_ARG)]])> { - static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr -$if ARITY > 1[[, ]] $for WEAKCALL_ARG , [[A$(WEAKCALL_ARG) a$(WEAKCALL_ARG)]]) { +template <typename Runnable, typename BoundWeakPtr, typename... Args> +struct InvokeHelper<true, void, Runnable, void(BoundWeakPtr, Args...)> { + static void MakeItSo(Runnable runnable, BoundWeakPtr weak_ptr, Args... args) { if (!weak_ptr.get()) { return; } - runnable.Run(weak_ptr.get() -$if ARITY > 1[[, ]] $for WEAKCALL_ARG , [[CallbackForward(a$(WEAKCALL_ARG))]]); + runnable.Run(weak_ptr.get(), CallbackForward(args)...); } }; -]] - -]] $$ for ARITY - #if !defined(_MSC_VER) template <typename ReturnType, typename Runnable, typename ArgsType>
diff --git a/callback.h b/callback.h index 364f506..00669dd 100644 --- a/callback.h +++ b/callback.h
@@ -1,8 +1,3 @@ -// This file was GENERATED by command: -// pump.py callback.h.pump -// DO NOT EDIT BY HAND!!! - - // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -367,10 +362,10 @@ struct BindState; } // namespace internal -template <typename R> -class Callback<R(void)> : public internal::CallbackBase { +template <typename R, typename... Args> +class Callback<R(Args...)> : public internal::CallbackBase { public: - typedef R(RunType)(); + typedef R(RunType)(Args...); Callback() : CallbackBase(NULL) { } @@ -380,7 +375,6 @@ Callback(internal::BindState<Runnable, BindRunType, BoundArgsType>* bind_state) : CallbackBase(bind_state) { - // Force the assignment to a local variable of PolymorphicInvoke // so the compiler will typecheck that the passed in Run() method has // the correct type. @@ -394,377 +388,24 @@ return CallbackBase::Equals(other); } - R Run() const { + R Run(typename internal::CallbackParamTraits<Args>::ForwardType... args) + const { PolymorphicInvoke f = reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - return f(bind_state_.get()); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*); - -}; - -template <typename R, typename A1> -class Callback<R(A1)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1)); + return f(bind_state_.get(), internal::CallbackForward(args)...); } private: typedef R(*PolymorphicInvoke)( internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType); - + typename internal::CallbackParamTraits<Args>::ForwardType...); }; -template <typename R, typename A1, typename A2> -class Callback<R(A1, A2)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1, A2); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1), - internal::CallbackForward(a2)); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType, - typename internal::CallbackParamTraits<A2>::ForwardType); - -}; - -template <typename R, typename A1, typename A2, typename A3> -class Callback<R(A1, A2, A3)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1, A2, A3); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1), - internal::CallbackForward(a2), - internal::CallbackForward(a3)); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType, - typename internal::CallbackParamTraits<A2>::ForwardType, - typename internal::CallbackParamTraits<A3>::ForwardType); - -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4> -class Callback<R(A1, A2, A3, A4)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1, A2, A3, A4); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1), - internal::CallbackForward(a2), - internal::CallbackForward(a3), - internal::CallbackForward(a4)); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType, - typename internal::CallbackParamTraits<A2>::ForwardType, - typename internal::CallbackParamTraits<A3>::ForwardType, - typename internal::CallbackParamTraits<A4>::ForwardType); - -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5> -class Callback<R(A1, A2, A3, A4, A5)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1, A2, A3, A4, A5); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4, - typename internal::CallbackParamTraits<A5>::ForwardType a5) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1), - internal::CallbackForward(a2), - internal::CallbackForward(a3), - internal::CallbackForward(a4), - internal::CallbackForward(a5)); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType, - typename internal::CallbackParamTraits<A2>::ForwardType, - typename internal::CallbackParamTraits<A3>::ForwardType, - typename internal::CallbackParamTraits<A4>::ForwardType, - typename internal::CallbackParamTraits<A5>::ForwardType); - -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6> -class Callback<R(A1, A2, A3, A4, A5, A6)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1, A2, A3, A4, A5, A6); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4, - typename internal::CallbackParamTraits<A5>::ForwardType a5, - typename internal::CallbackParamTraits<A6>::ForwardType a6) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1), - internal::CallbackForward(a2), - internal::CallbackForward(a3), - internal::CallbackForward(a4), - internal::CallbackForward(a5), - internal::CallbackForward(a6)); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType, - typename internal::CallbackParamTraits<A2>::ForwardType, - typename internal::CallbackParamTraits<A3>::ForwardType, - typename internal::CallbackParamTraits<A4>::ForwardType, - typename internal::CallbackParamTraits<A5>::ForwardType, - typename internal::CallbackParamTraits<A6>::ForwardType); - -}; - -template <typename R, typename A1, typename A2, typename A3, typename A4, - typename A5, typename A6, typename A7> -class Callback<R(A1, A2, A3, A4, A5, A6, A7)> : public internal::CallbackBase { - public: - typedef R(RunType)(A1, A2, A3, A4, A5, A6, A7); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4, - typename internal::CallbackParamTraits<A5>::ForwardType a5, - typename internal::CallbackParamTraits<A6>::ForwardType a6, - typename internal::CallbackParamTraits<A7>::ForwardType a7) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get(), internal::CallbackForward(a1), - internal::CallbackForward(a2), - internal::CallbackForward(a3), - internal::CallbackForward(a4), - internal::CallbackForward(a5), - internal::CallbackForward(a6), - internal::CallbackForward(a7)); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*, - typename internal::CallbackParamTraits<A1>::ForwardType, - typename internal::CallbackParamTraits<A2>::ForwardType, - typename internal::CallbackParamTraits<A3>::ForwardType, - typename internal::CallbackParamTraits<A4>::ForwardType, - typename internal::CallbackParamTraits<A5>::ForwardType, - typename internal::CallbackParamTraits<A6>::ForwardType, - typename internal::CallbackParamTraits<A7>::ForwardType); - -}; - - // Syntactic sugar to make Callback<void(void)> easier to declare since it // will be used in a lot of APIs with delayed execution. typedef Callback<void(void)> Closure; } // namespace base -#endif // BASE_CALLBACK_H +#endif // BASE_CALLBACK_H_
diff --git a/callback.h.pump b/callback.h.pump deleted file mode 100644 index 686196d..0000000 --- a/callback.h.pump +++ /dev/null
@@ -1,436 +0,0 @@ -$$ This is a pump file for generating file templates. Pump is a python -$$ script that is part of the Google Test suite of utilities. Description -$$ can be found here: -$$ -$$ http://code.google.com/p/googletest/wiki/PumpManual -$$ - -$$ See comment for MAX_ARITY in base/bind.h.pump. -$var MAX_ARITY = 7 - -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_CALLBACK_H_ -#define BASE_CALLBACK_H_ - -#include "base/callback_forward.h" -#include "base/callback_internal.h" -#include "base/template_util.h" - -// NOTE: Header files that do not require the full definition of Callback or -// Closure should #include "base/callback_forward.h" instead of this file. - -// ----------------------------------------------------------------------------- -// Introduction -// ----------------------------------------------------------------------------- -// -// The templated Callback class is a generalized function object. Together -// with the Bind() function in bind.h, they provide a type-safe method for -// performing partial application of functions. -// -// Partial application (or "currying") is the process of binding a subset of -// a function's arguments to produce another function that takes fewer -// arguments. This can be used to pass around a unit of delayed execution, -// much like lexical closures are used in other languages. For example, it -// is used in Chromium code to schedule tasks on different MessageLoops. -// -// A callback with no unbound input parameters (base::Callback<void(void)>) -// is called a base::Closure. Note that this is NOT the same as what other -// languages refer to as a closure -- it does not retain a reference to its -// enclosing environment. -// -// MEMORY MANAGEMENT AND PASSING -// -// The Callback objects themselves should be passed by const-reference, and -// stored by copy. They internally store their state via a refcounted class -// and thus do not need to be deleted. -// -// The reason to pass via a const-reference is to avoid unnecessary -// AddRef/Release pairs to the internal state. -// -// -// ----------------------------------------------------------------------------- -// Quick reference for basic stuff -// ----------------------------------------------------------------------------- -// -// BINDING A BARE FUNCTION -// -// int Return5() { return 5; } -// base::Callback<int(void)> func_cb = base::Bind(&Return5); -// LOG(INFO) << func_cb.Run(); // Prints 5. -// -// BINDING A CLASS METHOD -// -// The first argument to bind is the member function to call, the second is -// the object on which to call it. -// -// class Ref : public base::RefCountedThreadSafe<Ref> { -// public: -// int Foo() { return 3; } -// void PrintBye() { LOG(INFO) << "bye."; } -// }; -// scoped_refptr<Ref> ref = new Ref(); -// base::Callback<void(void)> ref_cb = base::Bind(&Ref::Foo, ref); -// LOG(INFO) << ref_cb.Run(); // Prints out 3. -// -// By default the object must support RefCounted or you will get a compiler -// error. If you're passing between threads, be sure it's -// RefCountedThreadSafe! See "Advanced binding of member functions" below if -// you don't want to use reference counting. -// -// RUNNING A CALLBACK -// -// Callbacks can be run with their "Run" method, which has the same -// signature as the template argument to the callback. -// -// void DoSomething(const base::Callback<void(int, std::string)>& callback) { -// callback.Run(5, "hello"); -// } -// -// Callbacks can be run more than once (they don't get deleted or marked when -// run). However, this precludes using base::Passed (see below). -// -// void DoSomething(const base::Callback<double(double)>& callback) { -// double myresult = callback.Run(3.14159); -// myresult += callback.Run(2.71828); -// } -// -// PASSING UNBOUND INPUT PARAMETERS -// -// Unbound parameters are specified at the time a callback is Run(). They are -// specified in the Callback template type: -// -// void MyFunc(int i, const std::string& str) {} -// base::Callback<void(int, const std::string&)> cb = base::Bind(&MyFunc); -// cb.Run(23, "hello, world"); -// -// PASSING BOUND INPUT PARAMETERS -// -// Bound parameters are specified when you create thee callback as arguments -// to Bind(). They will be passed to the function and the Run()ner of the -// callback doesn't see those values or even know that the function it's -// calling. -// -// void MyFunc(int i, const std::string& str) {} -// base::Callback<void(void)> cb = base::Bind(&MyFunc, 23, "hello world"); -// cb.Run(); -// -// A callback with no unbound input parameters (base::Callback<void(void)>) -// is called a base::Closure. So we could have also written: -// -// base::Closure cb = base::Bind(&MyFunc, 23, "hello world"); -// -// When calling member functions, bound parameters just go after the object -// pointer. -// -// base::Closure cb = base::Bind(&MyClass::MyFunc, this, 23, "hello world"); -// -// PARTIAL BINDING OF PARAMETERS -// -// You can specify some parameters when you create the callback, and specify -// the rest when you execute the callback. -// -// void MyFunc(int i, const std::string& str) {} -// base::Callback<void(const std::string&)> cb = base::Bind(&MyFunc, 23); -// cb.Run("hello world"); -// -// When calling a function bound parameters are first, followed by unbound -// parameters. -// -// -// ----------------------------------------------------------------------------- -// Quick reference for advanced binding -// ----------------------------------------------------------------------------- -// -// BINDING A CLASS METHOD WITH WEAK POINTERS -// -// base::Bind(&MyClass::Foo, GetWeakPtr()); -// -// The callback will not be run if the object has already been destroyed. -// DANGER: weak pointers are not threadsafe, so don't use this -// when passing between threads! -// -// BINDING A CLASS METHOD WITH MANUAL LIFETIME MANAGEMENT -// -// base::Bind(&MyClass::Foo, base::Unretained(this)); -// -// This disables all lifetime management on the object. You're responsible -// for making sure the object is alive at the time of the call. You break it, -// you own it! -// -// BINDING A CLASS METHOD AND HAVING THE CALLBACK OWN THE CLASS -// -// MyClass* myclass = new MyClass; -// base::Bind(&MyClass::Foo, base::Owned(myclass)); -// -// The object will be deleted when the callback is destroyed, even if it's -// not run (like if you post a task during shutdown). Potentially useful for -// "fire and forget" cases. -// -// IGNORING RETURN VALUES -// -// Sometimes you want to call a function that returns a value in a callback -// that doesn't expect a return value. -// -// int DoSomething(int arg) { cout << arg << endl; } -// base::Callback<void<int>) cb = -// base::Bind(base::IgnoreResult(&DoSomething)); -// -// -// ----------------------------------------------------------------------------- -// Quick reference for binding parameters to Bind() -// ----------------------------------------------------------------------------- -// -// Bound parameters are specified as arguments to Bind() and are passed to the -// function. A callback with no parameters or no unbound parameters is called a -// Closure (base::Callback<void(void)> and base::Closure are the same thing). -// -// PASSING PARAMETERS OWNED BY THE CALLBACK -// -// void Foo(int* arg) { cout << *arg << endl; } -// int* pn = new int(1); -// base::Closure foo_callback = base::Bind(&foo, base::Owned(pn)); -// -// The parameter will be deleted when the callback is destroyed, even if it's -// not run (like if you post a task during shutdown). -// -// PASSING PARAMETERS AS A scoped_ptr -// -// void TakesOwnership(scoped_ptr<Foo> arg) {} -// scoped_ptr<Foo> f(new Foo); -// // f becomes null during the following call. -// base::Closure cb = base::Bind(&TakesOwnership, base::Passed(&f)); -// -// Ownership of the parameter will be with the callback until the it is run, -// when ownership is passed to the callback function. This means the callback -// can only be run once. If the callback is never run, it will delete the -// object when it's destroyed. -// -// PASSING PARAMETERS AS A scoped_refptr -// -// void TakesOneRef(scoped_refptr<Foo> arg) {} -// scoped_refptr<Foo> f(new Foo) -// base::Closure cb = base::Bind(&TakesOneRef, f); -// -// This should "just work." The closure will take a reference as long as it -// is alive, and another reference will be taken for the called function. -// -// PASSING PARAMETERS BY REFERENCE -// -// void foo(int arg) { cout << arg << endl } -// int n = 1; -// base::Closure has_ref = base::Bind(&foo, base::ConstRef(n)); -// n = 2; -// has_ref.Run(); // Prints "2" -// -// Normally parameters are copied in the closure. DANGER: ConstRef stores a -// const reference instead, referencing the original parameter. This means -// that you must ensure the object outlives the callback! -// -// -// ----------------------------------------------------------------------------- -// Implementation notes -// ----------------------------------------------------------------------------- -// -// WHERE IS THIS DESIGN FROM: -// -// The design Callback and Bind is heavily influenced by C++'s -// tr1::function/tr1::bind, and by the "Google Callback" system used inside -// Google. -// -// -// HOW THE IMPLEMENTATION WORKS: -// -// There are three main components to the system: -// 1) The Callback classes. -// 2) The Bind() functions. -// 3) The arguments wrappers (e.g., Unretained() and ConstRef()). -// -// The Callback classes represent a generic function pointer. Internally, -// it stores a refcounted piece of state that represents the target function -// and all its bound parameters. Each Callback specialization has a templated -// constructor that takes an BindState<>*. In the context of the constructor, -// the static type of this BindState<> pointer uniquely identifies the -// function it is representing, all its bound parameters, and a Run() method -// that is capable of invoking the target. -// -// Callback's constructor takes the BindState<>* that has the full static type -// and erases the target function type as well as the types of the bound -// parameters. It does this by storing a pointer to the specific Run() -// function, and upcasting the state of BindState<>* to a -// BindStateBase*. This is safe as long as this BindStateBase pointer -// is only used with the stored Run() pointer. -// -// To BindState<> objects are created inside the Bind() functions. -// These functions, along with a set of internal templates, are responsible for -// -// - Unwrapping the function signature into return type, and parameters -// - Determining the number of parameters that are bound -// - Creating the BindState storing the bound parameters -// - Performing compile-time asserts to avoid error-prone behavior -// - Returning an Callback<> with an arity matching the number of unbound -// parameters and that knows the correct refcounting semantics for the -// target object if we are binding a method. -// -// The Bind functions do the above using type-inference, and template -// specializations. -// -// By default Bind() will store copies of all bound parameters, and attempt -// to refcount a target object if the function being bound is a class method. -// These copies are created even if the function takes parameters as const -// references. (Binding to non-const references is forbidden, see bind.h.) -// -// To change this behavior, we introduce a set of argument wrappers -// (e.g., Unretained(), and ConstRef()). These are simple container templates -// that are passed by value, and wrap a pointer to argument. See the -// file-level comment in base/bind_helpers.h for more info. -// -// These types are passed to the Unwrap() functions, and the MaybeRefcount() -// functions respectively to modify the behavior of Bind(). The Unwrap() -// and MaybeRefcount() functions change behavior by doing partial -// specialization based on whether or not a parameter is a wrapper type. -// -// ConstRef() is similar to tr1::cref. Unretained() is specific to Chromium. -// -// -// WHY NOT TR1 FUNCTION/BIND? -// -// Direct use of tr1::function and tr1::bind was considered, but ultimately -// rejected because of the number of copy constructors invocations involved -// in the binding of arguments during construction, and the forwarding of -// arguments during invocation. These copies will no longer be an issue in -// C++0x because C++0x will support rvalue reference allowing for the compiler -// to avoid these copies. However, waiting for C++0x is not an option. -// -// Measured with valgrind on gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5), the -// tr1::bind call itself will invoke a non-trivial copy constructor three times -// for each bound parameter. Also, each when passing a tr1::function, each -// bound argument will be copied again. -// -// In addition to the copies taken at binding and invocation, copying a -// tr1::function causes a copy to be made of all the bound parameters and -// state. -// -// Furthermore, in Chromium, it is desirable for the Callback to take a -// reference on a target object when representing a class method call. This -// is not supported by tr1. -// -// Lastly, tr1::function and tr1::bind has a more general and flexible API. -// This includes things like argument reordering by use of -// tr1::bind::placeholder, support for non-const reference parameters, and some -// limited amount of subtyping of the tr1::function object (e.g., -// tr1::function<int(int)> is convertible to tr1::function<void(int)>). -// -// These are not features that are required in Chromium. Some of them, such as -// allowing for reference parameters, and subtyping of functions, may actually -// become a source of errors. Removing support for these features actually -// allows for a simpler implementation, and a terser Currying API. -// -// -// WHY NOT GOOGLE CALLBACKS? -// -// The Google callback system also does not support refcounting. Furthermore, -// its implementation has a number of strange edge cases with respect to type -// conversion of its arguments. In particular, the argument's constness must -// at times match exactly the function signature, or the type-inference might -// break. Given the above, writing a custom solution was easier. -// -// -// MISSING FUNCTIONALITY -// - Invoking the return of Bind. Bind(&foo).Run() does not work; -// - Binding arrays to functions that take a non-const pointer. -// Example: -// void Foo(const char* ptr); -// void Bar(char* ptr); -// Bind(&Foo, "test"); -// Bind(&Bar, "test"); // This fails because ptr is not const. - -namespace base { - -// First, we forward declare the Callback class template. This informs the -// compiler that the template only has 1 type parameter which is the function -// signature that the Callback is representing. -// -// After this, create template specializations for 0-$(MAX_ARITY) parameters. Note that -// even though the template typelist grows, the specialization still -// only has one type: the function signature. -// -// If you are thinking of forward declaring Callback in your own header file, -// please include "base/callback_forward.h" instead. -template <typename Sig> -class Callback; - -namespace internal { -template <typename Runnable, typename RunType, typename BoundArgsType> -struct BindState; -} // namespace internal - - -$range ARITY 0..MAX_ARITY -$for ARITY [[ -$range ARG 1..ARITY - -$if ARITY == 0 [[ -template <typename R> -class Callback<R(void)> : public internal::CallbackBase { -]] $else [[ -template <typename R, $for ARG , [[typename A$(ARG)]]> -class Callback<R($for ARG , [[A$(ARG)]])> : public internal::CallbackBase { -]] - - public: - typedef R(RunType)($for ARG , [[A$(ARG)]]); - - Callback() : CallbackBase(NULL) { } - - // Note that this constructor CANNOT be explicit, and that Bind() CANNOT - // return the exact Callback<> type. See base/bind.h for details. - template <typename Runnable, typename BindRunType, typename BoundArgsType> - Callback(internal::BindState<Runnable, BindRunType, - BoundArgsType>* bind_state) - : CallbackBase(bind_state) { - - // Force the assignment to a local variable of PolymorphicInvoke - // so the compiler will typecheck that the passed in Run() method has - // the correct type. - PolymorphicInvoke invoke_func = - &internal::BindState<Runnable, BindRunType, BoundArgsType> - ::InvokerType::Run; - polymorphic_invoke_ = reinterpret_cast<InvokeFuncStorage>(invoke_func); - } - - bool Equals(const Callback& other) const { - return CallbackBase::Equals(other); - } - - R Run($for ARG , - [[typename internal::CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) const { - PolymorphicInvoke f = - reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_); - - return f(bind_state_.get()[[]] -$if ARITY != 0 [[, ]] -$for ARG , - [[internal::CallbackForward(a$(ARG))]]); - } - - private: - typedef R(*PolymorphicInvoke)( - internal::BindStateBase*[[]] -$if ARITY != 0 [[, ]] -$for ARG , [[typename internal::CallbackParamTraits<A$(ARG)>::ForwardType]]); - -}; - - -]] $$ for ARITY - -// Syntactic sugar to make Callback<void(void)> easier to declare since it -// will be used in a lot of APIs with delayed execution. -typedef Callback<void(void)> Closure; - -} // namespace base - -#endif // BASE_CALLBACK_H
diff --git a/callback_internal.h b/callback_internal.h index b85973d..9dca023 100644 --- a/callback_internal.h +++ b/callback_internal.h
@@ -81,6 +81,28 @@ !is_const<T>::value; }; +// Returns |Then| as SelectType::Type if |condition| is true. Otherwise returns +// |Else|. +template <bool condition, typename Then, typename Else> +struct SelectType { + typedef Then Type; +}; + +template <typename Then, typename Else> +struct SelectType<false, Then, Else> { + typedef Else Type; +}; + +template <typename> +struct CallbackParamTraitsForMoveOnlyType; + +template <typename> +struct CallbackParamTraitsForNonMoveOnlyType; + +// TODO(tzik): Use a default parameter once MSVS supports variadic templates +// with default values. +// http://connect.microsoft.com/VisualStudio/feedbackdetail/view/957801/compilation-error-with-variadic-templates +// // This is a typetraits object that's used to take an argument type, and // extract a suitable type for storing and forwarding arguments. // @@ -92,8 +114,15 @@ // parameters by const reference. In this case, we end up passing an actual // array type in the initializer list which C++ does not allow. This will // break passing of C-string literals. -template <typename T, bool is_move_only = IsMoveOnlyType<T>::value> -struct CallbackParamTraits { +template <typename T> +struct CallbackParamTraits + : SelectType<IsMoveOnlyType<T>::value, + CallbackParamTraitsForMoveOnlyType<T>, + CallbackParamTraitsForNonMoveOnlyType<T> >::Type { +}; + +template <typename T> +struct CallbackParamTraitsForNonMoveOnlyType { typedef const T& ForwardType; typedef T StorageType; }; @@ -104,7 +133,7 @@ // // The ForwardType should only be used for unbound arguments. template <typename T> -struct CallbackParamTraits<T&, false> { +struct CallbackParamTraitsForNonMoveOnlyType<T&> { typedef T& ForwardType; typedef T StorageType; }; @@ -115,14 +144,14 @@ // T[n]" does not seem to match correctly, so we are stuck with this // restriction. template <typename T, size_t n> -struct CallbackParamTraits<T[n], false> { +struct CallbackParamTraitsForNonMoveOnlyType<T[n]> { typedef const T* ForwardType; typedef const T* StorageType; }; // See comment for CallbackParamTraits<T[n]>. template <typename T> -struct CallbackParamTraits<T[], false> { +struct CallbackParamTraitsForNonMoveOnlyType<T[]> { typedef const T* ForwardType; typedef const T* StorageType; }; @@ -141,7 +170,7 @@ // reference cannot be used with temporaries which means the result of a // function or a cast would not be usable with Callback<> or Bind(). template <typename T> -struct CallbackParamTraits<T, true> { +struct CallbackParamTraitsForMoveOnlyType { typedef T ForwardType; typedef T StorageType; };
diff --git a/callback_list.h b/callback_list.h index 5b911fd..aeed5f1 100644 --- a/callback_list.h +++ b/callback_list.h
@@ -1,8 +1,3 @@ -// This file was GENERATED by command: -// pump.py callback_list.h.pump -// DO NOT EDIT BY HAND!!! - - // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -208,192 +203,21 @@ template <typename Sig> class CallbackList; -template <> -class CallbackList<void(void)> - : public internal::CallbackListBase<Callback<void(void)> > { +template <typename... Args> +class CallbackList<void(Args...)> + : public internal::CallbackListBase<Callback<void(Args...)> > { public: - typedef Callback<void(void)> CallbackType; + typedef Callback<void(Args...)> CallbackType; CallbackList() {} - void Notify() { - internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1> -class CallbackList<void(A1)> - : public internal::CallbackListBase<Callback<void(A1)> > { - public: - typedef Callback<void(A1)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1) { + void Notify( + typename internal::CallbackParamTraits<Args>::ForwardType... args) { typename internal::CallbackListBase<CallbackType>::Iterator it = this->GetIterator(); CallbackType* cb; while ((cb = it.GetNext()) != NULL) { - cb->Run(a1); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1, typename A2> -class CallbackList<void(A1, A2)> - : public internal::CallbackListBase<Callback<void(A1, A2)> > { - public: - typedef Callback<void(A1, A2)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2) { - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(a1, a2); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1, typename A2, typename A3> -class CallbackList<void(A1, A2, A3)> - : public internal::CallbackListBase<Callback<void(A1, A2, A3)> > { - public: - typedef Callback<void(A1, A2, A3)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3) { - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(a1, a2, a3); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1, typename A2, typename A3, typename A4> -class CallbackList<void(A1, A2, A3, A4)> - : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4)> > { - public: - typedef Callback<void(A1, A2, A3, A4)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4) { - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(a1, a2, a3, a4); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1, typename A2, typename A3, typename A4, typename A5> -class CallbackList<void(A1, A2, A3, A4, A5)> - : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5)> > { - public: - typedef Callback<void(A1, A2, A3, A4, A5)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4, - typename internal::CallbackParamTraits<A5>::ForwardType a5) { - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(a1, a2, a3, a4, a5); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1, typename A2, typename A3, typename A4, typename A5, - typename A6> -class CallbackList<void(A1, A2, A3, A4, A5, A6)> - : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5, - A6)> > { - public: - typedef Callback<void(A1, A2, A3, A4, A5, A6)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4, - typename internal::CallbackParamTraits<A5>::ForwardType a5, - typename internal::CallbackParamTraits<A6>::ForwardType a6) { - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(a1, a2, a3, a4, a5, a6); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - -template <typename A1, typename A2, typename A3, typename A4, typename A5, - typename A6, typename A7> -class CallbackList<void(A1, A2, A3, A4, A5, A6, A7)> - : public internal::CallbackListBase<Callback<void(A1, A2, A3, A4, A5, A6, - A7)> > { - public: - typedef Callback<void(A1, A2, A3, A4, A5, A6, A7)> CallbackType; - - CallbackList() {} - - void Notify(typename internal::CallbackParamTraits<A1>::ForwardType a1, - typename internal::CallbackParamTraits<A2>::ForwardType a2, - typename internal::CallbackParamTraits<A3>::ForwardType a3, - typename internal::CallbackParamTraits<A4>::ForwardType a4, - typename internal::CallbackParamTraits<A5>::ForwardType a5, - typename internal::CallbackParamTraits<A6>::ForwardType a6, - typename internal::CallbackParamTraits<A7>::ForwardType a7) { - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run(a1, a2, a3, a4, a5, a6, a7); + cb->Run(args...); } }
diff --git a/callback_list.h.pump b/callback_list.h.pump deleted file mode 100644 index d7f8473..0000000 --- a/callback_list.h.pump +++ /dev/null
@@ -1,269 +0,0 @@ -$$ This is a pump file for generating file templates. Pump is a python -$$ script that is part of the Google Test suite of utilities. Description -$$ can be found here: -$$ -$$ http://code.google.com/p/googletest/wiki/PumpManual -$$ - -$$ See comment for MAX_ARITY in base/bind.h.pump. -$var MAX_ARITY = 7 - -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef BASE_CALLBACK_LIST_H_ -#define BASE_CALLBACK_LIST_H_ - -#include <list> - -#include "base/basictypes.h" -#include "base/callback.h" -#include "base/callback_internal.h" -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" - -// OVERVIEW: -// -// A container for a list of callbacks. Unlike a normal STL vector or list, -// this container can be modified during iteration without invalidating the -// iterator. It safely handles the case of a callback removing itself -// or another callback from the list while callbacks are being run. -// -// TYPICAL USAGE: -// -// class MyWidget { -// public: -// ... -// -// typedef base::Callback<void(const Foo&)> OnFooCallback; -// -// scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription> -// RegisterCallback(const OnFooCallback& cb) { -// return callback_list_.Add(cb); -// } -// -// private: -// void NotifyFoo(const Foo& foo) { -// callback_list_.Notify(foo); -// } -// -// base::CallbackList<void(const Foo&)> callback_list_; -// -// DISALLOW_COPY_AND_ASSIGN(MyWidget); -// }; -// -// -// class MyWidgetListener { -// public: -// MyWidgetListener::MyWidgetListener() { -// foo_subscription_ = MyWidget::GetCurrent()->RegisterCallback( -// base::Bind(&MyWidgetListener::OnFoo, this))); -// } -// -// MyWidgetListener::~MyWidgetListener() { -// // Subscription gets deleted automatically and will deregister -// // the callback in the process. -// } -// -// private: -// void OnFoo(const Foo& foo) { -// // Do something. -// } -// -// scoped_ptr<base::CallbackList<void(const Foo&)>::Subscription> -// foo_subscription_; -// -// DISALLOW_COPY_AND_ASSIGN(MyWidgetListener); -// }; - -namespace base { - -namespace internal { - -template <typename CallbackType> -class CallbackListBase { - public: - class Subscription { - public: - Subscription(CallbackListBase<CallbackType>* list, - typename std::list<CallbackType>::iterator iter) - : list_(list), - iter_(iter) { - } - - ~Subscription() { - if (list_->active_iterator_count_) { - iter_->Reset(); - } else { - list_->callbacks_.erase(iter_); - if (!list_->removal_callback_.is_null()) - list_->removal_callback_.Run(); - } - } - - private: - CallbackListBase<CallbackType>* list_; - typename std::list<CallbackType>::iterator iter_; - - DISALLOW_COPY_AND_ASSIGN(Subscription); - }; - - // Add a callback to the list. The callback will remain registered until the - // returned Subscription is destroyed, which must occur before the - // CallbackList is destroyed. - scoped_ptr<Subscription> Add(const CallbackType& cb) WARN_UNUSED_RESULT { - DCHECK(!cb.is_null()); - return scoped_ptr<Subscription>( - new Subscription(this, callbacks_.insert(callbacks_.end(), cb))); - } - - // Sets a callback which will be run when a subscription list is changed. - void set_removal_callback(const Closure& callback) { - removal_callback_ = callback; - } - - // Returns true if there are no subscriptions. This is only valid to call when - // not looping through the list. - bool empty() { - DCHECK_EQ(0, active_iterator_count_); - return callbacks_.empty(); - } - - protected: - // An iterator class that can be used to access the list of callbacks. - class Iterator { - public: - explicit Iterator(CallbackListBase<CallbackType>* list) - : list_(list), - list_iter_(list_->callbacks_.begin()) { - ++list_->active_iterator_count_; - } - - Iterator(const Iterator& iter) - : list_(iter.list_), - list_iter_(iter.list_iter_) { - ++list_->active_iterator_count_; - } - - ~Iterator() { - if (list_ && --list_->active_iterator_count_ == 0) { - list_->Compact(); - } - } - - CallbackType* GetNext() { - while ((list_iter_ != list_->callbacks_.end()) && list_iter_->is_null()) - ++list_iter_; - - CallbackType* cb = NULL; - if (list_iter_ != list_->callbacks_.end()) { - cb = &(*list_iter_); - ++list_iter_; - } - return cb; - } - - private: - CallbackListBase<CallbackType>* list_; - typename std::list<CallbackType>::iterator list_iter_; - }; - - CallbackListBase() : active_iterator_count_(0) {} - - ~CallbackListBase() { - DCHECK_EQ(0, active_iterator_count_); - DCHECK_EQ(0U, callbacks_.size()); - } - - // Returns an instance of a CallbackListBase::Iterator which can be used - // to run callbacks. - Iterator GetIterator() { - return Iterator(this); - } - - // Compact the list: remove any entries which were NULLed out during - // iteration. - void Compact() { - typename std::list<CallbackType>::iterator it = callbacks_.begin(); - bool updated = false; - while (it != callbacks_.end()) { - if ((*it).is_null()) { - updated = true; - it = callbacks_.erase(it); - } else { - ++it; - } - - if (updated && !removal_callback_.is_null()) - removal_callback_.Run(); - } - } - - private: - std::list<CallbackType> callbacks_; - int active_iterator_count_; - Closure removal_callback_; - - DISALLOW_COPY_AND_ASSIGN(CallbackListBase); -}; - -} // namespace internal - -template <typename Sig> class CallbackList; - - -$range ARITY 0..MAX_ARITY -$for ARITY [[ -$range ARG 1..ARITY - -$if ARITY == 0 [[ -template <> -class CallbackList<void(void)> - : public internal::CallbackListBase<Callback<void(void)> > { -]] $else [[ -template <$for ARG , [[typename A$(ARG)]]> -class CallbackList<void($for ARG , [[A$(ARG)]])> - : public internal::CallbackListBase<Callback<void($for ARG , [[A$(ARG)]])> > { -]] - - public: -$if ARITY == 0 [[ - - typedef Callback<void(void)> CallbackType; -]] $else [[ - - typedef Callback<void($for ARG , [[A$(ARG)]])> CallbackType; -]] - - - CallbackList() {} - - void Notify($for ARG , - [[typename internal::CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) { -$if ARITY == 0 [[ - - internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); -]] $else [[ - - typename internal::CallbackListBase<CallbackType>::Iterator it = - this->GetIterator(); -]] - - CallbackType* cb; - while ((cb = it.GetNext()) != NULL) { - cb->Run($for ARG , [[a$(ARG)]]); - } - } - - private: - DISALLOW_COPY_AND_ASSIGN(CallbackList); -}; - - -]] $$ for ARITY -} // namespace base - -#endif // BASE_CALLBACK_LIST_H_
diff --git a/debug/proc_maps_linux_unittest.cc b/debug/proc_maps_linux_unittest.cc index d5d1b83..142f891 100644 --- a/debug/proc_maps_linux_unittest.cc +++ b/debug/proc_maps_linux_unittest.cc
@@ -7,6 +7,7 @@ #include "base/path_service.h" #include "base/strings/stringprintf.h" #include "base/third_party/dynamic_annotations/dynamic_annotations.h" +#include "base/threading/platform_thread.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { @@ -197,6 +198,14 @@ bool found_exe = false; bool found_stack = false; bool found_address = false; + + // Valgrind uses its own allocated stacks instead of the kernel-provided stack + // without letting the kernel know via prctl(PR_SET_MM_START_STACK). This + // causes the kernel to use [stack:TID] format. See http://crbug.com/431702 + // for details. + std::string stack_with_tid = + StringPrintf("[stack:%d]", PlatformThread::CurrentId()); + for (size_t i = 0; i < regions.size(); ++i) { if (regions[i].path == exe_path.value()) { // It's OK to find the executable mapped multiple times as there'll be @@ -204,17 +213,23 @@ found_exe = true; } + bool is_correct_stack = false; if (regions[i].path == "[stack]") { - // Only check if |address| lies within the real stack when not running - // Valgrind, otherwise |address| will be on a stack that Valgrind creates. - if (!RunningOnValgrind()) { - EXPECT_GE(address, regions[i].start); - EXPECT_LT(address, regions[i].end); - } + is_correct_stack = true; + EXPECT_FALSE(RunningOnValgrind()); + EXPECT_GE(address, regions[i].start); + EXPECT_LT(address, regions[i].end); + } else if (regions[i].path == stack_with_tid) { + is_correct_stack = true; + EXPECT_TRUE(RunningOnValgrind()); + } + if (is_correct_stack) { + // Note that the stack is executable when it is created by Valgrind. EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::READ); EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::WRITE); - EXPECT_FALSE(regions[i].permissions & MappedMemoryRegion::EXECUTE); + EXPECT_EQ(RunningOnValgrind(), + (regions[i].permissions & MappedMemoryRegion::EXECUTE) != 0); EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::PRIVATE); EXPECT_FALSE(found_stack) << "Found duplicate stacks"; found_stack = true;
diff --git a/files/file_path.h b/files/file_path.h index ad42b95..6890866 100644 --- a/files/file_path.h +++ b/files/file_path.h
@@ -107,6 +107,7 @@ #include <vector> #include "base/base_export.h" +#include "base/compiler_specific.h" #include "base/containers/hash_tables.h" #include "base/strings/string16.h" #include "base/strings/string_piece.h" // For implicit conversions.
diff --git a/logging_unittest.cc b/logging_unittest.cc index 95a16f2..6ee4e76 100644 --- a/logging_unittest.cc +++ b/logging_unittest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "base/basictypes.h" +#include "base/compiler_specific.h" #include "base/logging.h" #include "testing/gmock/include/gmock/gmock.h"
diff --git a/mac/scoped_mach_port.cc b/mac/scoped_mach_port.cc index de94602..13307f2 100644 --- a/mac/scoped_mach_port.cc +++ b/mac/scoped_mach_port.cc
@@ -25,6 +25,14 @@ << "ScopedMachReceiveRight mach_port_mod_refs"; } +// static +void PortSetTraits::Free(mach_port_t port) { + kern_return_t kr = + mach_port_mod_refs(mach_task_self(), port, MACH_PORT_RIGHT_PORT_SET, -1); + MACH_LOG_IF(ERROR, kr != KERN_SUCCESS, kr) + << "ScopedMachPortSet mach_port_mod_refs"; +} + } // namespace internal } // namespace mac } // namespace base
diff --git a/mac/scoped_mach_port.h b/mac/scoped_mach_port.h index 36087c9..9ef90d6 100644 --- a/mac/scoped_mach_port.h +++ b/mac/scoped_mach_port.h
@@ -31,6 +31,14 @@ static void Free(mach_port_t port); }; +struct PortSetTraits { + static mach_port_t InvalidValue() { + return MACH_PORT_NULL; + } + + static void Free(mach_port_t port); +}; + } // namespace internal // A scoper for handling a Mach port that names a send right. Send rights are @@ -59,6 +67,19 @@ operator mach_port_t() const { return get(); } }; +// A scoper for handling a Mach port set. A port set can have only one +// reference. This takes ownership of that single reference on construction and +// destroys the port set on destruction. Destroying a port set does not destroy +// the receive rights that are members of the port set. +class BASE_EXPORT ScopedMachPortSet : + public ScopedGeneric<mach_port_t, internal::PortSetTraits> { + public: + explicit ScopedMachPortSet(mach_port_t port = traits_type::InvalidValue()) + : ScopedGeneric(port) {} + + operator mach_port_t() const { return get(); } +}; + } // namespace mac } // namespace base
diff --git a/macros.h b/macros.h index b6240da..15408bc 100644 --- a/macros.h +++ b/macros.h
@@ -13,8 +13,6 @@ #include <stddef.h> // For size_t. #include <string.h> // For memcpy. -#include "base/compiler_specific.h" // For ALLOW_UNUSED. - // Put this in the private: declarations for a class to be uncopyable. #define DISALLOW_COPY(TypeName) \ TypeName(const TypeName&)
diff --git a/metrics/statistics_recorder.cc b/metrics/statistics_recorder.cc index 62617c5..23c28d4 100644 --- a/metrics/statistics_recorder.cc +++ b/metrics/statistics_recorder.cc
@@ -289,9 +289,8 @@ void StatisticsRecorder::DumpHistogramsToVlog(void* instance) { DCHECK(VLOG_IS_ON(1)); - StatisticsRecorder* me = reinterpret_cast<StatisticsRecorder*>(instance); string output; - me->WriteGraph(std::string(), &output); + StatisticsRecorder::WriteGraph(std::string(), &output); VLOG(1) << output; }
diff --git a/process/process_metrics.h b/process/process_metrics.h index 3eb3604..ca23ac8 100644 --- a/process/process_metrics.h +++ b/process/process_metrics.h
@@ -234,7 +234,7 @@ #if defined(OS_POSIX) // Returns the maximum number of file descriptors that can be open by a process // at once. If the number is unavailable, a conservative best guess is returned. -size_t GetMaxFds(); +BASE_EXPORT size_t GetMaxFds(); // Sets the file descriptor soft limit to |max_descriptors| or the OS hard // limit, whichever is lower.
diff --git a/profiler/scoped_tracker.cc b/profiler/scoped_tracker.cc index 26b17c0..d15b7de 100644 --- a/profiler/scoped_tracker.cc +++ b/profiler/scoped_tracker.cc
@@ -12,13 +12,6 @@ ScopedProfile::Mode g_scoped_profile_mode = ScopedProfile::DISABLED; -// Executes |callback|, augmenting it with provided |location|. -void ExecuteAndTrackCallback(const Location& location, - const base::Closure& callback) { - ScopedProfile tracking_profile(location, ScopedProfile::ENABLED); - callback.Run(); -} - } // namespace // static @@ -26,15 +19,6 @@ g_scoped_profile_mode = ScopedProfile::ENABLED; } -// static -base::Closure ScopedTracker::TrackCallback(const Location& location, - const base::Closure& callback) { - if (g_scoped_profile_mode != ScopedProfile::ENABLED) - return callback; - - return base::Bind(ExecuteAndTrackCallback, location, callback); -} - ScopedTracker::ScopedTracker(const Location& location) : scoped_profile_(location, g_scoped_profile_mode) { }
diff --git a/profiler/scoped_tracker.h b/profiler/scoped_tracker.h index f83654e..23e2f07 100644 --- a/profiler/scoped_tracker.h +++ b/profiler/scoped_tracker.h
@@ -10,6 +10,7 @@ // found using profiler data. #include "base/base_export.h" +#include "base/bind.h" #include "base/callback_forward.h" #include "base/location.h" #include "base/profiler/scoped_profile.h" @@ -47,10 +48,24 @@ // many possible callbacks, but they come from a relatively small number of // places. We can instrument these few places and at least know which one // passes the janky callback. - static base::Closure TrackCallback(const Location& location, - const base::Closure& callback); + template <typename P1> + static base::Callback<void(P1)> TrackCallback( + const Location& location, + const base::Callback<void(P1)>& callback) { + return base::Bind(&ScopedTracker::ExecuteAndTrackCallback<P1>, location, + callback); + } private: + // Executes |callback|, augmenting it with provided |location|. + template <typename P1> + static void ExecuteAndTrackCallback(const Location& location, + const base::Callback<void(P1)>& callback, + P1 p1) { + ScopedTracker tracking_profile(location); + callback.Run(p1); + } + const ScopedProfile scoped_profile_; DISALLOW_COPY_AND_ASSIGN(ScopedTracker);
diff --git a/security_unittest.cc b/security_unittest.cc index a6d3480..d786273 100644 --- a/security_unittest.cc +++ b/security_unittest.cc
@@ -194,7 +194,9 @@ } // On windows, the compiler prevents static array sizes of more than // 0x7fffffff (error C2148). -#if !defined(OS_WIN) || !defined(ARCH_CPU_64_BITS) +#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS) + ALLOW_UNUSED_LOCAL(kDynamicArraySize); +#else { scoped_ptr<char[][kArraySize2]> array_pointer(new (nothrow) char[kDynamicArraySize][kArraySize2]);
diff --git a/test/test_shortcut_win.cc b/test/test_shortcut_win.cc index c772d87..eb074a3 100644 --- a/test/test_shortcut_win.cc +++ b/test/test_shortcut_win.cc
@@ -67,7 +67,7 @@ if (FAILED(hr)) return; - EXPECT_TRUE(SUCCEEDED(hr = i_persist_file.QueryFrom(i_shell_link))); + EXPECT_TRUE(SUCCEEDED(hr = i_persist_file.QueryFrom(i_shell_link.get()))); if (FAILED(hr)) return; @@ -112,7 +112,7 @@ if (GetVersion() >= VERSION_WIN7) { ScopedComPtr<IPropertyStore> property_store; - EXPECT_TRUE(SUCCEEDED(hr = property_store.QueryFrom(i_shell_link))); + EXPECT_TRUE(SUCCEEDED(hr = property_store.QueryFrom(i_shell_link.get()))); if (FAILED(hr)) return;
diff --git a/tracked_objects.h b/tracked_objects.h index 723fb91..eb38df6 100644 --- a/tracked_objects.h +++ b/tracked_objects.h
@@ -43,7 +43,7 @@ // computational cost is associated with obtaining start and stop times for // instances as they are created and destroyed. // -// The following describes the lifecycle of tracking an instance. +// The following describes the life cycle of tracking an instance. // // First off, when the instance is created, the FROM_HERE macro is expanded // to specify the birth place (file, line, function) where the instance was @@ -96,9 +96,9 @@ // lock such DeathData instances. (i.e., these accumulated stats in a DeathData // instance are exclusively updated by the singular owning thread). // -// With the above lifecycle description complete, the major remaining detail is -// explaining how each thread maintains a list of DeathData instances, and of -// Births instances, and is able to avoid additional (redundant/unnecessary) +// With the above life cycle description complete, the major remaining detail +// is explaining how each thread maintains a list of DeathData instances, and +// of Births instances, and is able to avoid additional (redundant/unnecessary) // allocations. // // Each thread maintains a list of data items specific to that thread in a @@ -119,7 +119,7 @@ // which ensures that any prior acquisition of the list is valid (i.e., the // holder can iterate over it without fear of it changing, or the necessity of // using an additional lock. Iterations are actually pretty rare (used -// primarilly for cleanup, or snapshotting data for display), so this lock has +// primarily for cleanup, or snapshotting data for display), so this lock has // very little global performance impact. // // The above description tries to define the high performance (run time) @@ -156,7 +156,7 @@ // example, match with the number of durations we accumulated). The advantage // to having fast (non-atomic) updates of the data outweighs the minimal risk of // a singular corrupt statistic snapshot (only the snapshot could be corrupt, -// not the underlying and ongoing statistic). In constrast, pointer data that +// not the underlying and ongoing statistic). In contrast, pointer data that // is accessed during snapshotting is completely invariant, and hence is // perfectly acquired (i.e., no potential corruption, and no risk of a bad // memory reference). @@ -167,9 +167,9 @@ // them will continue to be asynchronous). We had an implementation of this in // the past, but the difficulty is dealing with message loops being terminated. // We can *try* to spam the available threads via some message loop proxy to -// achieve this feat, and it *might* be valuable when we are colecting data for -// upload via UMA (where correctness of data may be more significant than for a -// single screen of about:profiler). +// achieve this feat, and it *might* be valuable when we are collecting data +// for upload via UMA (where correctness of data may be more significant than +// for a single screen of about:profiler). // // TODO(jar): We should support (optionally) the recording of parent-child // relationships for tasks. This should be done by detecting what tasks are @@ -181,7 +181,7 @@ // TODO(jar): We need to store DataCollections, and provide facilities for // taking the difference between two gathered DataCollections. For now, we're // just adding a hack that Reset()s to zero all counts and stats. This is also -// done in a slighly thread-unsafe fashion, as the resetting is done +// done in a slightly thread-unsafe fashion, as the resetting is done // asynchronously relative to ongoing updates (but all data is 32 bit in size). // For basic profiling, this will work "most of the time," and should be // sufficient... but storing away DataCollections is the "right way" to do this. @@ -361,7 +361,7 @@ enum Status { UNINITIALIZED, // PRistine, link-time state before running. DORMANT_DURING_TESTS, // Only used during testing. - DEACTIVATED, // No longer recording profling. + DEACTIVATED, // No longer recording profiling. PROFILING_ACTIVE, // Recording profiles (no parent-child links). PROFILING_CHILDREN_ACTIVE, // Fully active, recording parent-child links. STATUS_LAST = PROFILING_CHILDREN_ACTIVE @@ -551,7 +551,7 @@ // Using our lock, make a copy of the specified maps. This call may be made // on non-local threads, which necessitate the use of the lock to prevent - // the map(s) from being reallocaed while they are copied. If |reset_max| is + // the map(s) from being reallocated while they are copied. If |reset_max| is // true, then, just after we copy the DeathMap, we will set the max values to // zero in the active DeathMap (not the snapshot). void SnapshotMaps(bool reset_max, @@ -593,7 +593,7 @@ static base::ThreadLocalStorage::StaticSlot tls_index_; // List of ThreadData instances for use with worker threads. When a worker - // thread is done (terminated), we push it onto this llist. When a new worker + // thread is done (terminated), we push it onto this list. When a new worker // thread is created, we first try to re-use a ThreadData instance from the // list, and if none are available, construct a new one. // This is only accessed while list_lock_ is held. @@ -676,7 +676,7 @@ // not yet concluded with a NowForEndOfRun(). Usually this stack is one deep, // but if a scoped region is profiled, or <sigh> a task runs a nested-message // loop, then the stack can grow larger. Note that we don't try to deduct - // time in nested porfiles, as our current timer is based on wall-clock time, + // time in nested profiles, as our current timer is based on wall-clock time, // and not CPU time (and we're hopeful that nested timing won't be a // significant additional cost). ParentStack parent_stack_;
diff --git a/win/shortcut.cc b/win/shortcut.cc index eef299b..eb26cea 100644 --- a/win/shortcut.cc +++ b/win/shortcut.cc
@@ -33,7 +33,7 @@ i_persist_file->Release(); if (FAILED(i_shell_link->CreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER)) || - FAILED(i_persist_file->QueryFrom(*i_shell_link)) || + FAILED(i_persist_file->QueryFrom(i_shell_link->get())) || (shortcut && FAILED((*i_persist_file)->Load(shortcut, STGM_READWRITE)))) { i_shell_link->Release(); i_persist_file->Release(); @@ -129,15 +129,17 @@ if ((has_app_id || has_dual_mode) && GetVersion() >= VERSION_WIN7) { ScopedComPtr<IPropertyStore> property_store; - if (FAILED(property_store.QueryFrom(i_shell_link)) || !property_store.get()) + if (FAILED(property_store.QueryFrom(i_shell_link.get())) || + !property_store.get()) return false; if (has_app_id && - !SetAppIdForPropertyStore(property_store, properties.app_id.c_str())) { + !SetAppIdForPropertyStore(property_store.get(), + properties.app_id.c_str())) { return false; } if (has_dual_mode && - !SetBooleanValueForPropertyStore(property_store, + !SetBooleanValueForPropertyStore(property_store.get(), PKEY_AppUserModel_IsDualMode, properties.dual_mode)) { return false; @@ -192,7 +194,7 @@ ScopedComPtr<IPersistFile> persist; // Query IShellLink for the IPersistFile interface. - if (FAILED(persist.QueryFrom(i_shell_link))) + if (FAILED(persist.QueryFrom(i_shell_link.get()))) return false; // Load the shell link. @@ -239,7 +241,7 @@ if ((options & ShortcutProperties::PROPERTIES_WIN7) && GetVersion() >= VERSION_WIN7) { ScopedComPtr<IPropertyStore> property_store; - if (FAILED(property_store.QueryFrom(i_shell_link))) + if (FAILED(property_store.QueryFrom(i_shell_link.get()))) return false; if (options & ShortcutProperties::PROPERTIES_APP_ID) {