Index: services/media/framework/ptr.h |
diff --git a/services/media/framework/ptr.h b/services/media/framework/ptr.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a37900d8a10c4b13db4a4843647da0aef635d51e |
--- /dev/null |
+++ b/services/media/framework/ptr.h |
@@ -0,0 +1,62 @@ |
+// Copyright 2016 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 SERVICES_MEDIA_FRAMEWORK_PTR_H_ |
+#define SERVICES_MEDIA_FRAMEWORK_PTR_H_ |
+ |
+#include <memory> |
+ |
+namespace mojo { |
+namespace media { |
+ |
+// unique_ptr with Clone. |
+template<class T, class Deleter = std::default_delete<T>> |
+class UniquePtr : public std::unique_ptr<T, Deleter> { |
+ public: |
+ UniquePtr() : std::unique_ptr<T, Deleter>() {} |
+ |
+ UniquePtr(std::nullptr_t) : std::unique_ptr<T, Deleter>() {} |
+ |
+ explicit UniquePtr(T* ptr) : std::unique_ptr<T, Deleter>(ptr) {} |
+ |
+ UniquePtr(UniquePtr&& other) : |
+ std::unique_ptr<T, Deleter>(std::move(other)) {} |
+ |
+ UniquePtr& operator=(std::nullptr_t) { |
+ this->reset(); |
+ return *this; |
+ } |
+ |
+ UniquePtr& operator=(UniquePtr&& other) { |
+ *static_cast<std::unique_ptr<T, Deleter>*>(this) = std::move(other); |
+ return *this; |
+ } |
+ |
+ UniquePtr Clone() const { return *this ? this->get()->Clone() : UniquePtr(); } |
johngro
2016/01/26 23:47:29
Do we really want to sub-class std::unique_ptr to
dalesat
2016/01/28 18:49:16
Yes, this is just to get rid of the null check. I'
|
+}; |
+ |
+// shared_ptr with upcast to TBase. |
johngro
2016/01/26 23:47:29
Why do this? std::shared_ptr already has 3 static
dalesat
2016/01/28 18:49:16
I wasn't aware of static_pointer_cast. This class
johngro
2016/02/01 22:38:16
Acknowledged.
|
+template<class T, typename TBase> |
+class SharedPtr : public std::shared_ptr<T> { |
+ public: |
+ SharedPtr() : std::shared_ptr<T>() {} |
+ |
+ SharedPtr(std::nullptr_t) : std::shared_ptr<T>() {} |
+ |
+ explicit SharedPtr(T* ptr) : std::shared_ptr<T>(ptr) {} |
+ |
+ SharedPtr& operator=(std::nullptr_t) { |
+ this->reset(); |
+ return *this; |
+ } |
+ |
+ operator std::shared_ptr<TBase>() const { |
+ return std::shared_ptr<TBase>(*this, this->get()); |
+ } |
+}; |
+ |
+} // namespace media |
+} // namespace mojo |
+ |
+#endif // SERVICES_MEDIA_FRAMEWORK_PTR_H_ |