Index: third_party/inspector_protocol/lib/Maybe_h.template |
diff --git a/third_party/inspector_protocol/lib/Maybe_h.template b/third_party/inspector_protocol/lib/Maybe_h.template |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2096572ba7ba60a803638aa8aceb2a0e72d88fc6 |
--- /dev/null |
+++ b/third_party/inspector_protocol/lib/Maybe_h.template |
@@ -0,0 +1,80 @@ |
+// 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 {{"_".join(config.protocol.namespace)}}_Maybe_h |
+#define {{"_".join(config.protocol.namespace)}}_Maybe_h |
+ |
+//#include "Forward.h" |
+ |
+{% for namespace in config.protocol.namespace %} |
+namespace {{namespace}} { |
+{% endfor %} |
+ |
+template<typename T> |
+class Maybe { |
+public: |
+ Maybe() : m_value() { } |
+ Maybe(std::unique_ptr<T> value) : m_value(std::move(value)) { } |
+ void operator=(std::unique_ptr<T> value) { m_value = std::move(value); } |
+ T* fromJust() const { DCHECK(m_value); return m_value.get(); } |
+ T* fromMaybe(T* defaultValue) const { return m_value ? m_value.get() : defaultValue; } |
+ bool isJust() const { return !!m_value; } |
+ std::unique_ptr<T> takeJust() { DCHECK(m_value); return m_value.release(); } |
+private: |
+ std::unique_ptr<T> m_value; |
+}; |
+ |
+template<typename T> |
+class MaybeBase { |
+public: |
+ MaybeBase() : m_isJust(false) { } |
+ MaybeBase(T value) : m_isJust(true), m_value(value) { } |
+ void operator=(T value) { m_value = value; m_isJust = true; } |
+ T fromJust() const { DCHECK(m_isJust); return m_value; } |
+ T fromMaybe(const T& defaultValue) const { return m_isJust ? m_value : defaultValue; } |
+ bool isJust() const { return m_isJust; } |
+ T takeJust() { DCHECK(m_isJust); return m_value; } |
+ |
+protected: |
+ bool m_isJust; |
+ T m_value; |
+}; |
+ |
+template<> |
+class Maybe<bool> : public MaybeBase<bool> { |
+public: |
+ Maybe() { } |
+ Maybe(bool value) : MaybeBase(value) { } |
+ using MaybeBase::operator=; |
+}; |
+ |
+template<> |
+class Maybe<int> : public MaybeBase<int> { |
+public: |
+ Maybe() { } |
+ Maybe(int value) : MaybeBase(value) { } |
+ using MaybeBase::operator=; |
+}; |
+ |
+template<> |
+class Maybe<double> : public MaybeBase<double> { |
+public: |
+ Maybe() { } |
+ Maybe(double value) : MaybeBase(value) { } |
+ using MaybeBase::operator=; |
+}; |
+ |
+template<> |
+class Maybe<String> : public MaybeBase<String> { |
+public: |
+ Maybe() { } |
+ Maybe(const String& value) : MaybeBase(value) { } |
+ using MaybeBase::operator=; |
+}; |
+ |
+{% for namespace in config.protocol.namespace %} |
+} // namespace {{namespace}} |
+{% endfor %} |
+ |
+#endif // !defined({{"_".join(config.protocol.namespace)}}_Maybe_h) |