From e6579534e7c64be652ffeb74be7c977564a3ddab Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 30 Nov 2025 00:42:50 -0500 Subject: chore & feat: final library changes to stabilize changes. Signed-off-by: Amlal El Mahrouss --- include/ocl/checksum/crc32.hpp | 81 ----------------- include/ocl/core/allocator_op.hpp | 10 +-- include/ocl/core/chunk_string.hpp | 8 +- include/ocl/core/config.hpp | 17 ++-- include/ocl/core/equiv.hpp | 106 ---------------------- include/ocl/core/error.hpp | 21 ----- include/ocl/core/error_handler.hpp | 46 ---------- include/ocl/core/handler.hpp | 42 +++++++++ include/ocl/core/is_same.hpp | 106 ++++++++++++++++++++++ include/ocl/core/opt.hpp | 134 ---------------------------- include/ocl/core/option.hpp | 127 ++++++++++++++++++++++++++ include/ocl/crc32/crc32.hpp | 82 +++++++++++++++++ include/ocl/fix/checksum.hpp | 4 + include/ocl/fix/parser.hpp | 4 +- include/ocl/io/print.hpp | 14 ++- include/ocl/net/modem.hpp | 174 ------------------------------------ include/ocl/net/unique_socket.hpp | 177 +++++++++++++++++++++++++++++++++++++ 17 files changed, 566 insertions(+), 587 deletions(-) delete mode 100644 include/ocl/checksum/crc32.hpp delete mode 100644 include/ocl/core/equiv.hpp delete mode 100644 include/ocl/core/error.hpp delete mode 100644 include/ocl/core/error_handler.hpp create mode 100644 include/ocl/core/handler.hpp create mode 100644 include/ocl/core/is_same.hpp delete mode 100644 include/ocl/core/opt.hpp create mode 100644 include/ocl/core/option.hpp create mode 100644 include/ocl/crc32/crc32.hpp delete mode 100644 include/ocl/net/modem.hpp create mode 100644 include/ocl/net/unique_socket.hpp (limited to 'include') diff --git a/include/ocl/checksum/crc32.hpp b/include/ocl/checksum/crc32.hpp deleted file mode 100644 index 2bcab29..0000000 --- a/include/ocl/checksum/crc32.hpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * File: crc32.hpp - * Purpose: CRC32 module. - * Author: Amlal El Mahrouss, - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. - */ - -#ifndef _OCL_CRC32_HPP -#define _OCL_CRC32_HPP - -#include -#include -#include - -/// @brief Crc32 implementation in C++ -/// @author Amlal EL Mahrouss (amlal@nekernel.org) - -namespace ocl::crc32 -{ - namespace detail - { - inline constexpr const std::uint16_t crc_sz_ = 256U; - - inline std::uint32_t crc_array_[crc_sz_] = { - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, - 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, - 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, - 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, - 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, - 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, - 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, - 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, - 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, - 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, - 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, - 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, - 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, - 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, - 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, - 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, - 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, - 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d}; - - template - inline std::uint32_t - crc32(const char_type* in, size_t len) noexcept - { - if (!in || *in == 0) - return 0; - - std::uint32_t crc = 0xffffffff; - - while ((len--) > 0) - crc = (crc >> 8) ^ crc_array_[(crc ^ *(in++)) & 0xFF]; - - return ~crc; - } - } // namespace detail - - template - inline std::uint32_t hash(const std::basic_string& in) - { - return detail::crc32(in.c_str(), in.size()); - } -} // namespace ocl::crc32 - -#endif // !_OCL_CRC32_HPP \ No newline at end of file diff --git a/include/ocl/core/allocator_op.hpp b/include/ocl/core/allocator_op.hpp index 8fb8ce9..c086901 100644 --- a/include/ocl/core/allocator_op.hpp +++ b/include/ocl/core/allocator_op.hpp @@ -40,8 +40,8 @@ namespace ocl template class allocator_op { - allocator_new m_alloc_{}; - allocator_delete m_free_{}; + allocator_new alloc_op_{}; + allocator_delete free_op_{}; public: allocator_op() = default; @@ -52,18 +52,18 @@ namespace ocl ret_type* claim() { - return m_alloc_(); + return alloc_op_(); } template auto construct(var_type... args) -> std::shared_ptr { - return std::shared_ptr(m_alloc_.template var_alloc(args...), allocator_delete{}); + return std::shared_ptr(alloc_op_.template var_alloc(args...), allocator_delete{}); } void unclaim(ret_type* ptr) { - m_free_(ptr); + free_op_(ptr); } }; diff --git a/include/ocl/core/chunk_string.hpp b/include/ocl/core/chunk_string.hpp index 17d81bd..a2380f6 100644 --- a/include/ocl/core/chunk_string.hpp +++ b/include/ocl/core/chunk_string.hpp @@ -24,7 +24,7 @@ namespace ocl using condition_type = bool; private: - char_type packed_chunks_[max_chunk_size] = {0}; + char_type chunk_[max_chunk_size] = {0}; std::size_t chunk_total_{}; condition_type bad_{false}; @@ -84,7 +84,7 @@ namespace ocl if (chunk_total_ < size_max_chunk) { - std::memcpy(packed_chunks_ + chunk_total_, ptr, sz); + std::memcpy(chunk_ + chunk_total_, ptr, sz); chunk_total_ += sz; } @@ -102,14 +102,14 @@ namespace ocl else return ret; - ret = packed_chunks_; + ret = chunk_; return ret; } void print() noexcept { - ocl::io::print(packed_chunks_); + ocl::io::print(chunk_); } }; diff --git a/include/ocl/core/config.hpp b/include/ocl/core/config.hpp index 15439d8..c354672 100644 --- a/include/ocl/core/config.hpp +++ b/include/ocl/core/config.hpp @@ -8,38 +8,31 @@ #pragma once #include +#include #include #include #include #include #include -#include #include -#include -#include -#include -#include + #include #include -#define OCL_DEPRECATED() [[deprecated]] -#define OCL_DEPRECATED_MSG(MSG) [[deprecated( MSG )]] +#define OCL_DEPRECATED() [[deprecated]] +#define OCL_DEPRECATED_MSG(MSG) [[deprecated(MSG)]] #ifdef __cplusplus #define OCL_DECL extern "C" /// DLL/Dylib/So specific macro. #define OCL_EXPORT_DECL extern "C" BOOST_SYMBOL_EXPORT #else -#define OCL_DECL +#define OCL_DECL #define OCL_EXPORT_DECL #endif namespace ocl { -#ifdef OCL_USE_UTF8 - using char_type = char8_t; -#else using char_type = char; -#endif } // namespace ocl \ No newline at end of file diff --git a/include/ocl/core/equiv.hpp b/include/ocl/core/equiv.hpp deleted file mode 100644 index f98d86d..0000000 --- a/include/ocl/core/equiv.hpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * File: equiv.hpp - * Purpose: Equivalence header. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#pragma once - -#include - -/// @brief OCL equivalence namespace. -namespace ocl::equiv -{ - template - struct basic_hash_trait - { - /// @brief hash from T's result_type. - static typename T::result_type hash() - { - static T val; - return val.hash(); - } - }; - - template - struct is_same - { - static constexpr bool value = false; - - /// @brief check if hash matches what we expect. - constexpr bool operator()() noexcept - { - return T::hash() == U::hash(); - } - }; - - template - struct is_same - { - static constexpr bool value = true; - }; - - template - struct is_not_same - { - static constexpr bool value = true; - - constexpr bool operator()() noexcept - { - return T::hash() != U::hash(); - } - }; - - template - struct is_not_same - { - static constexpr bool value = false; - }; - - template - struct equiv_is_int8 - { - private: - T left_ = 127, right_ = 127; - - public: - using result_type = T; - - constexpr result_type hash() - { - return (left_ + right_) < 1; - } - }; - - template - struct equiv_not_int8 - { - private: - // these shall overflow if not int8. - T left_ = 127, right_ = 127; - - public: - using result_type = T; - - constexpr result_type hash() - { - return (left_ + right_) > 0; - } - }; - - template - struct equiv_is_real - { - private: - T left_ = 5, right_ = 3; - - public: - using result_type = T; - - constexpr result_type hash() - { - return left_ / right_ == 1; - } - }; -} // namespace ocl::equiv diff --git a/include/ocl/core/error.hpp b/include/ocl/core/error.hpp deleted file mode 100644 index cf038f8..0000000 --- a/include/ocl/core/error.hpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * File: opt.hpp - * Author: Amlal El Mahrouss, - * Copyright 2023-2025, Amlal El Mahrouss, Licensed under the Boost Software License - */ - -#ifndef _OCL_ERR_HPP -#define _OCL_ERR_HPP - -#include -#include - -namespace ocl::error -{ - using runtime_error = std::runtime_error; - using fix_error = runtime_error; - using math_error = runtime_error; - using cgi_error = runtime_error; -} // namespace ocl::error - -#endif // _OCL_ERR_HPP \ No newline at end of file diff --git a/include/ocl/core/error_handler.hpp b/include/ocl/core/error_handler.hpp deleted file mode 100644 index 971d91c..0000000 --- a/include/ocl/core/error_handler.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * File: core/basic_error_handler.hpp - * Purpose: Error handler container. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. - */ - -#ifndef _OCL_ERROR_HANDLER_HPP -#define _OCL_ERROR_HANDLER_HPP - -#include -#include - -namespace ocl -{ - struct basic_error_handler; - - struct basic_error_handler - { - explicit basic_error_handler() = default; - virtual ~basic_error_handler() = default; - - basic_error_handler& operator=(const basic_error_handler&) = default; - basic_error_handler(const basic_error_handler&) = default; - - template - void error(const std::basic_string& msg) - { - this->operator()(msg); - - if constexpr (throw_too) - { - throw std::runtime_error(msg); - } - } - - void operator()(const std::basic_string& msg) - { - ocl::io::print(msg); - } - }; - - using error_handler_type = basic_error_handler; -} // namespace ocl - -#endif // ifndef _OCL_ERROR_HANDLER_HPP diff --git a/include/ocl/core/handler.hpp b/include/ocl/core/handler.hpp new file mode 100644 index 0000000..e31f0d4 --- /dev/null +++ b/include/ocl/core/handler.hpp @@ -0,0 +1,42 @@ +/* + * File: core/handler.hpp + * Purpose: Handler container. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. + */ + +#ifndef _OCL_ERROR_HANDLER_HPP +#define _OCL_ERROR_HANDLER_HPP + +#include +#include +#include + +namespace ocl +{ + struct handler; + + struct handler + { + private: + template + void handle_impl(T element) {} + + public: + using error_type = std::exception; + + explicit handler() = default; + virtual ~handler() = default; + + handler& operator=(const handler&) = default; + handler(const handler&) = default; + + template + void operator()(T element) + { + this->handle_impl(element); + } + }; +} // namespace ocl + +#endif // ifndef _OCL_ERROR_HANDLER_HPP diff --git a/include/ocl/core/is_same.hpp b/include/ocl/core/is_same.hpp new file mode 100644 index 0000000..e6f42c4 --- /dev/null +++ b/include/ocl/core/is_same.hpp @@ -0,0 +1,106 @@ +/* + * File: is_same.hpp + * Purpose: Equivalence header. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#pragma once + +#include + +/// @brief OCL equivalence namespace. +namespace ocl::is_same +{ + template + struct basic_hash + { + /// @brief hash from T's result_type. + static typename T::result_type hash() + { + static T val; + return val.hash(); + } + }; + + template + struct is_same + { + static constexpr bool value = false; + + /// @brief check if hash matches what we expect. + constexpr bool operator()() noexcept + { + return T::hash() == U::hash(); + } + }; + + template + struct is_same + { + static constexpr bool value = true; + }; + + template + struct is_not_same + { + static constexpr bool value = true; + + constexpr bool operator()() noexcept + { + return T::hash() != U::hash(); + } + }; + + template + struct is_not_same + { + static constexpr bool value = false; + }; + + template + struct equiv_is_int8 + { + private: + T left_ = 127, right_ = 127; + + public: + using result_type = T; + + constexpr result_type hash() + { + return (left_ + right_) < 1; + } + }; + + template + struct equiv_not_int8 + { + private: + // these shall overflow if not int8. + T left_ = 127, right_ = 127; + + public: + using result_type = T; + + constexpr result_type hash() + { + return (left_ + right_) > 0; + } + }; + + template + struct equiv_is_real + { + private: + T left_ = 5, right_ = 3; + + public: + using result_type = T; + + constexpr result_type hash() + { + return left_ / right_ == 1; + } + }; +} // namespace ocl::is_same diff --git a/include/ocl/core/opt.hpp b/include/ocl/core/opt.hpp deleted file mode 100644 index 506f582..0000000 --- a/include/ocl/core/opt.hpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - * File: opt.hpp - * Author: Amlal El Mahrouss, - * Copyright 2023-2025, Amlal El Mahrouss, Licensed under the Boost Software License - */ - -#ifndef _OCL_OPT_HPP -#define _OCL_OPT_HPP - -#include -#include - -namespace ocl -{ - enum class return_type - { - invalid = 0, - okay = 100, - err, - count = err - okay + 1, - }; - - template - struct opt final - { - explicit opt(const return_type& return_type) - : m_ret(return_type) - { - } - - opt& expect(const char_type* input) - { - if (m_ret == return_type::err) - { - throw std::runtime_error(input ? input : "opt::error"); - } - - return *this; - } - - template - opt& expect_or_handle(const char_type* input) - { - if (m_ret == return_type::err) - { - ErrorHandler err_handler; - err_handler(input ? input : "opt::error"); - } - - return *this; - } - - private: - return_type m_ret{return_type::invalid}; - }; - - template - inline return_type eval(Teller tell, Lst&&... arg) - { - return tell(std::forward(arg)...) ? return_type::okay : return_type::err; - } - - namespace traits - { - struct int_eq_teller - { - explicit int_eq_teller() - { - } - - bool operator()(int a, int b) - { - return (a == b); - } - }; - - struct int_greater_than_teller - { - explicit int_greater_than_teller() - { - } - - bool operator()(int a, int b) - { - return (a > b); - } - }; - - struct int_less_than_teller - { - explicit int_less_than_teller() - { - } - - bool operator()(int a, int b) - { - return (a < b); - } - }; - } // namespace traits - - template - inline return_type eval_less_than(Lst&&... arg) - { - static traits::int_less_than_teller eq; - return eq(std::forward(arg)...) ? return_type::okay : return_type::err; - } - - template - inline return_type eval_eq(Lst&&... arg) - { - static traits::int_eq_teller less_than; - return less_than(std::forward(arg)...) ? return_type::okay : return_type::err; - } - - template - inline return_type eval_greater_than(Lst&&... arg) - { - static traits::int_greater_than_teller greater_than; - return greater_than(std::forward(arg)...) ? return_type::okay : return_type::err; - } - - inline return_type eval_true() noexcept - { - return return_type::okay; - } - - inline return_type eval_false() noexcept - { - return return_type::err; - } -} // namespace ocl - -#endif /* ifndef _OCL_OPT_HPP */ \ No newline at end of file diff --git a/include/ocl/core/option.hpp b/include/ocl/core/option.hpp new file mode 100644 index 0000000..5bae9a2 --- /dev/null +++ b/include/ocl/core/option.hpp @@ -0,0 +1,127 @@ +/* + * File: option.hpp + * Author: Amlal El Mahrouss, + * Copyright 2023-2025, Amlal El Mahrouss, Licensed under the Boost Software License + */ + +#ifndef _OCL_OPT_HPP +#define _OCL_OPT_HPP + +#include +#include + +namespace ocl +{ + enum class return_type + { + invalid = 0, + okay = 100, + err, + count = err - okay + 1, + }; + + template + struct option final + { + explicit option(const return_type& return_type) + : ret_(return_type) + { + } + + ~option() = default; + + option& operator=(const option&) = default; + option(const option&) = default; + + option& expect(const char_type* input) + { + if (ret_ == return_type::err) + { + throw std::runtime_error(input ? input : "option::error"); + } + + return *this; + } + + template + option& expect_or_handle(const char_type* input) + { + if (ret_ == return_type::err) + { + ErrorHandler err_handler; + err_handler(input ? input : "option::error"); + } + + return *this; + } + + private: + return_type ret_{return_type::invalid}; + }; + + template + inline return_type eval(Teller tell, Lst&&... arg) + { + return tell(std::forward(arg)...) ? return_type::okay : return_type::err; + } + + namespace traits + { + struct int_eq_teller + { + bool operator()(int a, int b) + { + return (a == b); + } + }; + + struct int_greater_than_teller + { + bool operator()(int a, int b) + { + return (a > b); + } + }; + + struct int_less_than_teller + { + bool operator()(int a, int b) + { + return (a < b); + } + }; + } // namespace traits + + template + inline return_type eval_less_than(Lst&&... arg) + { + static traits::int_less_than_teller eq; + return eq(std::forward(arg)...) ? return_type::okay : return_type::err; + } + + template + inline return_type eval_eq(Lst&&... arg) + { + static traits::int_eq_teller less_than; + return less_than(std::forward(arg)...) ? return_type::okay : return_type::err; + } + + template + inline return_type eval_greater_than(Lst&&... arg) + { + static traits::int_greater_than_teller greater_than; + return greater_than(std::forward(arg)...) ? return_type::okay : return_type::err; + } + + inline return_type eval_true() noexcept + { + return return_type::okay; + } + + inline return_type eval_false() noexcept + { + return return_type::err; + } +} // namespace ocl + +#endif /* ifndef _OCL_OPT_HPP */ \ No newline at end of file diff --git a/include/ocl/crc32/crc32.hpp b/include/ocl/crc32/crc32.hpp new file mode 100644 index 0000000..0ee1f8c --- /dev/null +++ b/include/ocl/crc32/crc32.hpp @@ -0,0 +1,82 @@ +/* + * File: crc32.hpp + * Purpose: CRC32 module. + * Author: Amlal El Mahrouss, + * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. + */ + +#ifndef _OCL_CRC32_HPP +#define _OCL_CRC32_HPP + +#include +#include +#include +#include + +/// @brief Crc32 implementation in C++ +/// @author Amlal El Mahrouss (amlal@nekernel.org) + +namespace ocl::crc32 +{ + namespace detail + { + inline constexpr const std::uint16_t crc_sz_ = 256U; + + inline std::uint32_t crc_array_[crc_sz_] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d}; + + template + inline std::uint32_t + crc32(buffer_type in, size_t len) noexcept + { + if (!in || *in == 0) + return 0; + + std::uint32_t crc = 0xffffffff; + + while ((len--) > 0) + crc = (crc >> 8) ^ crc_array_[(crc ^ *(in++)) & 0xFF]; + + return ~crc; + } + } // namespace detail + + template + inline std::uint32_t hash(const std::basic_string& in) + { + return detail::crc32(in.c_str(), in.size()); + } +} // namespace ocl::crc32 + +#endif // !_OCL_CRC32_HPP \ No newline at end of file diff --git a/include/ocl/fix/checksum.hpp b/include/ocl/fix/checksum.hpp index 9205664..807b9b0 100644 --- a/include/ocl/fix/checksum.hpp +++ b/include/ocl/fix/checksum.hpp @@ -8,3 +8,7 @@ #pragma once #include + +namespace ocl::fix +{ +} \ No newline at end of file diff --git a/include/ocl/fix/parser.hpp b/include/ocl/fix/parser.hpp index 3d24cf0..71e0eb6 100644 --- a/include/ocl/fix/parser.hpp +++ b/include/ocl/fix/parser.hpp @@ -10,9 +10,9 @@ #include #include - #include #include +#include namespace ocl::fix { @@ -216,7 +216,7 @@ namespace ocl::fix } } - using fix_tag_type = std::uint32_t; + using fix_tag_type = std::basic_string; using range_data = basic_range_data; using visitor = basic_visitor; diff --git a/include/ocl/io/print.hpp b/include/ocl/io/print.hpp index 9629e05..1220cec 100644 --- a/include/ocl/io/print.hpp +++ b/include/ocl/io/print.hpp @@ -9,14 +9,17 @@ #define _OCL_PRINT_HPP #include + #include +#define console_io_out std::cout + namespace ocl::io { template inline void print(T fmt) noexcept { - std::cout << fmt; + console_io_out << fmt; } inline void print() noexcept {} @@ -31,7 +34,7 @@ namespace ocl::io template inline void print(T fmt, Args... other) noexcept { - std::cout << fmt; + console_io_out << fmt; print(other...); } @@ -39,8 +42,15 @@ namespace ocl::io inline void println(T... fmt) noexcept { print(fmt...); + +#ifdef _WIN32 + print("\r\n"); +#else print("\n"); +#endif } } // namespace ocl::io +#undef console_io_out + #endif // ifndef _OCL_PRINT_HPP diff --git a/include/ocl/net/modem.hpp b/include/ocl/net/modem.hpp deleted file mode 100644 index 1e58d1d..0000000 --- a/include/ocl/net/modem.hpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - * File: net/modem.hpp - * Purpose: Modem concept in modern C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#pragma once - -#include - -#include -#include -#include -#include -#include -#include - -#define OCL_MODEM_INTERFACE : public ocl::net::modem - -#ifdef _WIN32 -#error !!! "Windows is not supported yet for " !!! -#endif // _WIN32 - -namespace ocl::net -{ - class modem; - - /// ============================================================================= - /// @brief Modem container concept, a container to read and write on a network stream. - /// ============================================================================= - class modem final - { - public: - using socket_type = int64_t; - using error_type = bool; - using condition_type = bool; - - private: - socket_type fd_{}; - condition_type is_server_{false}; - error_type bad_{true}; - - public: - const error_type& bad{bad_}; - - explicit modem() = default; - - ~modem() - { - this->destroy(); - } - - modem& operator=(const modem&) = delete; - modem(const modem&) = delete; - - static constexpr auto local_address_ip4 = "127.0.0.1"; - static constexpr auto local_address_ip6 = "::1"; - static constexpr const auto backlog_count = 5U; - - /// ============================================================================= - /// @brief Check if the modem is valid. - /// @return true if valid, false otherwise. - /// ============================================================================= - - bool is_valid() const noexcept - { - return this->fd_ != -1 && !this->bad_; - } - - template - bool receive(ptr_type& out, std::size_t len) noexcept - { - static_assert(std::is_pointer::value, "ptr_type is not a pointer!"); - - if (!out) - return false; - - if (!len) - return false; - - socket_type cl_{fd_}; - - if (this->is_server_) - cl_ = ::accept(fd_, nullptr, nullptr); - - auto ret = ::recv(cl_, out, len, 0); - - return ret > 0L; - } - - template - bool transmit(ptr_type& out, std::size_t len) noexcept - { - static_assert(std::is_pointer::value, "ptr_type is not a pointer!"); - - if (!out) - return false; - - if (!len) - return false; - - auto ret = ::send(fd_, out, len, 0); - - bad_ = !(ret >= 0L); - - return ret >= 0L; - } - - template - bool transmit(const std::basic_string& out) noexcept - { - if (out.empty()) - return false; - - auto ret = ::send(fd_, out.data(), out.size(), 0); - - bad_ = !(ret >= 0L); - - return ret >= 0L; - } - - template - bool construct(const char* addr = modem::local_address_ip4, const bool& is_server = false) noexcept - { - static_assert(af != 0, "Address family is zero"); - static_assert(kind != 0, "Kind is zero"); - - must_pass(); - must_pass(); - must_pass<(port > 0) && (port < 65536)>(); - - fd_ = ::socket(af, kind, 0); - is_server_ = is_server; - - if (fd_ == -1) - return false; - - struct sockaddr_in addr_; - std::memset(&addr_, 0, sizeof(struct sockaddr_in)); - - addr_.sin_addr.s_addr = ::inet_addr(addr); - addr_.sin_port = htons(port); - addr_.sin_family = af; - - if (!is_server) - { - const auto ret = ::connect(fd_, reinterpret_cast(&addr_), sizeof(addr_)); - return ret == 0L; - } - - int ret = ::bind(fd_, (struct sockaddr*)&addr_, sizeof(addr_)); - - bad_ = ret == -1; - - ::listen(fd_, modem::backlog_count); - - return bad_ == false; - } - - bool destroy() noexcept - { - if (!fd_) - return false; - - ::shutdown(fd_, SHUT_RDWR); - ::close(fd_); - - fd_ = 0L; - - return true; - } - }; -} // namespace ocl::net diff --git a/include/ocl/net/unique_socket.hpp b/include/ocl/net/unique_socket.hpp new file mode 100644 index 0000000..906853f --- /dev/null +++ b/include/ocl/net/unique_socket.hpp @@ -0,0 +1,177 @@ +/* + * File: net/unique_socket.hpp + * Purpose: RAII socket concept in modern C++ + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#error !!! "Windows is not supported yet for " !!! +#endif // _WIN32 + +namespace ocl::net +{ + class unique_socket; + + /// ============================================================================= + /// @brief Modem container concept, a container to read and write on a network stream. + /// ============================================================================= + class unique_socket final + { + public: + using socket_type = int64_t; + using error_type = bool; + using condition_type = bool; + + private: + socket_type fd_{}; + condition_type is_server_{false}; + error_type bad_{true}; + + public: + const error_type& bad{bad_}; + + unique_socket() = default; + + ~unique_socket() + { + this->destroy(); + } + + unique_socket& operator=(const unique_socket&) = delete; + unique_socket(const unique_socket&) = default; + + static constexpr auto local_address_ip4 = "127.0.0.1"; + static constexpr auto local_address_ip6 = "::1"; + static constexpr const auto backlog_count = 5U; + + /// ============================================================================= + /// @brief Check if the unique_socket is valid. + /// @return true if valid, false otherwise. + /// ============================================================================= + + bool is_valid() const noexcept + { + return this->fd_ != -1 && !this->bad_; + } + + template + bool receive(ptr_type& out, std::size_t len) noexcept + { + static_assert(std::is_pointer::value, "ptr_type is not a pointer!"); + + if (!out) + return false; + + if (!len) + return false; + + socket_type cl_{fd_}; + + if (this->is_server_) + cl_ = ::accept(fd_, nullptr, nullptr); + + auto ret = ::recv(cl_, out, len, 0); + + return ret > 0L; + } + + template + bool transmit(ptr_type& out, std::size_t len) noexcept + { + static_assert(std::is_pointer::value, "ptr_type is not a pointer!"); + + if (!out) + return false; + + if (!len) + return false; + + auto ret = ::send(fd_, out, len, 0); + + bad_ = !(ret >= 0L); + + return ret >= 0L; + } + + template + bool transmit(const std::basic_string& out) noexcept + { + if (out.empty()) + return false; + + auto ret = ::send(fd_, out.data(), out.size(), 0); + + bad_ = !(ret >= 0L); + + return ret >= 0L; + } + + template + bool construct(const char* addr = unique_socket::local_address_ip4, const bool& is_server = false) noexcept + { + static_assert(af != 0, "Address family is zero"); + static_assert(kind != 0, "Kind is zero"); + + fd_ = ::socket(af, kind, 0); + is_server_ = is_server; + + if (fd_ == -1) + return false; + + struct sockaddr_in addr_; + std::memset(&addr_, 0, sizeof(struct sockaddr_in)); + + addr_.sin_addr.s_addr = ::inet_addr(addr); + addr_.sin_port = htons(port); + addr_.sin_family = af; + + if (!is_server) + { + const auto ret = ::connect(fd_, reinterpret_cast(&addr_), sizeof(addr_)); + return ret == 0L; + } + + int ret = ::bind(fd_, (struct sockaddr*)&addr_, sizeof(addr_)); + + bad_ = ret == -1; + + ::listen(fd_, unique_socket::backlog_count); + + return bad_ == false; + } + + bool destroy() noexcept + { + if (!fd_) + return false; + + ::shutdown(fd_, SHUT_RDWR); + ::close(fd_); + + fd_ = 0L; + + return true; + } + }; + + template + inline unique_socket make_socket(const std::basic_string& address, const bool is_server) + { + unique_socket sock; + sock.construct(address.c_str(), is_server); + + return sock; + } +} // namespace ocl::net -- cgit v1.2.3