Use std::unique_ptr<>|std::make_unique_ptr in RenderThemeEfl::ThemePartCacheEntry...
authorgyuyoung.kim@samsung.com <gyuyoung.kim@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Nov 2014 17:53:32 +0000 (17:53 +0000)
committergyuyoung.kim@samsung.com <gyuyoung.kim@samsung.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 11 Nov 2014 17:53:32 +0000 (17:53 +0000)
https://bugs.webkit.org/show_bug.cgi?id=138558

Reviewed by Anders Carlsson.

This patch removes PassOwnPtr and OwnPtr in RenderThemeEfl::ThemePartCacheEntry::create().
It would be good if we also remove create() factory function though, in this case, it is
a little hard to remove it since the create() factory function does many works to create
a ThemePartCacheEntry instance. Thus this patch just replaces PassOwnPtr|OwnPtr with
std::unique_ptr<> and std::make_unique<> in RenderThemeEfl::ThemePartCacheEntry::create().

Besides the theme entries have been maintained by Eina_List*. Unfortunately it doesn't support
std::unique_ptr<> yet. Thus the Eina_List* should be replaced with Vector<std::unique_ptr<>>
so that m_partCache has ownship of all EFL theme entries. This patch tries to keep original
cache algorithm based on Vector class.

No new tests, no behavior changes.

* platform/efl/RenderThemeEfl.cpp:
(WebCore::RenderThemeEfl::ThemePartCacheEntry::create):
(WebCore::RenderThemeEfl::getThemePartFromCache):
* platform/efl/RenderThemeEfl.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@175953 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/efl/RenderThemeEfl.cpp
Source/WebCore/platform/efl/RenderThemeEfl.h

index 242dd62..a9168f6 100644 (file)
@@ -1,3 +1,28 @@
+2014-11-11  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
+
+        Use std::unique_ptr<>|std::make_unique_ptr in RenderThemeEfl::ThemePartCacheEntry::create()
+        https://bugs.webkit.org/show_bug.cgi?id=138558
+
+        Reviewed by Anders Carlsson.
+
+        This patch removes PassOwnPtr and OwnPtr in RenderThemeEfl::ThemePartCacheEntry::create().
+        It would be good if we also remove create() factory function though, in this case, it is
+        a little hard to remove it since the create() factory function does many works to create
+        a ThemePartCacheEntry instance. Thus this patch just replaces PassOwnPtr|OwnPtr with
+        std::unique_ptr<> and std::make_unique<> in RenderThemeEfl::ThemePartCacheEntry::create().
+
+        Besides the theme entries have been maintained by Eina_List*. Unfortunately it doesn't support
+        std::unique_ptr<> yet. Thus the Eina_List* should be replaced with Vector<std::unique_ptr<>>
+        so that m_partCache has ownship of all EFL theme entries. This patch tries to keep original
+        cache algorithm based on Vector class.
+
+        No new tests, no behavior changes.
+
+        * platform/efl/RenderThemeEfl.cpp:
+        (WebCore::RenderThemeEfl::ThemePartCacheEntry::create):
+        (WebCore::RenderThemeEfl::getThemePartFromCache):
+        * platform/efl/RenderThemeEfl.h:
+
 2014-11-09  Darin Adler  <darin@apple.com>
 
         Minor tweaks to HTMLCollection
index 9fe67d2..3c5d227 100755 (executable)
@@ -156,7 +156,7 @@ static bool isFormElementTooLargeToDisplay(const IntSize& elementSize)
     return elementSize.width() > maxEdjeDimension || elementSize.height() > maxEdjeDimension;
 }
 
-PassOwnPtr<RenderThemeEfl::ThemePartCacheEntry> RenderThemeEfl::ThemePartCacheEntry::create(const String& themePath, FormType type, const IntSize& size)
+std::unique_ptr<RenderThemeEfl::ThemePartCacheEntry> RenderThemeEfl::ThemePartCacheEntry::create(const String& themePath, FormType type, const IntSize& size)
 {
     ASSERT(!themePath.isEmpty());
 
@@ -165,7 +165,7 @@ PassOwnPtr<RenderThemeEfl::ThemePartCacheEntry> RenderThemeEfl::ThemePartCacheEn
         return nullptr;
     }
 
-    OwnPtr<ThemePartCacheEntry> entry = adoptPtr(new ThemePartCacheEntry);
+    auto entry = std::make_unique<ThemePartCacheEntry>();
 
     entry->m_canvas = EflUniquePtr<Ecore_Evas>(ecore_evas_buffer_new(size.width(), size.height()));
     if (!entry->canvas()) {
@@ -192,7 +192,7 @@ PassOwnPtr<RenderThemeEfl::ThemePartCacheEntry> RenderThemeEfl::ThemePartCacheEn
     entry->type = type;
     entry->size = size;
 
-    return entry.release();
+    return entry;
 }
 
 void RenderThemeEfl::ThemePartCacheEntry::reuse(const String& themePath, FormType newType, const IntSize& newSize)
@@ -222,54 +222,51 @@ void RenderThemeEfl::ThemePartCacheEntry::reuse(const String& themePath, FormTyp
 
 RenderThemeEfl::ThemePartCacheEntry* RenderThemeEfl::getThemePartFromCache(FormType type, const IntSize& size)
 {
-    void* data;
-    Eina_List* node;
-    Eina_List* reusableNode = 0;
+    size_t reusableNodeIndex = 0;
 
-    // Look for the item in the cache.
-    EINA_LIST_FOREACH(m_partCache, node, data) {
-        ThemePartCacheEntry* cachedEntry = static_cast<ThemePartCacheEntry*>(data);
-        if (cachedEntry->size == size) {
-            if (cachedEntry->type == type) {
+    for (size_t i = 0; i < m_partCache.size(); ++i) {
+        ThemePartCacheEntry* candidatedEntry = m_partCache[i].get();
+        if (candidatedEntry->size == size) {
+            if (candidatedEntry->type == type) {
                 // Found the right item, move it to the head of the list
                 // and return it.
-                m_partCache = eina_list_promote_list(m_partCache, node);
-                return cachedEntry;
+                auto temp = WTF::move(m_partCache[i]);
+                m_partCache.remove(i);
+                m_partCache.insert(0, WTF::move(temp));
+                return m_partCache.first().get();
             }
-            // We reuse in priority the last item in the list that has
-            // the requested size.
-            reusableNode = node;
+            reusableNodeIndex = i;
         }
     }
 
-    if (eina_list_count(m_partCache) < RENDER_THEME_EFL_PART_CACHE_MAX) {
-        ThemePartCacheEntry* entry = ThemePartCacheEntry::create(themePath(), type, size).leakPtr();
+    if (m_partCache.size() < RENDER_THEME_EFL_PART_CACHE_MAX) {
+        auto entry = ThemePartCacheEntry::create(themePath(), type, size);
         if (entry)
-            m_partCache = eina_list_prepend(m_partCache, entry);
+            m_partCache.insert(0, WTF::move(entry));
 
-        return entry;
+        return m_partCache.first().get();
     }
 
     // The cache is full, reuse the last item we found that had the
     // requested size to avoid resizing. If there was none, reuse
     // the last item of the list.
-    if (!reusableNode)
-        reusableNode = eina_list_last(m_partCache);
+    if (!reusableNodeIndex)
+        reusableNodeIndex = m_partCache.size();
 
-    ThemePartCacheEntry* reusedEntry = static_cast<ThemePartCacheEntry*>(eina_list_data_get(reusableNode));
+    ThemePartCacheEntry* reusedEntry = m_partCache[reusableNodeIndex].get();
     ASSERT(reusedEntry);
     reusedEntry->reuse(themePath(), type, size);
-    m_partCache = eina_list_promote_list(m_partCache, reusableNode);
+    auto temp = WTF::move(m_partCache[reusableNodeIndex]);
+    m_partCache.remove(reusableNodeIndex);
+    m_partCache.insert(0, WTF::move(temp));
 
-    return reusedEntry;
+    return m_partCache.first().get();
 }
 
 void RenderThemeEfl::clearThemePartCache()
 {
-    void* data;
-    EINA_LIST_FREE(m_partCache, data)
-        delete static_cast<ThemePartCacheEntry*>(data);
-
+    for (auto& part : m_partCache)
+        part = nullptr;
 }
 
 void RenderThemeEfl::applyEdjeStateFromForm(Evas_Object* object, const ControlStates* states, bool haveBackground)
@@ -592,7 +589,6 @@ RenderThemeEfl::RenderThemeEfl(Page* page)
     , m_focusRingColor(32, 32, 224, 224)
     , m_sliderThumbColor(Color::darkGray)
     , m_supportsSelectionForegroundColor(false)
-    , m_partCache(0)
 {
 }
 
index f073d71..ffe408b 100644 (file)
@@ -223,7 +223,7 @@ private:
     void applyPartDescription(Evas_Object*, struct ThemePartDesc*);
 
     struct ThemePartCacheEntry {
-        static PassOwnPtr<RenderThemeEfl::ThemePartCacheEntry> create(const String& themePath, FormType, const IntSize&);
+        static std::unique_ptr<RenderThemeEfl::ThemePartCacheEntry> create(const String& themePath, FormType, const IntSize&);
         void reuse(const String& themePath, FormType, const IntSize&);
 
         ALWAYS_INLINE Ecore_Evas* canvas() { return m_canvas.get(); }
@@ -245,7 +245,7 @@ private:
     // List of ThemePartCacheEntry* sorted so that the most recently
     // used entries come first. We use a list for efficient moving
     // of items within the container.
-    Eina_List* m_partCache;
+    Vector<std::unique_ptr<ThemePartCacheEntry>> m_partCache;
 
     ThemePartCacheEntry* getThemePartFromCache(FormType, const IntSize&);
     void clearThemePartCache();