Unreviewed, fix -Wpessimizing-move warning
[WebKit-https.git] / Source / WebCore / svg / properties / SVGPropertyList.h
1 /*
2  * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "SVGList.h"
29
30 namespace WebCore {
31
32 template<typename PropertyType>
33 class SVGPropertyList : public SVGList<Ref<PropertyType>>, public SVGPropertyOwner {
34 public:
35     using BaseList = SVGList<Ref<PropertyType>>;
36     using BaseList::isEmpty;
37     using BaseList::size;
38     using BaseList::append;
39
40 protected:
41     using SVGPropertyOwner::SVGPropertyOwner;
42     using BaseList::m_items;
43     using BaseList::m_access;
44     using BaseList::m_owner;
45
46     SVGPropertyList(SVGPropertyOwner* owner = nullptr, SVGPropertyAccess access = SVGPropertyAccess::ReadWrite)
47         : BaseList(owner, access)
48     {
49     }
50
51     ~SVGPropertyList()
52     {
53         // Detach the items from the list before it is deleted.
54         detachItems();
55     }
56
57     void detachItems() override
58     {
59         for (auto& item : m_items)
60             item->detach();
61     }
62
63     SVGPropertyOwner* owner() const override { return m_owner; }
64
65     void commitPropertyChange(SVGProperty*) override
66     {
67         if (owner())
68             owner()->commitPropertyChange(this);
69     }
70
71     Ref<PropertyType> at(unsigned index) const override
72     {
73         ASSERT(index < size());
74         return m_items.at(index).copyRef();
75     }
76
77     Ref<PropertyType> insert(unsigned index, Ref<PropertyType>&& newItem) override
78     {
79         ASSERT(index <= size());
80
81         // Spec: if newItem is not a detached object, then set newItem to be
82         // a clone object of newItem.
83         if (newItem->isAttached())
84             newItem = newItem->clone();
85
86         // Spec: Attach newItem to the list object.
87         newItem->attach(this, m_access);
88         m_items.insert(index, WTFMove(newItem));
89         return at(index);
90     }
91
92     Ref<PropertyType> replace(unsigned index, Ref<PropertyType>&& newItem) override
93     {
94         ASSERT(index < size());
95         Ref<PropertyType>& item = m_items[index];
96
97         // Spec: Detach item.
98         item->detach();
99
100         // Spec: if newItem is not a detached object, then set newItem to be
101         // a clone object of newItem.
102         if (newItem->isAttached())
103             item = newItem->clone();
104         else
105             item = WTFMove(newItem);
106
107         // Spec: Attach newItem to the list object.
108         item->attach(this, m_access);
109         return at(index);
110     }
111
112     Ref<PropertyType> remove(unsigned index) override
113     {
114         ASSERT(index < size());
115         Ref<PropertyType> item = at(index);
116
117         // Spec: Detach item.
118         item->detach();
119         m_items.remove(index);
120         return item;
121     }
122
123     Ref<PropertyType> append(Ref<PropertyType>&& newItem) override
124     {
125         // Spec: if newItem is not a detached object, then set newItem to be
126         // a clone object of newItem.
127         if (newItem->isAttached())
128             newItem = newItem->clone();
129
130         // Spec: Attach newItem to the list object.
131         newItem->attach(this, m_access);
132         m_items.append(WTFMove(newItem));
133         return at(size() - 1);
134     }
135 };
136
137 }