1 /* 2 * Copyright (C) 2000 Lars Knoll (knoll (at) kde.org) 3 * (C) 2000 Antti Koivisto (koivisto (at) kde.org) 4 * (C) 2000 Dirk Mueller (mueller (at) kde.org) 5 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 6 * Copyright (C) 2006 Graham Dennis (graham.dennis (at) 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 "wtf/HashMap.h" 29 #include "wtf/MathExtras.h" 30 #include "wtf/RefPtr.h" 31 #include "wtf/text/AtomicString.h" 32 #include "wtf/text/AtomicStringHash.h" 33 34 namespace blink { 35 36 class CounterDirectives { 37 public: 38 CounterDirectives() 39 : m_isResetSet(false) 40 , m_isIncrementSet(false) 41 , m_resetValue(0) 42 , m_incrementValue(0) 43 { 44 } 45 46 // FIXME: The code duplication here could possibly be replaced by using two 47 // maps, or by using a container that held two generic Directive objects. 48 49 bool isReset() const { return m_isResetSet; } 50 int resetValue() const { return m_resetValue; } 51 void setResetValue(int value) 52 { 53 m_resetValue = value; 54 m_isResetSet = true; 55 } 56 void clearReset() 57 { 58 m_resetValue = 0; 59 m_isResetSet = false; 60 } 61 void inheritReset(CounterDirectives& parent) 62 { 63 m_resetValue = parent.m_resetValue; 64 m_isResetSet = parent.m_isResetSet; 65 } 66 67 bool isIncrement() const { return m_isIncrementSet; } 68 int incrementValue() const { return m_incrementValue; } 69 void addIncrementValue(int value) 70 { 71 m_incrementValue = clampToInteger((double)m_incrementValue + value); 72 m_isIncrementSet = true; 73 } 74 void clearIncrement() 75 { 76 m_incrementValue = 0; 77 m_isIncrementSet = false; 78 } 79 void inheritIncrement(CounterDirectives& parent) 80 { 81 m_incrementValue = parent.m_incrementValue; 82 m_isIncrementSet = parent.m_isIncrementSet; 83 } 84 85 bool isDefined() const { return isReset() || isIncrement(); } 86 87 int combinedValue() const 88 { 89 ASSERT(m_isResetSet || !m_resetValue); 90 ASSERT(m_isIncrementSet || !m_incrementValue); 91 // FIXME: Shouldn't allow overflow here. 92 return m_resetValue + m_incrementValue; 93 } 94 95 private: 96 bool m_isResetSet; 97 bool m_isIncrementSet; 98 int m_resetValue; 99 int m_incrementValue; 100 }; 101 102 bool operator==(const CounterDirectives&, const CounterDirectives&); 103 inline bool operator!=(const CounterDirectives& a, const CounterDirectives& b) { return !(a == b); } 104 105 typedef HashMap<AtomicString, CounterDirectives> CounterDirectiveMap; 106 107 PassOwnPtr<CounterDirectiveMap> clone(const CounterDirectiveMap&); 108 109 } // namespace blink 110 111 #endif // CounterDirectives_h 112