summaryrefslogtreecommitdiffhomepage
path: root/dev/lib/fix
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-08-16 21:35:13 +0200
committerGitHub <noreply@github.com>2025-08-16 21:35:13 +0200
commit443588a42fe9cf48b5f63184b94afe483cb0e761 (patch)
treeb65844000839103efb40c635337339dc8f193f89 /dev/lib/fix
parent8b7b48fe4acf0482580930eaebaa2f316727f864 (diff)
parent95db0ac7dcb8625c5a1e92408c0c02962b205871 (diff)
Merge pull request #3 from snutech-gh/dev
SOCL – v1.0.4
Diffstat (limited to 'dev/lib/fix')
-rw-r--r--dev/lib/fix/network.hpp117
-rw-r--r--dev/lib/fix/parser.hpp20
2 files changed, 10 insertions, 127 deletions
diff --git a/dev/lib/fix/network.hpp b/dev/lib/fix/network.hpp
deleted file mode 100644
index edd4c26..0000000
--- a/dev/lib/fix/network.hpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * File: fix/network.hpp
- * Purpose: Financial Information Exchange in C++
- * Author: Amlal El Mahrouss (founder@snu.systems)
- * Copyright 2025, Amlal El Mahrouss and SNU Systems Corp.
- */
-
-#ifndef _SNU_FIX_NETWORK_HPP
-#define _SNU_FIX_NETWORK_HPP
-
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <utility>
-#include <cstddef>
-
-#define SNU_MODEM : protected snu::fix::basic_delivery_modem
-
-namespace snu::fix
-{
- class basic_delivery_modem;
-
- typedef int32_t delivery_socket_type;
-
- /// @brief a delivery modem is a container which establishes a comm. channel between the FIX session and application.
- class basic_delivery_modem
- {
- public:
- explicit basic_delivery_modem() = default;
- virtual ~basic_delivery_modem() = default;
-
- basic_delivery_modem& operator=(const basic_delivery_modem&) = default;
- basic_delivery_modem(const basic_delivery_modem&) = default;
-
- public:
- static constexpr auto local_address = "127.0.0.1";
- static constexpr auto backlog_count = 18U;
-
- public:
- delivery_socket_type fd_{};
-
- template <typename T>
- bool receive(T& out, std::size_t len) noexcept
- {
- static_assert(std::is_pointer<T>::value, "T is not a pointer!");
-
- if (!out)
- return false;
-
- if (!len)
- return false;
-
- auto ret = ::recv(fd_, out, len, MSG_WAITALL);
-
- return ret > 0;
- }
-
- template <typename T>
- bool transmit(T& out, std::size_t len) noexcept
- {
- static_assert(std::is_pointer<T>::value, "T is not a pointer!");
-
- if (!out)
- return false;
-
- if (!len)
- return false;
-
- auto ret = ::send(fd_, out, len, 0);
-
- return ret > 0;
- }
-
- template <int32_t AF, int32_t Kind, int32_t IPProto, int32_t Port>
- bool construct(const char* addr = basic_delivery_modem::local_address, const bool& is_server = false) noexcept
- {
- static_assert(AF != 0, "AF is zero");
- static_assert(Kind != 0, "Kind is zero");
- static_assert(IPProto != 0, "IPProto is zero");
-
- fd_ = ::socket(AF, Kind, IPProto);
-
- if (fd_ < 1)
- return false;
-
- struct sockaddr_in addr_
- {
- };
-
- addr_.sin_addr.s_addr = ::inet_addr(addr);
- addr_.sin_port = Port;
-
- if (!is_server)
- {
- auto ret = ::connect(fd_, (struct sockaddr*)&addr_, sizeof(decltype(addr_)));
- return ret == 0;
- }
-
- ::listen(fd_, basic_delivery_modem::backlog_count);
-
- return true;
- }
-
- bool destroy() noexcept
- {
- if (!fd_)
- return false;
-
- ::shutdown(fd_, SHUT_RDWR);
-
- fd_ = 0U;
-
- return true;
- }
- };
-} // namespace snu::fix
-
-#endif // ifndef _SNU_FIX_NETWORK_HPP \ No newline at end of file
diff --git a/dev/lib/fix/parser.hpp b/dev/lib/fix/parser.hpp
index 5701783..8181359 100644
--- a/dev/lib/fix/parser.hpp
+++ b/dev/lib/fix/parser.hpp
@@ -13,7 +13,7 @@
#include <utility>
#include <string>
#include <vector>
-
+#include <cstdint>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
@@ -21,13 +21,13 @@
namespace snu::fix
{
template <typename char_type>
- struct basic_visitor;
+ class basic_visitor;
template <typename char_type>
struct basic_range;
template <typename char_type>
- struct basic_range_data;
+ class basic_range_data;
/// @brief Buffer+Length structure
template <typename char_type = char>
@@ -63,12 +63,12 @@ namespace snu::fix
char_type* bytes_;
size_t length_;
- bool is_valid()
+ bool is_valid() noexcept
{
- return bytes_ && length_ > 0;
+ return this->bytes_ && this->length_ > 0;
}
- operator bool()
+ explicit operator bool()
{
return this->is_valid();
}
@@ -77,7 +77,7 @@ namespace snu::fix
/// @brief Convert basic_range to usable string.
/// @note This function assumes that the basic_range is valid and contains ASCII bytes.
template <typename char_type = char>
- inline std::basic_string<char_type> to_string(basic_range<char_type>& basic_range) noexcept
+ std::basic_string<char_type> to_string(basic_range<char_type>& basic_range) noexcept
{
if (basic_range.length_ < 0)
return std::basic_string<char_type>{};
@@ -98,7 +98,7 @@ namespace snu::fix
static inline const char_type* begin = detail::begin_fix<char_type>();
explicit basic_range_data() = default;
- ~basic_range_data() = default;
+ ~basic_range_data() = default;
basic_range_data& operator=(const basic_range_data&) = default;
basic_range_data(const basic_range_data&) = default;
@@ -126,7 +126,7 @@ namespace snu::fix
return magic_.starts_with(basic_range_data<char_type>::begin);
}
- operator bool()
+ explicit operator bool()
{
return this->is_valid();
}
@@ -159,7 +159,7 @@ namespace snu::fix
if (in.empty())
return ret;
- thread_local std::basic_string<char_type> in_tmp{};
+ static thread_local std::basic_string<char_type> in_tmp{};
in_tmp.reserve(in.size());