Use #pragma once in WebCore
[WebKit-https.git] / Source / WebCore / svg / properties / SVGAnimatedEnumerationPropertyTearOff.h
1 /*
2  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19
20 #pragma once
21
22 #include "SVGAnimatedStaticPropertyTearOff.h"
23 #include "SVGException.h"
24 #include "SVGPropertyTraits.h"
25
26 namespace WebCore {
27
28 template<typename EnumType>
29 class SVGAnimatedEnumerationPropertyTearOff final : public SVGAnimatedStaticPropertyTearOff<unsigned> {
30 public:
31     const unsigned& baseVal() final
32     {
33         const unsigned& baseVal = SVGAnimatedStaticPropertyTearOff::baseVal();
34
35         if (baseVal > SVGIDLEnumLimits<EnumType>::highestExposedEnumValue())
36             return m_outOfRangeEnumValue;
37
38         return baseVal;
39     }
40
41     const unsigned& animVal() final
42     {
43         const unsigned& animVal = SVGAnimatedStaticPropertyTearOff::animVal();
44
45         if (animVal > SVGIDLEnumLimits<EnumType>::highestExposedEnumValue())
46             return m_outOfRangeEnumValue;
47
48         return animVal;
49     }
50
51     ExceptionOr<void> setBaseVal(const unsigned& property) final
52     {
53         // All SVG enumeration values, that are allowed to be set via SVG DOM start with 1, 0 corresponds to unknown and is not settable through SVG DOM.
54         if (!property || property > SVGIDLEnumLimits<EnumType>::highestExposedEnumValue())
55             return Exception { SVGException::SVG_INVALID_VALUE_ERR };
56         return SVGAnimatedStaticPropertyTearOff<unsigned>::setBaseVal(property);
57     }
58
59     static Ref<SVGAnimatedEnumerationPropertyTearOff<EnumType>> create(SVGElement* contextElement, const QualifiedName& attributeName, AnimatedPropertyType animatedPropertyType, EnumType& property)
60     {
61         ASSERT(contextElement);
62         return adoptRef(*new SVGAnimatedEnumerationPropertyTearOff<EnumType>(contextElement, attributeName, animatedPropertyType, reinterpret_cast<unsigned&>(property)));
63     }
64
65     EnumType& currentAnimatedValue()
66     {
67         unsigned& animatedValue = SVGAnimatedStaticPropertyTearOff<unsigned>::currentAnimatedValue();
68         ASSERT(animatedValue <= SVGPropertyTraits<EnumType>::highestEnumValue());
69         return reinterpret_cast<EnumType&>(animatedValue);
70     }
71
72 private:
73     SVGAnimatedEnumerationPropertyTearOff(SVGElement* contextElement, const QualifiedName& attributeName, AnimatedPropertyType animatedPropertyType, unsigned& property)
74         : SVGAnimatedStaticPropertyTearOff<unsigned>(contextElement, attributeName, animatedPropertyType, property)
75     {
76     }
77
78     static unsigned m_outOfRangeEnumValue;
79 };
80
81 // By convention, all enum values that represent UNKNOWN in SVG are equal to zero.
82 template<typename EnumType>
83 unsigned SVGAnimatedEnumerationPropertyTearOff<EnumType>::m_outOfRangeEnumValue = 0;
84
85 } // namespace WebCore