Index: src/record/SkRecordTraits.h |
diff --git a/src/record/SkRecordTraits.h b/src/record/SkRecordTraits.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..570a717e92a0663aab4abbb04ad061e2161e69c9 |
--- /dev/null |
+++ b/src/record/SkRecordTraits.h |
@@ -0,0 +1,31 @@ |
+#include "SkRecords.h" |
+#include "SkTLogic.h" |
+ |
+// Type traits that are useful for working with SkRecords. |
+ |
+namespace SkRecords { |
+ |
+namespace { |
+ |
+// Abstracts away whether the T is optional or not. |
+template <typename T> const T* as_ptr(const SkRecords::Optional<T>& x) { return x; } |
+template <typename T> const T* as_ptr(const T& x) { return &x; } |
+ |
+} // namespace |
+ |
+// Gets the paint from any command that may have one. |
+template <typename Command> const SkPaint* GetPaint(const Command& x) { return as_ptr(x.paint); } |
+ |
+// Have a paint? You are a draw command! |
+template <typename Command> struct IsDraw { |
+ SK_CREATE_MEMBER_DETECTOR(paint); |
+ static const bool value = HasMember_paint<Command>::value; |
+}; |
+ |
+// Have a clip op? You are a clip command. |
+template <typename Command> struct IsClip { |
+ SK_CREATE_MEMBER_DETECTOR(op); |
+ static const bool value = HasMember_op<Command>::value; |
+}; |
+ |
+} // namespace SkRecords |