Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
IdleManager.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Frameworks_Led_IdleManager_h_
5#define _Stroika_Frameworks_Led_IdleManager_h_ 1
6
7#include "Stroika/Frameworks/StroikaPreComp.h"
8
9/*
10@MODULE: IdleManager
11@DESCRIPTION: <p>Note that this implementation is for SYNCRONOUS, and not THREADED idle time
12 processing.
13 </p>
14
15 */
16
17#include <map>
18#include <vector>
19
20#include "Stroika/Frameworks/Led/Support.h"
21
22namespace Stroika::Frameworks::Led {
23
24 /*
25 @CLASS: Idler
26 @DESCRIPTION: <p>Simple mixin interface you inherit from if you're object would like to be
27 ticked (notified periodically) at idle time.
28 </p>
29 */
30 class Idler {
31 protected:
32 Idler () = default;
33
34 public:
35 virtual void SpendIdleTime ();
36 };
37
38 /*
39 @CLASS: EnterIdler
40 @DESCRIPTION: <p></p>
41 */
42 class EnterIdler {
43 protected:
44 EnterIdler () = default;
45
46 public:
47 virtual void OnEnterIdle ();
48 };
49
50 /*
51 @CLASS: IdleManager
52 @DESCRIPTION: <p>
53 </p>
54 */
55 class IdleManager {
56 private:
57 IdleManager ();
58
59 public:
60 static IdleManager& Get ();
61
62 public:
63 virtual void AddIdler (Idler* idler);
64 virtual void RemoveIdler (Idler* idler);
65
66 public:
67 virtual void AddEnterIdler (EnterIdler* enterIdler);
68 virtual void RemoveEnterIdler (EnterIdler* enterIdler);
69
70 public:
71 nonvirtual bool GetInIdleMode () const;
72 nonvirtual void SetInIdleMode (bool inIdleMode);
73
74 private:
75 bool fInIdleMode_{false};
76
77 public:
78 static inline Foundation::Time::DurationSeconds kNeverCallIdler{100s}; // @todo crazy never value - switch to using optional<>
79 virtual Foundation::Time::DurationSeconds GetIdlerFrequncy (Idler* idler);
80 virtual void SetIdlerFrequncy (Idler* idler, Foundation::Time::DurationSeconds idlerFrequency);
81
82 public:
83 class NonIdleContext;
84
85 protected:
86 unsigned int fNonIdleContextCount;
87
88 private:
89 friend class NonIdleContext;
90
91 public:
92 class IdleManagerOSImpl;
93
94 public:
95 static void SetIdleManagerOSImpl (IdleManagerOSImpl* impl);
96
97 private:
98 IdleManagerOSImpl* fIdleManagerOSImpl;
99
100 private:
101 friend class IdleManagerOSImpl;
102
103 private:
104 nonvirtual void UpdateIdleMgrImplState ();
105
106 protected:
107 virtual void CallSpendTime ();
108 virtual void CallEnterIdle ();
109
110 private:
111 struct IdlerInfo {
112 IdlerInfo () = default;
113 Foundation::Time::DurationSeconds fIdlerFrequency{IdleManager::kNeverCallIdler};
114 Foundation::Time::TimePointSeconds fLastCalledAt{};
115 };
116 map<Idler*, IdlerInfo> fIdlers;
117 bool fNeedMgrIdleCalls;
118
119 private:
120 vector<EnterIdler*> fEnterIdlers;
121 };
122
123 /*
124 @CLASS: IdleManager::NonIdleContext
125 @DESCRIPTION: <p></p>
126 */
127 class IdleManager::NonIdleContext {
128 public:
129 NonIdleContext ();
130 ~NonIdleContext ();
131 };
132
133 /*
134 @CLASS: IdleManager::IdleManagerOSImpl
135 @ACCESS: public
136 @DESCRIPTION: <p>
137 </p>
138 */
139 class IdleManager::IdleManagerOSImpl {
140 protected:
141 IdleManagerOSImpl () = default;
142
143 public:
144 virtual void StartSpendTimeCalls () = 0;
145 virtual void TerminateSpendTimeCalls () = 0;
146 virtual Foundation::Time::DurationSeconds GetSuggestedFrequency () const = 0;
147 virtual void SetSuggestedFrequency (Foundation::Time::DurationSeconds suggestedFrequency) = 0;
148
149 protected:
150 virtual void CallSpendTime ();
151 };
152
153}
154
155/*
156 ********************************************************************************
157 ***************************** Implementation Details ***************************
158 ********************************************************************************
159 */
160#include "IdleManager.inl"
161
162#endif /*_Stroika_Frameworks_Led_IdleManager_h_*/