SkAdvancedTypefaceMetrics: abstract out linked list

+ use SkSinglyLinkedList<T>
+ move SkSinglyLinkedList.h to core
+ remove SkHackyAutoTDelete
+ getAdvanceData() -> setGlyphWidths()
+ finishRange no longer templated
+ remove unused templated functions

GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1953153004

Review-Url: https://codereview.chromium.org/1953153004
diff --git a/tests/WArrayTest.cpp b/tests/WArrayTest.cpp
index 40128fa..55f2a10 100644
--- a/tests/WArrayTest.cpp
+++ b/tests/WArrayTest.cpp
@@ -10,8 +10,6 @@
 // Include the implementation so we can make an appropriate template instance.
 #include "SkAdvancedTypefaceMetrics.h"
 
-using namespace skia_advanced_typeface_metrics_utils;
-
 // Negative values and zeros in a range plus trailing zeros.
 //                        0  1   2  3  4  5  6  7  8  9 10 11 12 13 14
 static const int16_t data1[] = {-1, 0, -3, 4, 5, 6, 7, 0, 0, 0, 8, 0, 0, 0, 0};
@@ -98,34 +96,35 @@
 static const uint32_t subset14[] = {0, 5};
 static const char* expectedSubset14 = "0[1] 5[2]";
 
-static SkString stringify_advance_data(SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>* data) {
+static SkString stringify_advance_data(const SkSinglyLinkedList<
+        SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>>& list) {
     SkString result;
     bool leadingSpace = false;
-    while (data != nullptr) {
-      if (leadingSpace) {
-        result.append(" ");
-      } else {
-        leadingSpace = true;
-      }
-      switch(data->fType) {
-        case SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>::kRun:
-          result.appendf("%d %d %d", data->fStartId, data->fEndId, data->fAdvance[0]);
-          break;
-        case SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>::kRange:
-          result.appendf("%d[", data->fStartId);
-          for (int i = 0; i < data->fAdvance.count(); ++i) {
-            if (i > 0) {
-              result.append(" ");
-            }
-            result.appendf("%d", data->fAdvance[i]);
-          }
-          result.append("]");
-          break;
-        case SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>::kDefault:
-          result.appendf("<Default=%d>", data->fAdvance[0]);
-          break;
-      }
-      data = data->fNext.get();
+    for (const SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>& data : list) {
+        if (leadingSpace) {
+            result.append(" ");
+        } else {
+            leadingSpace = true;
+        }
+        switch (data.fType) {
+            case SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>::kRun:
+                result.appendf("%d %d %d", data.fStartId, data.fEndId,
+                               data.fAdvance[0]);
+                break;
+            case SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>::kRange:
+                result.appendf("%d[", data.fStartId);
+                for (int i = 0; i < data.fAdvance.count(); ++i) {
+                    if (i > 0) {
+                        result.append(" ");
+                    }
+                    result.appendf("%d", data.fAdvance[i]);
+                }
+                result.append("]");
+                break;
+            case SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>::kDefault:
+                result.appendf("<Default=%d>", data.fAdvance[0]);
+                break;
+        }
     }
     return result;
 }
@@ -161,10 +160,11 @@
     }
 
     void runTest(skiatest::Reporter* reporter) {
-        SkAutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t> > result;
-        result.reset(getAdvanceData((void*)this, fAdvancesLen, fSubset, fSubsetLen, getAdvance));
+        SkAdvancedTypefaceMetrics metrics;
+        metrics.setGlyphWidths((void*)this, fAdvancesLen, fSubset, fSubsetLen,
+                               getAdvance);
 
-        SkString stringResult = stringify_advance_data(result);
+        SkString stringResult = stringify_advance_data(metrics.fGlyphWidths);
         if (!stringResult.equals(fExpected)) {
             ERRORF(reporter, "Expected: %s\n  Result: %s\n", fExpected, stringResult.c_str());
         }