SpiecsEngine
 
Loading...
Searching...
No Matches
DelegateBasic.h
Go to the documentation of this file.
1/**
2* @file DelegateBasic.h
3* @brief The Delegate_Basic Class Definitions.
4* @author Spices.
5*/
6
7#pragma once
8#include "Core/Core.h"
9#include "Core/Container/LinkedUnorderedMap.h"
10
11#include <functional>
12
13namespace Spices {
14
15 /**
16 * @brief Basic Class of Delegate.
17 * Instance inherited from it and use delegate feature.
18 */
19 template<typename... Args>
21 {
22 public:
23
24 /**
25 * @brief Agent Function.
26 */
27 using Agent = std::function<void(Args...)>;
28
29 public:
30
31 /**
32 * @brief Constructor Function.
33 */
35 {
36 m_Agents = std::make_shared<scl::linked_unordered_map<uint64_t, Agent>>();
37 }
38
39 /**
40 * @brief Destructor Function.
41 */
42 virtual ~Delegate_Basic() = default;
43
44 /**
45 * @brief Bind Function pointer to delegate.
46 * @param[in] func Function pointer.
47 * @return Returns true if bind successfully.
48 */
49 bool Bind(std::function<void(Args...)> func);
50
51 /**
52 * @brief UnBind Function pointer from delegate.
53 * @param[in] func Function pointer.
54 * @return Returns true if unbind successfully.
55 */
56 bool UnBind(std::function<void(Args...)> func);
57
58 /**
59 * @brief Get size of Agents.
60 * @return Returns the size of Agents.
61 */
62 size_t size() { return m_Agents->size(); }
63
64 /**
65 * @brief Determine if this Delegate is empty;
66 * @return Returns true if empty.
67 */
68 bool empty() { return m_Agents->size() == 0; }
69
70 /**
71 * @brief Execute all function pointer.
72 */
73 void Broadcast(Args&&... args);
74
75 private:
76
77 /**
78 * @brief Map of Agent Function Pointer.
79 */
80 std::shared_ptr<scl::linked_unordered_map<uint64_t, Agent>> m_Agents;
81 };
82
83 template<typename ...Args>
84 inline bool Delegate_Basic<Args...>::Bind(std::function<void(Args...)> func)
85 {
87
88 uint64_t* addr = reinterpret_cast<uint64_t*>(&func);
89 if (m_Agents->has_key(*addr))
90 {
91 SPICES_CORE_WARN("Agent Function binding repeatly.");
92 return false;
93 }
94
95 /**
96 * @brief pack task as a lambda and to map.
97 */
98 m_Agents->push_back(*addr, func);
99
100 return true;
101 }
102
103 template<typename ...Args>
104 inline bool Delegate_Basic<Args...>::UnBind(std::function<void(Args...)> func)
105 {
107
108 uint64_t* addr = reinterpret_cast<uint64_t*>(&func);
109 if (!m_Agents->has_key(*addr))
110 {
111 SPICES_CORE_WARN("Agent Function not binded yet.");
112 return false;
113 }
114
115 /**
116 * @brief Erase from map.
117 */
118 m_Agents->erase(*addr);
119
120 return true;
121 }
122
123 template<typename ...Args>
124 inline void Delegate_Basic<Args...>::Broadcast(Args&&... args)
125 {
127
128 m_Agents->for_each([&](const auto& k, const auto& v) {
129 v(std::forward<Args>(args)...);
130 return false;
131 });
132 }
133
134/**
135* @brief Use this macro to instance a Delegate Class.
136* None Parameter Specific.
137*/
138#define DELEGATE_NONE_PARAM(name)
139 class Delegate##name : public Spices::Delegate_Basic<>
140 {
141 public:
142 Delegate##name() : Spices::Delegate_Basic<>() {}
143 virtual ~Delegate##name() = default;
144 };
145
146/**
147* @brief Use this macro to instance a Delegate Class.
148* One Parameter Specific.
149*/
150#define DELEGATE_ONE_PARAM(name, p0)
151 class Delegate##name : public Spices::Delegate_Basic<##p0>
152 {
153 public:
154 Delegate##name() : Spices::Delegate_Basic<##p0>() {}
155 virtual ~Delegate##name() = default;
156 };
157
158/**
159* @brief Use this macro to instance a Delegate Class.
160* Two Parameter Specific.
161*/
162#define DELEGATE_TWO_PARAM(name, p0, p1)
163 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1>
164 {
165 public:
166 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1>() {}
167 virtual ~Delegate##name() = default;
168 };
169
170/**
171* @brief Use this macro to instance a Delegate Class.
172* Three Parameter Specific.
173*/
174#define DELEGATE_THREE_PARAM(name, p0, p1, p2)
175 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2>
176 {
177 public:
178 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2>() {}
179 virtual ~Delegate##name() = default;
180 };
181
182/**
183* @brief Use this macro to instance a Delegate Class.
184* Four Parameter Specific.
185*/
186#define DELEGATE_FOUR_PARAM(name, p0, p1, p2, p3)
187 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3>
188 {
189 public:
190 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3>() {}
191 virtual ~Delegate##name() = default;
192 };
193
194/**
195* @brief Use this macro to instance a Delegate Class.
196* Five Parameter Specific.
197*/
198#define DELEGATE_FIVE_PARAM(name, p0, p1, p2, p3, p4)
199 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4>
200 {
201 public:
202 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4>() {}
203 virtual ~Delegate##name() = default;
204 };
205
206/**
207* @brief Use this macro to instance a Delegate Class.
208* Six Parameter Specific.
209*/
210#define DELEGATE_SIX_PARAM(name, p0, p1, p2, p3, p4, p5)
211 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5>
212 {
213 public:
214 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5>() {}
215 virtual ~Delegate##name() = default;
216 };
217
218/**
219* @brief Use this macro to instance a Delegate Class.
220* Seven Parameter Specific.
221*/
222#define DELEGATE_SEVEN_PARAM(name, p0, p1, p2, p3, p4, p5, p6)
223 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5, ##p6>
224 {
225 public:
226 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5, ##p6>() {}
227 virtual ~Delegate##name() = default;
228 };
229
230/**
231* @brief Use this macro to instance a Delegate Class.
232* Eight Parameter Specific.
233*/
234#define DELEGATE_EIGHT_PARAM(name, p0, p1, p2, p3, p4, p5, p6, p7)
235 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5, ##p6, ##p7>
236 {
237 public:
238 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5, ##p6, ##p7>() {}
239 virtual ~Delegate##name() = default;
240 };
241
242/**
243* @brief Use this macro to instance a Delegate Class.
244* Nine Parameter Specific.
245*/
246#define DELEGATE_NINE_PARAM(name, p0, p1, p2, p3, p4, p5, p6, p7, p8)
247 class Delegate##name : public Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5, ##p6, ##p7, ##p8>
248 {
249 public:
250 Delegate##name() : Spices::Delegate_Basic<##p0, ##p1, ##p2, ##p3, ##p4, ##p5, ##p6, ##p7, ##p8>() {}
251 virtual ~Delegate##name() = default;
252 };
253
254}
#define DELEGATE_ONE_PARAM(name, p0)
Use this macro to instance a Delegate Class. One Parameter Specific.
#define DELEGATE_TWO_PARAM(name, p0, p1)
Use this macro to instance a Delegate Class. Two Parameter Specific.
#define SPICES_PROFILE_ZONE
size_t size()
Get size of Agents.
bool empty()
Determine if this Delegate is empty;.
std::shared_ptr< scl::linked_unordered_map< uint64_t, Agent > > m_Agents
Map of Agent Function Pointer.
bool Bind(std::function< void(Args...)> func)
Bind Function pointer to delegate.
virtual ~Delegate_Basic()=default
Destructor Function.
Delegate_Basic()
Constructor Function.
void Broadcast(Args &&... args)
Execute all function pointer.
bool UnBind(std::function< void(Args...)> func)
UnBind Function pointer from delegate.
Basic Class of Delegate. Instance inherited from it and use delegate feature.
void Listen()
Listen accept socket.
Definition Acceptor.cpp:39
std::shared_ptr< Channel > m_AcceptChannel
Acceptor Channel.
Definition Acceptor.h:92
Socket m_AcceptSocket
Acceptor Socket.
Definition Acceptor.h:87
void HandleRead() const
On Read Event Callback.
Definition Acceptor.cpp:48
Acceptor(const Acceptor &)=delete
Copy Constructor Function.
bool IsListening() const
Determine if this is in listening. @reutrn Returns true if is in listening.
Definition Acceptor.h:68
void SetConnectionCallback(const ConnectionCallback &cb)
Set ConnectionCallback.
Definition Acceptor.h:59
Acceptor(const InetAddress &listenAddress, bool reusePort)
Constructor Function.
Definition Acceptor.cpp:15
ConnectionCallback m_ConnectionCallback
ConnectionCallback.
Definition Acceptor.h:97
bool m_IsListening
Boolean of whether is in listening.
Definition Acceptor.h:102
virtual ~Acceptor()
Destructor Function.
Definition Acceptor.cpp:31
Acceptor & operator=(const Acceptor &)=delete
Copy Assignment Operation.
Wrapper of Channel and Socket, As the entrance of comm.
Definition Acceptor.h:24
Wrapper of readwrite buffer.
Definition Buffer.h:19
~Channel()=default
Destructor Function.
void Update()
Update this Channel state to Poller.
Definition Channel.cpp:48
void SetErrorCallback(EventCallback cb)
Set Error Event Callback.
Definition Channel.h:110
EventCallback m_ReadCallback
Read Event Callback.
Definition Channel.h:259
bool IsReading() const
Determine whether the event is a Read Event.
Definition Channel.h:196
EventLoop * m_Loop
This channel interested EventLoop.
Definition Channel.h:237
void SetWriteCallback(EventCallback cb)
Set Write Event Callback.
Definition Channel.h:92
Channel(const Channel &)=delete
Copy Constructor Function.
Channel(SOCKET fd, EventLoop *loop)
Constructor Function.
Definition Channel.cpp:15
EventCallback m_WriteCallback
Write Event Callback.
Definition Channel.h:264
void SetCloseCallback(EventCallback cb)
Set Close Event Callback.
Definition Channel.h:101
void SetRevents(int revt)
Set this REvents type.
Definition Channel.h:133
void DisableReading()
Disable Read event.
Definition Channel.h:147
void DisableAll()
Disable All event.
Definition Channel.h:174
Channel & operator=(const Channel &)=delete
Copy Assignment Operation.
std::optional< std::weak_ptr< void > > m_Tie
Definition Channel.h:254
int Events() const
Get this Events type.
Definition Channel.h:127
EventCallback m_ErrorCallback
Error Event Callback.
Definition Channel.h:274
void HandleEvent() const
Handle happened events on fd.
Definition Channel.cpp:23
void HandleEventsWithGuard() const
Internal handle happened events on fd.
Definition Channel.cpp:53
void Tie(const std::shared_ptr< void > &obj)
Definition Channel.cpp:38
void EnableWriting()
Enable Write event.
Definition Channel.h:156
SOCKET Fd() const
Get this SOCKET.
Definition Channel.h:121
void SetPollState(PollState state)
Set Poll State.
Definition Channel.h:208
bool IsWriting() const
Determine whether the event is a Write Event.
Definition Channel.h:190
void DisableWriting()
Disable Write event.
Definition Channel.h:165
int m_Revents
Current happened event type.
Definition Channel.h:247
void EnableReading()
Enable Read event.
Definition Channel.h:138
PollState GetPollState() const
Get Poll State.
Definition Channel.h:202
EventFlags m_Events
This SOCKET interested Events type.
Definition Channel.h:242
SOCKET m_Fd
This channel interested SOCKET.
Definition Channel.h:232
EventCallback m_CloseCallback
Close Event Callback.
Definition Channel.h:269
void Remove()
Remove this Channel state from Poller.
Definition Channel.cpp:43
PollState m_PollState
This channel PollState.
Definition Channel.h:252
bool IsNoneEvent() const
Determine whether the event is a None Event.
Definition Channel.h:184
void SetReadCallback(EventCallback cb)
Set Read Event Callback.
Definition Channel.h:83
Wrapper of SOCKET'S Event.
Definition Channel.h:27
ThreadPool of Multiple threading EventLoop.
EventLoopThreadWrapper()
Constructor Function.
Definition EventLoop.h:186
virtual ~EventLoopThreadWrapper()
Destructor Function.
static EventLoop *& GetInst(InetAddress *address=nullptr)
Get EventLoop Instance. @reutrn Returns EventLoop Instance.
EventLoop * instance
This thread EventLoop instance.
Definition EventLoop.h:204
Wrapper of Instance/Delete ThreadCache in thread.
Definition EventLoop.h:180
EventLoop & operator=(const EventLoop &)=delete
Copy Assignment Operation.
void HandleWakeUp()
Handle WakeUp notify by read one byte data.
std::vector< Functor > m_PendingFunctors
Delay functors.
Definition EventLoop.h:168
void DoPendingFunctors()
Execute all pending functors.
std::shared_ptr< Poller > m_Poller
Poller instance.
Definition EventLoop.h:148
std::atomic_bool m_IsCallingPendingFunctors
True if is execute pending functors.
Definition EventLoop.h:138
std::atomic_bool m_IsLooping
True if is in Looping.
Definition EventLoop.h:128
bool HasChannel(Channel *channel) const
Determine if channel is inside poller.
std::mutex m_Mutex
Mutex for PendingFunctors.
Definition EventLoop.h:173
EventLoop(const EventLoop &)=delete
Copy Constructor Function.
std::atomic_bool m_IsQuit
True if is quit from Looping.
Definition EventLoop.h:133
EventLoop(InetAddress *address=nullptr)
Constructor Function.
Definition EventLoop.cpp:22
void WakeUp()
WakeUp a thread, which wait on recv, by sending one byte data.
std::unique_ptr< Channel > m_WeakupChannel
Wakeup Channel.
Definition EventLoop.h:158
void Loop()
Start Event Loop.
Definition EventLoop.cpp:48
bool IsInLoopThread() const
Determine if current thread is in eventloop thread.
Definition EventLoop.h:109
void RunInLoop(Functor cb)
Push functor to pending functors.
Definition EventLoop.cpp:79
~EventLoop()
Destructor Function.
Definition EventLoop.cpp:42
Socket m_WakeupFd
Wakeup Socket.
Definition EventLoop.h:153
DWORD m_ThreadId
Thread's identify, which is running this EventLoop.
Definition EventLoop.h:143
void QueueInLoop(Functor cb)
Execute functor in EventLoop thread.
Definition EventLoop.cpp:91
void UpdateChannel(Channel *channel) const
Update channel state with poller.
void Quit()
Quit from Event Loop.
Definition EventLoop.cpp:69
ChannelList m_ActiveChannels
Channels with events.
Definition EventLoop.h:163
void RemoveChannel(Channel *channel) const
Remove channel from poller.
Wrapper of Poller and wakeup socket to acceptor(SubLoop).
Definition EventLoop.h:28
const Version GetVersion() const
Get Http Version.
Definition HttpRequest.h:89
std::string GetHeader(const std::string &name) const
Get a Header from this HttpRequest.
Http Request body.
Definition HttpRequest.h:18
HttpResponse(bool close)
Constructor Function.
void AppendToBuffer(Buffer *output)
Append this response to Buffer.
bool CloseConnection() const
Get CloseConnection.
HttpServer & operator=(const HttpServer &)=delete
Copy Assignment Operation.
HttpServer(const HttpServer &)=delete
Copy Constructor Function.
void OnRequest(const TcpConnectionPtr &connection, const HttpRequest &request)
HttpCallback m_HttpCallback
Definition HttpServer.h:75
virtual ~HttpServer()=default
Destructor Function.
void OnConnection(const TcpConnectionPtr &connection)
HttpServer(const InetAddress &listenAddress, int idleSeconds, TcpServer::Option option=TcpServer::Option::NoReusePort)
Constructor Function.
void Start(int threadSize) const
Start ThreadPool and call listen on acceptor.
WeakConnectionList m_ConnectionList
Definition HttpServer.h:78
void OnMessage(const TcpConnectionPtr &connection, Buffer *buf)
This class is Wrapper of current socket address.
Definition InetAddress.h:22
Inherit from this and Implement Specific Poller.
Definition Poller.h:25
Socket(const Socket &)=delete
Copy Constructor Function.
void SetReuseAddress(bool on) const
Set socket reuse address option.
Definition Socket.cpp:188
void SetTcpNoDelay(bool on) const
Set socket Tcp no delay option.
Definition Socket.cpp:149
void Connect(InetAddress *connectAddress) const
Connect to socket.
Definition Socket.cpp:62
Socket & operator=(const Socket &)=delete
Copy Assignment Operation.
SOCKET m_SocketFd
This socket fd.
Definition Socket.h:142
void Send(const std::string &data) const
Send data to server.
Definition Socket.cpp:106
SOCKET Accept(InetAddress *peerAddress) const
Accept connection on socket.
Definition Socket.cpp:83
Socket()=default
Constructor Function.
void BindAddress(const InetAddress &localAddress) const
Bind address to socket.
Definition Socket.cpp:36
void Create()
Create Non Blocking Socket.
Definition Socket.cpp:27
virtual ~Socket()
Destructor Function.
Definition Socket.cpp:14
std::string Receive() const
Receive data from server.
Definition Socket.cpp:119
SOCKET Fd()
Get this socket fd.
Definition Socket.h:66
Socket(SOCKET socketFd)
Constructor Function.
Definition Socket.h:30
const SOCKET Fd() const
Get this socket fd.
Definition Socket.h:60
void SetKeepAlive(bool on) const
Set socket keep alive option.
Definition Socket.cpp:175
void SetReusePort(bool on) const
Set socket reuse port option.
Definition Socket.cpp:162
void ShutDownWrite() const
Disable writen in socket.
Definition Socket.cpp:136
void Listen() const
Listen on socket.
Definition Socket.cpp:49
This class is Wrapper of socket.
Definition Socket.h:18
Combine of Socket Connection data.
void SetThreadInitCallback(const ThreadInitCallback &cb)
Set Thread initialize Call back.
Definition TcpServer.h:71
void AddMessageCallback(const DelegateMessageCallback::Agent &cb)
Add Message Call back.
Definition TcpServer.h:89
void Start(int threadSize) const
Start ThreadPool and call listen on acceptor.
Definition TcpServer.cpp:46
std::shared_ptr< EventLoopThreadPool > m_ThreadPool
ThreadPool.
Definition TcpServer.h:145
void NewConnection(SOCKET socketFd, const InetAddress &peerAddress)
Handle New Connection to Acceptor.
Definition TcpServer.cpp:57
void RemoveConnectionInLoop(const TcpConnectionPtr &connection)
Remove a TcpConnection InLoop.
Definition TcpServer.cpp:97
TcpServer(const TcpServer &)=delete
Copy Constructor Function.
ConnectionMap m_Connections
All TcpConnections.
Definition TcpServer.h:175
DelegateWriteCompleteCallback m_WriteCompleteCallback
WriteCompleteCallback.
Definition TcpServer.h:160
void RemoveConnection(const TcpConnectionPtr &connection)
Remove a TcpConnection.
Definition TcpServer.cpp:92
TcpServer(const InetAddress &listenAddress, Option option=Option::NoReusePort)
Constructor Function.
Definition TcpServer.cpp:16
TcpServer & operator=(const TcpServer &)=delete
Copy Assignment Operation.
ThreadInitCallback m_ThreadInitCallback
ThreadInitCallback.
Definition TcpServer.h:165
std::unique_ptr< Acceptor > m_Acceptor
Acceptor.
Definition TcpServer.h:140
std::string m_IpPort
TcpServer Ip and Port.
Definition TcpServer.h:135
void AddConnectionCallback(const DelegateConnectionCallback::Agent &cb)
Add Connection Call back.
Definition TcpServer.h:80
virtual ~TcpServer()
Destructor Function.
Definition TcpServer.cpp:33
DelegateConnectionCallback m_ConnectionCallback
ConnectionCallback.
Definition TcpServer.h:150
int m_NextConnectedId
Next Connection id.
Definition TcpServer.h:170
DelegateMessageCallback m_MessageCallback
MessageCallback.
Definition TcpServer.h:155
void AddWriteCompleteCallback(const DelegateWriteCompleteCallback::Agent &cb)
Add WriteComplete Call back.
Definition TcpServer.h:98
Sample of a TcpServer.
Definition TcpServer.h:29
The container combines hashmap and list together. Used in the case that we want iter a hashmap in ord...