Added support for completely disabling noexcept using MIJIN_TEST_NO_NOEXCEPT (for testing).

This commit is contained in:
2024-08-29 00:01:23 +02:00
parent a43f92fb58
commit 9ba097fc2f
41 changed files with 643 additions and 564 deletions

View File

@@ -3,6 +3,7 @@
#include "./detail/net_common.hpp"
#include "../detect.hpp"
#include "../internal/common.hpp"
#include "../util/variant.hpp"
namespace mijin
@@ -10,7 +11,7 @@ namespace mijin
namespace
{
inline constexpr int LISTEN_BACKLOG = 3;
StreamError translateErrno() noexcept
StreamError translateErrno() MIJIN_NOEXCEPT
{
switch (errno)
{
@@ -30,7 +31,7 @@ int readFlags(const ReadOptions& options)
#if MIJIN_TARGET_OS == MIJIN_OS_LINUX
const int SOCKOPT_ONE = 1;
bool appendSocketFlags(int handle, int flags) noexcept
bool appendSocketFlags(int handle, int flags) MIJIN_NOEXCEPT
{
const int currentFlags = fcntl(handle, F_GETFL);
if (currentFlags < 0)
@@ -40,7 +41,7 @@ bool appendSocketFlags(int handle, int flags) noexcept
return fcntl(handle, F_SETFL, currentFlags | flags) >= 0;
}
bool removeSocketFlags(int handle, int flags) noexcept
bool removeSocketFlags(int handle, int flags) MIJIN_NOEXCEPT
{
const int currentFlags = fcntl(handle, F_GETFL);
if (currentFlags < 0)
@@ -50,32 +51,32 @@ bool removeSocketFlags(int handle, int flags) noexcept
return fcntl(handle, F_SETFL, currentFlags & ~flags) >= 0;
}
long osRecv(int socket, std::span<std::uint8_t> buffer, int flags)
long osRecv(int socket, std::span<std::uint8_t> buffer, int flags) MIJIN_NOEXCEPT
{
return static_cast<long>(recv(socket, buffer.data(), buffer.size(), flags));
}
long osSend(int socket, std::span<const std::uint8_t> buffer, int flags)
long osSend(int socket, std::span<const std::uint8_t> buffer, int flags) MIJIN_NOEXCEPT
{
return static_cast<long>(send(socket, buffer.data(), buffer.size(), flags));
}
int osCreateSocket(int domain, int type, int protocol)
int osCreateSocket(int domain, int type, int protocol) MIJIN_NOEXCEPT
{
return socket(domain, type, protocol);
}
int osCloseSocket(int socket)
int osCloseSocket(int socket) MIJIN_NOEXCEPT
{
return ::close(socket);
}
bool osIsSocketValid(int socket)
bool osIsSocketValid(int socket) MIJIN_NOEXCEPT
{
return socket >= 0;
}
bool osSetSocketNonBlocking(int socket, bool blocking)
bool osSetSocketNonBlocking(int socket, bool blocking) MIJIN_NOEXCEPT
{
if (blocking)
{
@@ -95,7 +96,7 @@ thread_local bool gWsaInited = false;
class WSAGuard
{
public:
~WSAGuard() noexcept
~WSAGuard() MIJIN_NOEXCEPT
{
if (gWsaInited)
{
@@ -104,17 +105,17 @@ public:
}
} thread_local [[maybe_unused]] gWsaGuard;
long osRecv(SOCKET socket, std::span<std::uint8_t> buffer, int flags)
long osRecv(SOCKET socket, std::span<std::uint8_t> buffer, int flags) MIJIN_NOEXCEPT
{
return recv(socket, reinterpret_cast<char*>(buffer.data()), static_cast<int>(buffer.size()), flags);
}
long osSend(SOCKET socket, std::span<const std::uint8_t> buffer, int flags)
long osSend(SOCKET socket, std::span<const std::uint8_t> buffer, int flags) MIJIN_NOEXCEPT
{
return send(socket, reinterpret_cast<const char*>(buffer.data()), static_cast<int>(buffer.size()), flags);
}
SOCKET osCreateSocket(int addressFamily, int type, int protocol)
SOCKET osCreateSocket(int addressFamily, int type, int protocol) MIJIN_NOEXCEPT
{
if (!detail::initWSA())
{
@@ -123,17 +124,17 @@ SOCKET osCreateSocket(int addressFamily, int type, int protocol)
return socket(addressFamily, type, protocol);
}
int osCloseSocket(SOCKET socket)
int osCloseSocket(SOCKET socket) MIJIN_NOEXCEPT
{
return closesocket(socket);
}
bool osIsSocketValid(SOCKET socket)
bool osIsSocketValid(SOCKET socket) MIJIN_NOEXCEPT
{
return socket != INVALID_SOCKET;
}
bool osSetSocketNonBlocking(SOCKET socket, bool blocking)
bool osSetSocketNonBlocking(SOCKET socket, bool blocking) MIJIN_NOEXCEPT
{
u_long value = blocking ? 0 : 1;
return ioctlsocket(socket, FIONBIO, &value) == NO_ERROR;
@@ -144,7 +145,7 @@ bool osSetSocketNonBlocking(SOCKET socket, bool blocking)
namespace detail
{
#if MIJIN_TARGET_OS == MIJIN_OS_WINDOWS
bool initWSA() noexcept
bool initWSA() MIJIN_NOEXCEPT
{
if (gWsaInited)
{
@@ -160,20 +161,20 @@ bool initWSA() noexcept
return true;
}
StreamError translateWSAError() noexcept
StreamError translateWSAError() MIJIN_NOEXCEPT
{
// TODO
return StreamError::UNKNOWN_ERROR;
}
StreamError translateWinError(DWORD error) noexcept
StreamError translateWinError(DWORD error) MIJIN_NOEXCEPT
{
// TODO
(void) error;
return StreamError::UNKNOWN_ERROR;
}
StreamError translateWinError() noexcept
StreamError translateWinError() MIJIN_NOEXCEPT
{
return translateWinError(GetLastError());
}
@@ -327,7 +328,7 @@ StreamFeatures TCPStream::getFeatures()
};
}
StreamError TCPStream::open(ip_address_t address, std::uint16_t port) noexcept
StreamError TCPStream::open(ip_address_t address, std::uint16_t port) MIJIN_NOEXCEPT
{
MIJIN_ASSERT(!isOpen(), "Socket is already open.");
@@ -375,19 +376,19 @@ StreamError TCPStream::open(ip_address_t address, std::uint16_t port) noexcept
return StreamError::SUCCESS;
}
void TCPStream::close() noexcept
void TCPStream::close() MIJIN_NOEXCEPT
{
MIJIN_ASSERT(isOpen(), "Socket is not open.");
osCloseSocket(handle_);
handle_ = INVALID_SOCKET_HANDLE;
}
TCPStream& TCPSocket::getStream() noexcept
TCPStream& TCPSocket::getStream() MIJIN_NOEXCEPT
{
return stream_;
}
StreamError TCPServerSocket::setup(ip_address_t address, std::uint16_t port) noexcept
StreamError TCPServerSocket::setup(ip_address_t address, std::uint16_t port) MIJIN_NOEXCEPT
{
MIJIN_ASSERT(!isListening(), "Socket is already listening.");
@@ -440,7 +441,7 @@ StreamError TCPServerSocket::setup(ip_address_t address, std::uint16_t port) noe
return StreamError::SUCCESS;
}
void TCPServerSocket::close() noexcept
void TCPServerSocket::close() MIJIN_NOEXCEPT
{
MIJIN_ASSERT(isListening(), "Socket is not listening.");
@@ -448,7 +449,7 @@ void TCPServerSocket::close() noexcept
handle_ = INVALID_SOCKET_HANDLE;
}
Task<StreamResult<std::unique_ptr<Socket>>> TCPServerSocket::c_waitForConnection() noexcept
Task<StreamResult<std::unique_ptr<Socket>>> TCPServerSocket::c_waitForConnection() MIJIN_NOEXCEPT
{
while (isListening())
{