Pull SkSpan into its own header file

Change-Id: I32d800c91794093973cb8128fd1b83b4aff91845
Reviewed-on: https://skia-review.googlesource.com/148672
Commit-Queue: Herb Derby <herb@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/gn/core.gni b/gn/core.gni
index cfb4622..69e4353 100644
--- a/gn/core.gni
+++ b/gn/core.gni
@@ -286,6 +286,7 @@
   "$_src/core/SkSharedMutex.cpp",
   "$_src/core/SkSharedMutex.h",
   "$_src/core/SkSinglyLinkedList.h",
+  "$_src/core/SkSpan.h",
   "$_src/core/SkSpecialImage.cpp",
   "$_src/core/SkSpecialImage.h",
   "$_src/core/SkSpecialSurface.cpp",
diff --git a/src/core/SkGlyphRun.h b/src/core/SkGlyphRun.h
index 52c5d52..ff0026c 100644
--- a/src/core/SkGlyphRun.h
+++ b/src/core/SkGlyphRun.h
@@ -17,6 +17,7 @@
 #include "SkMask.h"
 #include "SkPath.h"
 #include "SkPoint.h"
+#include "SkSpan.h"
 #include "SkSurfaceProps.h"
 #include "SkTemplates.h"
 #include "SkTextBlobPriv.h"
@@ -29,31 +30,6 @@
 class SkGlyphRunList;
 class SkRasterClip;
 
-template <typename T>
-class SkSpan {
-public:
-    SkSpan() : fPtr{nullptr}, fSize{0} {}
-    SkSpan(T* ptr, size_t size) : fPtr{ptr}, fSize{size} { }
-    template <typename U>
-    explicit SkSpan(std::vector<U>& v) : fPtr{v.data()}, fSize{v.size()} {}
-    SkSpan(const SkSpan<T>& o) = default;
-    SkSpan& operator=( const SkSpan& other ) = default;
-    T& operator [] (size_t i) const { return fPtr[i]; }
-    T* begin() const { return fPtr; }
-    T* end() const { return fPtr + fSize; }
-    const T* cbegin() const { return fPtr; }
-    const T* cend() const { return fPtr + fSize; }
-    T* data() const { return fPtr; }
-    size_t size() const { return fSize; }
-    bool empty() const { return fSize == 0; }
-    size_t size_bytes() const { return fSize * sizeof(T); }
-    SkSpan<const T> toConst() const { return SkSpan<const T>{fPtr, fSize}; }
-
-private:
-    T* fPtr;
-    size_t fSize;
-};
-
 class SkGlyphRun {
 public:
     SkGlyphRun() = default;
diff --git a/src/core/SkSpan.h b/src/core/SkSpan.h
new file mode 100644
index 0000000..8c2df5e
--- /dev/null
+++ b/src/core/SkSpan.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkSpan_DEFINED
+#define SkSpan_DEFINED
+
+#include <cstddef>
+#include <vector>
+
+template <typename T>
+class SkSpan {
+public:
+    SkSpan() : fPtr{nullptr}, fSize{0} {}
+    SkSpan(T* ptr, size_t size) : fPtr{ptr}, fSize{size} { }
+    template <typename U>
+    explicit SkSpan(std::vector<U>& v) : fPtr{v.data()}, fSize{v.size()} {}
+    SkSpan(const SkSpan<T>& o) = default;
+    SkSpan& operator=( const SkSpan& other ) = default;
+    T& operator [] (size_t i) const { return fPtr[i]; }
+    T* begin() const { return fPtr; }
+    T* end() const { return fPtr + fSize; }
+    const T* cbegin() const { return fPtr; }
+    const T* cend() const { return fPtr + fSize; }
+    T* data() const { return fPtr; }
+    size_t size() const { return fSize; }
+    bool empty() const { return fSize == 0; }
+    size_t size_bytes() const { return fSize * sizeof(T); }
+    SkSpan<const T> toConst() const { return SkSpan<const T>{fPtr, fSize}; }
+
+private:
+    T* fPtr;
+    size_t fSize;
+};
+
+#endif  // SkSpan_DEFINED