Index: src/core/SkExchange.h |
diff --git a/src/core/SkExchange.h b/src/core/SkExchange.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e482ab162e1e6af9e9bca67cc6e33a5c139308e0 |
--- /dev/null |
+++ b/src/core/SkExchange.h |
@@ -0,0 +1,22 @@ |
+/* |
+ * Copyright 2016 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkExchange_DEFINED |
+#define SkExchange_DEFINED |
+ |
+namespace skstd { |
+ |
+// std::exchange is in C++14 |
+template <typename T, typename U> inline T exchange(T& obj, U&& newValue) { |
mtklein_C
2016/09/29 18:11:02
Any idea why the standard does <typename T, typena
csmartdalton
2016/09/29 19:19:22
I think it's to avoid ambiguous overloads, e.g.:
mtklein_C
2016/09/29 19:36:39
Generally we make all methods declared in headers
|
+ T oldValue(obj); |
mtklein_C
2016/09/29 18:11:02
Shouldn't we std::move obj?
csmartdalton
2016/09/29 19:19:22
Done.
|
+ obj = newValue; |
mtklein_C
2016/09/29 18:11:02
and std::forward newValue?
csmartdalton
2016/09/29 19:19:22
Done.
|
+ return oldValue; |
+} |
+ |
+} |
+ |
+#endif // SkExchange_DEFINED |