aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkAdvancedTypefaceMetrics.h
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@chromium.org>2016-03-16 10:28:35 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-03-16 10:28:35 -0700
commit5f939ab658a228dce34a3b14a545638407150b92 (patch)
tree3eff56fe1aad736cb0e8e07735c06690c5d7d0a4 /src/core/SkAdvancedTypefaceMetrics.h
parentaf1e21e7ebb155d2505da0eb974c672953dfefef (diff)
Use std::unique_ptr.
Diffstat (limited to 'src/core/SkAdvancedTypefaceMetrics.h')
-rw-r--r--src/core/SkAdvancedTypefaceMetrics.h35
1 files changed, 32 insertions, 3 deletions
diff --git a/src/core/SkAdvancedTypefaceMetrics.h b/src/core/SkAdvancedTypefaceMetrics.h
index b2c9ac3142..5a2180fade 100644
--- a/src/core/SkAdvancedTypefaceMetrics.h
+++ b/src/core/SkAdvancedTypefaceMetrics.h
@@ -16,6 +16,35 @@
#include "SkTDArray.h"
#include "SkTemplates.h"
+// Whatever std::unique_ptr Clank's using doesn't seem to work with AdvanceMetric's
+// style of forward-declaration. Probably just a bug in an old libc++ / libstdc++.
+// For now, hack around it with our own smart pointer. It'd be nice to clean up.
+template <typename T>
+class SkHackyAutoTDelete : SkNoncopyable {
+public:
+ explicit SkHackyAutoTDelete(T* ptr = nullptr) : fPtr(ptr) {}
+ ~SkHackyAutoTDelete() { delete fPtr; }
+
+ T* get() const { return fPtr; }
+ T* operator->() const { return fPtr; }
+
+ void reset(T* ptr) {
+ if (ptr != fPtr) {
+ delete fPtr;
+ fPtr = ptr;
+ }
+ }
+ void free() { this->reset(nullptr); }
+ T* detach() {
+ T* ptr = fPtr;
+ fPtr = nullptr;
+ return ptr;
+ }
+
+private:
+ T* fPtr;
+};
+
/** \class SkAdvancedTypefaceMetrics
The SkAdvancedTypefaceMetrics class is used by the PDF backend to correctly
@@ -97,7 +126,7 @@ public:
uint16_t fStartId;
uint16_t fEndId;
SkTDArray<Data> fAdvance;
- SkAutoTDelete<AdvanceMetric<Data> > fNext;
+ SkHackyAutoTDelete<AdvanceMetric<Data> > fNext;
};
struct VerticalMetric {
@@ -130,9 +159,9 @@ template <typename Data>
void resetRange(SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range,
int startId);
-template <typename Data>
+template <typename Data, template<typename> class AutoTDelete>
SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* appendRange(
- SkAutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> >* nextSlot,
+ AutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> >* nextSlot,
int startId);
template <typename Data>