Move Source/WebCore/rendering/ code to std::unique_ptr
[WebKit-https.git] / Source / WebCore / rendering / style / CounterDirectives.h
1 /*
2  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
3  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6  * Copyright (C) 2006 Graham Dennis (graham.dennis@gmail.com)
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24
25 #ifndef CounterDirectives_h
26 #define CounterDirectives_h
27
28 #include <memory>
29 #include <wtf/HashMap.h>
30 #include <wtf/MathExtras.h>
31 #include <wtf/RefPtr.h>
32 #include <wtf/text/AtomicString.h>
33 #include <wtf/text/AtomicStringHash.h>
34
35 namespace WebCore {
36
37 class CounterDirectives {
38 public:
39     CounterDirectives()
40         : m_isResetSet(false)
41         , m_isIncrementSet(false)
42         , m_resetValue(0)
43         , m_incrementValue(0)
44     {
45     }
46
47     // FIXME: The code duplication here could possibly be replaced by using two
48     // maps, or by using a container that held two generic Directive objects.
49
50     bool isReset() const { return m_isResetSet; }
51     int resetValue() const { return m_resetValue; }
52     void setResetValue(int value)
53     {
54         m_resetValue = value;
55         m_isResetSet = true;
56     }
57     void clearReset()
58     {
59         m_resetValue = 0;
60         m_isResetSet = false;
61     }
62     void inheritReset(CounterDirectives& parent)
63     {
64         m_resetValue = parent.m_resetValue;
65         m_isResetSet = parent.m_isResetSet;
66     }
67
68     bool isIncrement() const { return m_isIncrementSet; }
69     int incrementValue() const { return m_incrementValue; }
70     void addIncrementValue(int value)
71     {
72         m_incrementValue = clampToInteger((double)m_incrementValue + value);
73         m_isIncrementSet = true;
74     }
75     void clearIncrement()
76     {
77         m_incrementValue = 0;
78         m_isIncrementSet = false;
79     }
80     void inheritIncrement(CounterDirectives& parent)
81     {
82         m_incrementValue = parent.m_incrementValue;
83         m_isIncrementSet = parent.m_isIncrementSet;
84     }
85
86     bool isDefined() const { return isReset() || isIncrement(); }
87
88     int combinedValue() const
89     {
90         ASSERT(m_isResetSet || !m_resetValue);
91         ASSERT(m_isIncrementSet || !m_incrementValue);
92         // FIXME: Shouldn't allow overflow here.
93         return m_resetValue + m_incrementValue;
94     }
95
96 private:
97     bool m_isResetSet;
98     bool m_isIncrementSet;
99     int m_resetValue;
100     int m_incrementValue;
101 };
102
103 bool operator==(const CounterDirectives&, const CounterDirectives&);
104 inline bool operator!=(const CounterDirectives& a, const CounterDirectives& b) { return !(a == b); }
105
106 typedef HashMap<AtomicString, CounterDirectives> CounterDirectiveMap;
107
108 std::unique_ptr<CounterDirectiveMap> clone(const CounterDirectiveMap&);
109
110 } // namespace WebCore
111
112 #endif // CounterDirectives_h