Network System 0.1.1
High-performance modular networking library for scalable client-server applications
Loading...
Searching...
No Matches
connection_state.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2024, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
5#pragma once
6
7#include <atomic>
8#include <cstdint>
9
11{
12
17 enum class connection_status : uint8_t
18 {
19 disconnected = 0,
20 connecting = 1,
21 connected = 2,
22 disconnecting = 3
23 };
24
73 {
74 public:
78 connection_state() = default;
79
83 ~connection_state() = default;
84
85 // Non-copyable
88
89 // Movable
91 : status_(other.status_.load(std::memory_order_acquire))
92 {
93 other.status_.store(connection_status::disconnected,
94 std::memory_order_release);
95 }
96
98 {
99 if (this != &other)
100 {
101 status_.store(other.status_.load(std::memory_order_acquire),
102 std::memory_order_release);
103 other.status_.store(connection_status::disconnected,
104 std::memory_order_release);
105 }
106 return *this;
107 }
108
113 [[nodiscard]] auto status() const -> connection_status
114 {
115 return status_.load(std::memory_order_acquire);
116 }
117
122 [[nodiscard]] auto is_connected() const -> bool
123 {
124 return status_.load(std::memory_order_acquire) == connection_status::connected;
125 }
126
131 [[nodiscard]] auto is_disconnected() const -> bool
132 {
133 return status_.load(std::memory_order_acquire) == connection_status::disconnected;
134 }
135
140 [[nodiscard]] auto is_connecting() const -> bool
141 {
142 return status_.load(std::memory_order_acquire) == connection_status::connecting;
143 }
144
149 [[nodiscard]] auto is_disconnecting() const -> bool
150 {
151 return status_.load(std::memory_order_acquire) == connection_status::disconnecting;
152 }
153
158 [[nodiscard]] auto set_connecting() -> bool
159 {
160 auto expected = connection_status::disconnected;
161 return status_.compare_exchange_strong(
162 expected, connection_status::connecting, std::memory_order_acq_rel);
163 }
164
170 auto set_connected() -> void
171 {
172 status_.store(connection_status::connected, std::memory_order_release);
173 }
174
179 [[nodiscard]] auto set_disconnecting() -> bool
180 {
181 auto expected = connection_status::connected;
182 return status_.compare_exchange_strong(
183 expected, connection_status::disconnecting, std::memory_order_acq_rel);
184 }
185
191 auto set_disconnected() -> void
192 {
193 status_.store(connection_status::disconnected, std::memory_order_release);
194 }
195
201 auto reset() -> void { set_disconnected(); }
202
203 private:
204 std::atomic<connection_status> status_{connection_status::disconnected};
205 };
206
207} // namespace kcenon::network::utils
Thread-safe connection state management.
auto status() const -> connection_status
Gets the current connection status.
std::atomic< connection_status > status_
auto is_disconnected() const -> bool
Checks if currently disconnected.
auto reset() -> void
Resets to disconnected state.
auto set_connecting() -> bool
Attempts to transition from disconnected to connecting.
connection_state()=default
Default constructor. Initializes to disconnected state.
connection_state & operator=(const connection_state &)=delete
auto is_connecting() const -> bool
Checks if connection is in progress.
auto set_connected() -> void
Transitions to connected state.
auto set_disconnected() -> void
Transitions to disconnected state.
auto set_disconnecting() -> bool
Attempts to transition from connected to disconnecting.
auto is_connected() const -> bool
Checks if currently connected.
auto is_disconnecting() const -> bool
Checks if disconnection is in progress.
connection_state(const connection_state &)=delete
connection_state & operator=(connection_state &&other) noexcept
connection_state(connection_state &&other) noexcept
Utility components for network_system.
connection_status
Represents the connection state of a network component.
@ disconnecting
Disconnection in progress.