Migrate from ints to unsigneds when referring to indices into strings
[WebKit-https.git] / Source / WebCore / platform / HysteresisActivity.h
1 /*
2  * Copyright (C) 2014 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef HysteresisActivity_h
27 #define HysteresisActivity_h
28
29 #include "Timer.h"
30
31 namespace WebCore {
32
33 static const double DefaultHysteresisSeconds = 5.0;
34
35 enum class HysteresisState {
36     Started,
37     Stopped
38 };
39
40 class HysteresisActivity {
41 public:
42     explicit HysteresisActivity(std::function<void(HysteresisState)> callback = [](HysteresisState) { }, double hysteresisSeconds = DefaultHysteresisSeconds)
43         : m_callback(callback)
44         , m_hysteresisSeconds(hysteresisSeconds)
45         , m_active(false)
46         , m_timer(*this, &HysteresisActivity::hysteresisTimerFired)
47     {
48     }
49
50     void start()
51     {
52         if (m_active)
53             return;
54         m_active = true;
55
56         if (m_timer.isActive())
57             m_timer.stop();
58         else
59             m_callback(HysteresisState::Started);
60     }
61
62     void stop()
63     {
64         if (!m_active)
65             return;
66         m_active = false;
67
68         m_timer.startOneShot(m_hysteresisSeconds);
69     }
70
71     void impulse()
72     {
73         if (!m_active) {
74             start();
75             stop();
76         }
77     }
78
79     HysteresisState state() const
80     {
81         return m_active || m_timer.isActive() ? HysteresisState::Started : HysteresisState::Stopped;
82     }
83     
84 private:
85     void hysteresisTimerFired()
86     {
87         m_timer.stop();
88         m_callback(HysteresisState::Stopped);
89     }
90
91     std::function<void(HysteresisState)> m_callback;
92     double m_hysteresisSeconds;
93     bool m_active;
94     Timer m_timer;
95 };
96
97 } // namespace WebCore
98
99 #endif // HysteresisActivity_h