From df4ec096491ded6d58b9ee094d6942e3188c2d4a Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Sun, 23 Nov 2025 17:26:48 +0100 Subject: fix: lib: `visit` may now throw exceptions. Signed-off-by: Amlal El Mahrouss --- dev/lib/core/chunk_string.hpp | 2 +- dev/lib/fix/fix.hpp | 51 +++++++++++++++++++----------------------- dev/lib/logic/math.hpp | 4 ++-- dev/lib/memory/tracked_ptr.hpp | 2 +- dev/lib/net/modem.hpp | 1 - dev/lib/simd/simd.hpp | 4 ++-- dev/lib/utility/cgi.hpp | 2 +- dev/lib/utility/embfs.hpp | 2 +- 8 files changed, 31 insertions(+), 37 deletions(-) diff --git a/dev/lib/core/chunk_string.hpp b/dev/lib/core/chunk_string.hpp index 0ecc73e..e32d030 100644 --- a/dev/lib/core/chunk_string.hpp +++ b/dev/lib/core/chunk_string.hpp @@ -94,7 +94,7 @@ namespace ocl std::basic_string str() const noexcept { static std::basic_string ret; - const auto& sz = ret.size(); + const auto& sz = ret.size(); if (chunk_total_ > sz) ret.clear(); diff --git a/dev/lib/fix/fix.hpp b/dev/lib/fix/fix.hpp index 08360d5..0c6685d 100644 --- a/dev/lib/fix/fix.hpp +++ b/dev/lib/fix/fix.hpp @@ -151,6 +151,9 @@ namespace ocl::fix return this->visit(in); } + /// @brief Visit a FIX message and parse it into a basic_range_data object. + /// @param in The input FIX message as a string. + /// @warning This function may throw exceptions. basic_range_data visit(const std::basic_string& in) { thread_local basic_range_data ret{}; @@ -160,37 +163,29 @@ namespace ocl::fix std::basic_string in_tmp{"", in.size()}; - try + for (auto& ch : in) { - for (auto& ch : in) + if (ch != basic_visitor::soh) { - if (ch != basic_visitor::soh) - { - in_tmp += ch; - continue; - } - - std::basic_string key = in_tmp.substr(0, in_tmp.find(basic_visitor::eq)); - std::basic_string val = in_tmp.substr(in_tmp.find(basic_visitor::eq) + 1); - - if (ret.magic_.empty()) - { - ret.magic_ = val; - ret.magic_len_ = ret.magic_.size(); - } - else - { - ret.body_.emplace_back(std::make_pair(key, val)); - ret.body_len_ += in_tmp.size(); - } - - in_tmp.clear(); + in_tmp += ch; + continue; } - } - catch (...) - { + + std::basic_string key = in_tmp.substr(0, in_tmp.find(basic_visitor::eq)); + std::basic_string val = in_tmp.substr(in_tmp.find(basic_visitor::eq) + 1); + + if (ret.magic_.empty()) + { + ret.magic_ = val; + ret.magic_len_ = ret.magic_.size(); + } + else + { + ret.body_.emplace_back(std::make_pair(key, val)); + ret.body_len_ += in_tmp.size(); + } + in_tmp.clear(); - return ret; } in_tmp.clear(); @@ -210,7 +205,7 @@ namespace ocl::fix using fix_tag_type = std::uint32_t; using range_data = basic_range_data; - using visitor = basic_visitor; + using visitor = basic_visitor; } // namespace ocl::fix #endif // ifndef _OCL_FIX_PARSER_HPP \ No newline at end of file diff --git a/dev/lib/logic/math.hpp b/dev/lib/logic/math.hpp index 52f4535..d131ef9 100644 --- a/dev/lib/logic/math.hpp +++ b/dev/lib/logic/math.hpp @@ -27,7 +27,7 @@ namespace ocl static constexpr const bool value = false; }; - constexpr inline auto not_a_number = __builtin_nanf (""); - constexpr inline auto positive_infinity = __builtin_inff (); + constexpr inline auto not_a_number = __builtin_nanf(""); + constexpr inline auto positive_infinity = __builtin_inff(); constexpr inline auto negative_infinity = -positive_infinity; } // namespace ocl \ No newline at end of file diff --git a/dev/lib/memory/tracked_ptr.hpp b/dev/lib/memory/tracked_ptr.hpp index 0ea0e32..2df5db5 100644 --- a/dev/lib/memory/tracked_ptr.hpp +++ b/dev/lib/memory/tracked_ptr.hpp @@ -140,7 +140,7 @@ namespace ocl::memory this->reset(); } - tracked_ptr(const tracked_ptr&) = delete; + tracked_ptr(const tracked_ptr&) = delete; tracked_ptr& operator=(const tracked_ptr&) = delete; public: diff --git a/dev/lib/net/modem.hpp b/dev/lib/net/modem.hpp index fd64f72..d86234b 100644 --- a/dev/lib/net/modem.hpp +++ b/dev/lib/net/modem.hpp @@ -165,4 +165,3 @@ namespace ocl::net } }; } // namespace ocl::net - diff --git a/dev/lib/simd/simd.hpp b/dev/lib/simd/simd.hpp index 239e512..f15f88a 100644 --- a/dev/lib/simd/simd.hpp +++ b/dev/lib/simd/simd.hpp @@ -30,11 +30,11 @@ namespace ocl::simd }; public: - real_type() = default; + real_type() = default; virtual ~real_type() = default; real_type& operator=(const real_type&) = delete; - real_type(const real_type&) = delete; + real_type(const real_type&) = delete; typename backend_type::register_type& call(const opcode& op, typename backend_type::register_type& lhs, typename backend_type::register_type& rhs) { diff --git a/dev/lib/utility/cgi.hpp b/dev/lib/utility/cgi.hpp index fd00bbf..4cc913b 100644 --- a/dev/lib/utility/cgi.hpp +++ b/dev/lib/utility/cgi.hpp @@ -37,7 +37,7 @@ namespace ocl public: explicit basic_writer() = default; - virtual ~basic_writer() = default; + virtual ~basic_writer() = default; basic_writer& operator=(const basic_writer&) = default; basic_writer(const basic_writer&) = default; diff --git a/dev/lib/utility/embfs.hpp b/dev/lib/utility/embfs.hpp index e2e5d18..8a716ce 100644 --- a/dev/lib/utility/embfs.hpp +++ b/dev/lib/utility/embfs.hpp @@ -37,7 +37,7 @@ namespace ocl::embfs #endif typedef std::int16_t sword_t; - + typedef std::int32_t sdword_t; typedef std::uint8_t utf8_char_t; -- cgit v1.2.3 From 65a8349aa5526d071b18cd4d42586c46faaa3823 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Mon, 24 Nov 2025 02:13:48 +0100 Subject: feat! breaking changes for OCL v1.0.48. Signed-off-by: Amlal El Mahrouss --- Doxyfile | 6 +- README.md | 2 +- compile_flags.txt | 2 +- dev/examples/allocator_system/CMakeLists.txt | 16 -- dev/examples/allocator_system/allocator_system.cc | 53 ----- dev/examples/cgi/CMakeLists.txt | 16 -- dev/examples/cgi/cgi.cc | 75 ------- dev/examples/equiv/CMakeLists.txt | 12 -- dev/examples/equiv/equiv.cc | 19 -- dev/examples/fix/CMakeLists.txt | 15 -- dev/examples/fix/fix.cc | 37 ---- dev/examples/opt/CMakeLists.txt | 12 -- dev/examples/opt/opt.cc | 45 ---- dev/examples/tracked_ptr/CMakeLists.txt | 12 -- dev/examples/tracked_ptr/tracked_ptr.cc | 52 ----- dev/lib/core/chunk_string.hpp | 121 ----------- dev/lib/core/error_handler.hpp | 47 ----- dev/lib/core/includes.hpp | 23 --- dev/lib/except/error.hpp | 21 -- dev/lib/fix/fix.hpp | 211 ------------------- dev/lib/io/print.hpp | 47 ----- dev/lib/logic/equiv.hpp | 104 ---------- dev/lib/logic/math.hpp | 33 --- dev/lib/logic/opt.hpp | 134 ------------ dev/lib/memory/allocator_system.hpp | 74 ------- dev/lib/memory/tracked_ptr.hpp | 235 --------------------- dev/lib/net/modem.hpp | 167 --------------- dev/lib/net/url.hpp | 120 ----------- dev/lib/simd/basic_simd.hpp | 47 ----- dev/lib/simd/simd.hpp | 61 ------ dev/lib/tests/gtest.hpp | 10 - dev/lib/tests/hpptest.hpp | 90 -------- dev/lib/utility/cgi.hpp | 79 ------- dev/lib/utility/crc32.hpp | 81 -------- dev/lib/utility/embfs.hpp | 81 -------- dev/tests/.gitkeep | 0 dev/tests/chunk_string/CMakeLists.txt | 25 --- dev/tests/chunk_string/chunk_test.cc | 31 --- dev/tests/fix_basic/CMakeLists.txt | 23 --- dev/tests/fix_basic/fix_test.cc | 21 -- dev/tests/network_basic/CMakeLists.txt | 23 --- dev/tests/network_basic/net_test.cc | 22 -- dev/tests/tracked_ptr_basic/CMakeLists.txt | 23 --- dev/tests/tracked_ptr_basic/tracked_ptr_test.cc | 25 --- dev/tests/tracked_ptr_leak/CMakeLists.txt | 23 --- dev/tests/tracked_ptr_leak/tracked_ptr_test.cc | 19 -- examples/allocator_system/CMakeLists.txt | 16 ++ examples/allocator_system/allocator_system.cc | 53 +++++ examples/cgi/CMakeLists.txt | 16 ++ examples/cgi/cgi.cc | 75 +++++++ examples/equiv/CMakeLists.txt | 12 ++ examples/equiv/equiv.cc | 19 ++ examples/fix/CMakeLists.txt | 15 ++ examples/fix/fix.cc | 37 ++++ examples/opt/CMakeLists.txt | 12 ++ examples/opt/opt.cc | 45 ++++ examples/tracked_ptr/CMakeLists.txt | 12 ++ examples/tracked_ptr/tracked_ptr.cc | 52 +++++ include/ocl/core/chunk_string.hpp | 121 +++++++++++ include/ocl/core/error_handler.hpp | 47 +++++ include/ocl/core/includes.hpp | 23 +++ include/ocl/except/error.hpp | 21 ++ include/ocl/fix/fix.hpp | 211 +++++++++++++++++++ include/ocl/io/print.hpp | 47 +++++ include/ocl/logic/equiv.hpp | 104 ++++++++++ include/ocl/logic/math.hpp | 33 +++ include/ocl/logic/opt.hpp | 134 ++++++++++++ include/ocl/memory/allocator_system.hpp | 74 +++++++ include/ocl/memory/tracked_ptr.hpp | 241 ++++++++++++++++++++++ include/ocl/net/modem.hpp | 173 ++++++++++++++++ include/ocl/net/url.hpp | 123 +++++++++++ include/ocl/simd/basic_simd.hpp | 47 +++++ include/ocl/simd/simd.hpp | 61 ++++++ include/ocl/tests/gtest.hpp | 10 + include/ocl/tests/hpptest.hpp | 90 ++++++++ include/ocl/utility/cgi.hpp | 79 +++++++ include/ocl/utility/crc32.hpp | 81 ++++++++ include/ocl/utility/embfs.hpp | 81 ++++++++ make_dist_linux.sh | 2 +- make_dist_osx.sh | 2 +- tests/.gitkeep | 0 tests/chunk_string/CMakeLists.txt | 25 +++ tests/chunk_string/chunk_test.cc | 31 +++ tests/fix_basic/CMakeLists.txt | 23 +++ tests/fix_basic/fix_test.cc | 19 ++ tests/network_basic/CMakeLists.txt | 23 +++ tests/network_basic/net_test.cc | 22 ++ tests/tracked_ptr_basic/CMakeLists.txt | 23 +++ tests/tracked_ptr_basic/tracked_ptr_test.cc | 25 +++ tests/tracked_ptr_leak/CMakeLists.txt | 23 +++ tests/tracked_ptr_leak/tracked_ptr_test.cc | 19 ++ 91 files changed, 2405 insertions(+), 2392 deletions(-) delete mode 100644 dev/examples/allocator_system/CMakeLists.txt delete mode 100644 dev/examples/allocator_system/allocator_system.cc delete mode 100644 dev/examples/cgi/CMakeLists.txt delete mode 100644 dev/examples/cgi/cgi.cc delete mode 100644 dev/examples/equiv/CMakeLists.txt delete mode 100644 dev/examples/equiv/equiv.cc delete mode 100644 dev/examples/fix/CMakeLists.txt delete mode 100644 dev/examples/fix/fix.cc delete mode 100644 dev/examples/opt/CMakeLists.txt delete mode 100644 dev/examples/opt/opt.cc delete mode 100644 dev/examples/tracked_ptr/CMakeLists.txt delete mode 100644 dev/examples/tracked_ptr/tracked_ptr.cc delete mode 100644 dev/lib/core/chunk_string.hpp delete mode 100644 dev/lib/core/error_handler.hpp delete mode 100644 dev/lib/core/includes.hpp delete mode 100644 dev/lib/except/error.hpp delete mode 100644 dev/lib/fix/fix.hpp delete mode 100644 dev/lib/io/print.hpp delete mode 100644 dev/lib/logic/equiv.hpp delete mode 100644 dev/lib/logic/math.hpp delete mode 100644 dev/lib/logic/opt.hpp delete mode 100644 dev/lib/memory/allocator_system.hpp delete mode 100644 dev/lib/memory/tracked_ptr.hpp delete mode 100644 dev/lib/net/modem.hpp delete mode 100644 dev/lib/net/url.hpp delete mode 100644 dev/lib/simd/basic_simd.hpp delete mode 100644 dev/lib/simd/simd.hpp delete mode 100644 dev/lib/tests/gtest.hpp delete mode 100644 dev/lib/tests/hpptest.hpp delete mode 100644 dev/lib/utility/cgi.hpp delete mode 100644 dev/lib/utility/crc32.hpp delete mode 100644 dev/lib/utility/embfs.hpp delete mode 100644 dev/tests/.gitkeep delete mode 100644 dev/tests/chunk_string/CMakeLists.txt delete mode 100644 dev/tests/chunk_string/chunk_test.cc delete mode 100644 dev/tests/fix_basic/CMakeLists.txt delete mode 100644 dev/tests/fix_basic/fix_test.cc delete mode 100644 dev/tests/network_basic/CMakeLists.txt delete mode 100644 dev/tests/network_basic/net_test.cc delete mode 100644 dev/tests/tracked_ptr_basic/CMakeLists.txt delete mode 100644 dev/tests/tracked_ptr_basic/tracked_ptr_test.cc delete mode 100644 dev/tests/tracked_ptr_leak/CMakeLists.txt delete mode 100644 dev/tests/tracked_ptr_leak/tracked_ptr_test.cc create mode 100644 examples/allocator_system/CMakeLists.txt create mode 100644 examples/allocator_system/allocator_system.cc create mode 100644 examples/cgi/CMakeLists.txt create mode 100644 examples/cgi/cgi.cc create mode 100644 examples/equiv/CMakeLists.txt create mode 100644 examples/equiv/equiv.cc create mode 100644 examples/fix/CMakeLists.txt create mode 100644 examples/fix/fix.cc create mode 100644 examples/opt/CMakeLists.txt create mode 100644 examples/opt/opt.cc create mode 100644 examples/tracked_ptr/CMakeLists.txt create mode 100644 examples/tracked_ptr/tracked_ptr.cc create mode 100644 include/ocl/core/chunk_string.hpp create mode 100644 include/ocl/core/error_handler.hpp create mode 100644 include/ocl/core/includes.hpp create mode 100644 include/ocl/except/error.hpp create mode 100644 include/ocl/fix/fix.hpp create mode 100644 include/ocl/io/print.hpp create mode 100644 include/ocl/logic/equiv.hpp create mode 100644 include/ocl/logic/math.hpp create mode 100644 include/ocl/logic/opt.hpp create mode 100644 include/ocl/memory/allocator_system.hpp create mode 100644 include/ocl/memory/tracked_ptr.hpp create mode 100644 include/ocl/net/modem.hpp create mode 100644 include/ocl/net/url.hpp create mode 100644 include/ocl/simd/basic_simd.hpp create mode 100644 include/ocl/simd/simd.hpp create mode 100644 include/ocl/tests/gtest.hpp create mode 100644 include/ocl/tests/hpptest.hpp create mode 100644 include/ocl/utility/cgi.hpp create mode 100644 include/ocl/utility/crc32.hpp create mode 100644 include/ocl/utility/embfs.hpp create mode 100644 tests/.gitkeep create mode 100644 tests/chunk_string/CMakeLists.txt create mode 100644 tests/chunk_string/chunk_test.cc create mode 100644 tests/fix_basic/CMakeLists.txt create mode 100644 tests/fix_basic/fix_test.cc create mode 100644 tests/network_basic/CMakeLists.txt create mode 100644 tests/network_basic/net_test.cc create mode 100644 tests/tracked_ptr_basic/CMakeLists.txt create mode 100644 tests/tracked_ptr_basic/tracked_ptr_test.cc create mode 100644 tests/tracked_ptr_leak/CMakeLists.txt create mode 100644 tests/tracked_ptr_leak/tracked_ptr_test.cc diff --git a/Doxyfile b/Doxyfile index a558fb4..ffa0254 100644 --- a/Doxyfile +++ b/Doxyfile @@ -48,7 +48,7 @@ PROJECT_NAME = "Open C++ Library" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = dev +PROJECT_NUMBER = develop # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewers a @@ -74,7 +74,7 @@ PROJECT_ICON = # entered, it will be relative to the location where Doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = ./ocl/docs +OUTPUT_DIRECTORY = ./docs # If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format @@ -991,7 +991,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = /Volumes/Projects/src/ocl +INPUT = ./include/ocl # This tag can be used to specify the character encoding of the source files # that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/README.md b/README.md index f7da55c..6d495db 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ A C++ library with additional modules for your C++ SDLC. ### Logic Module (Option container) ```cpp -#include +#include int main(int argc, char** argv) { diff --git a/compile_flags.txt b/compile_flags.txt index da935d4..cc97734 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -1,4 +1,4 @@ --Idev +-Iinclude/ocl -std=c++20 -DEMBFS_28BIT_LBA -xc++ diff --git a/dev/examples/allocator_system/CMakeLists.txt b/dev/examples/allocator_system/CMakeLists.txt deleted file mode 100644 index ee19842..0000000 --- a/dev/examples/allocator_system/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ - -cmake_minimum_required(VERSION 3.15...3.31) - -project( - Alloc - VERSION 1.0 - LANGUAGES CXX) - -find_package(Boost REQUIRED COMPONENTS container) - -add_executable(Alloc allocator_system.cc) - -target_link_libraries(Alloc PRIVATE Boost::container) - -set_property(TARGET Alloc PROPERTY CXX_STANDARD 20) -target_include_directories(Alloc PUBLIC ../../) diff --git a/dev/examples/allocator_system/allocator_system.cc b/dev/examples/allocator_system/allocator_system.cc deleted file mode 100644 index 6bf1de7..0000000 --- a/dev/examples/allocator_system/allocator_system.cc +++ /dev/null @@ -1,53 +0,0 @@ -/* - * File: allocator_system.cc - * Purpose: Allocator System container. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. Licensed under the BSL 1.0 license - */ - -#include -#include - -class MyClass final -{ -public: - int a{}; - std::string b{}; - - MyClass() : a(0), b("default") - { - std::cout << "MyClass() constructed\n"; - } - - MyClass(int x, std::string y) : a(x), b(std::move(y)) - { - std::cout << "MyClass(int, string) constructed\n"; - } - - ~MyClass() - { - std::cout << "~MyClass() destroyed\n"; - } -}; - -int main() -{ - ocl::standard_allocator_type allocator; - - // Test 1: claim() + unclaim() - std::cout << "=== Test 1: claim/unclaim ===\n"; - - MyClass* raw = allocator.claim(); - - std::cout << "raw->a = " << raw->a << ", raw->b = " << raw->b << "\n"; - allocator.unclaim(raw); // Manual delete - - // Test 2: construct() → shared_ptr - std::cout << "\n=== Test 2: construct (shared_ptr) ===\n"; - - auto ptr = allocator.construct(42, "hello"); - std::cout << "ptr->a = " << ptr->a << ", ptr->b = " << ptr->b << "\n"; - - // `shared_ptr` will automatically delete the object - std::cout << "\n=== End of main ===\n"; -} diff --git a/dev/examples/cgi/CMakeLists.txt b/dev/examples/cgi/CMakeLists.txt deleted file mode 100644 index 9c3cbf6..0000000 --- a/dev/examples/cgi/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ - -cmake_minimum_required(VERSION 3.15...3.31) - -project( - CGI - VERSION 1.0 - LANGUAGES CXX) - -find_package(Boost REQUIRED COMPONENTS container) - -add_executable(CGI cgi.cc) - -target_link_libraries(CGI PRIVATE Boost::container) - -set_property(TARGET CGI PROPERTY CXX_STANDARD 20) -target_include_directories(CGI PUBLIC ../../) diff --git a/dev/examples/cgi/cgi.cc b/dev/examples/cgi/cgi.cc deleted file mode 100644 index 3eef7b2..0000000 --- a/dev/examples/cgi/cgi.cc +++ /dev/null @@ -1,75 +0,0 @@ -/* - cgi example - written by Amlal El Mahrouss. - licensed under the Boost Software License - */ - -#include - -static ocl::basic_chunk_string text_sample = R"( - - - - - Error | OCL - - - -

Uh Oh!

-
No index file was found in this directory.
-
- - - - - - - - - -
Name

Refresh

-
OCL's Common Gateway Server.
- - -)"; - -/* finally test it */ -/* @brief this stub loads a 'index.html' or returns an error message if not found. */ -int main(int argc, char** argv) -{ - ocl::cgi::basic_writer<> writer; - writer << text_sample; - - return 0; -} diff --git a/dev/examples/equiv/CMakeLists.txt b/dev/examples/equiv/CMakeLists.txt deleted file mode 100644 index 8b29e23..0000000 --- a/dev/examples/equiv/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ - -cmake_minimum_required(VERSION 3.15...3.31) - -project( - Equiv - VERSION 1.0 - LANGUAGES CXX) - -add_executable(Equiv equiv.cc) - -set_property(TARGET Equiv PROPERTY CXX_STANDARD 20) -target_include_directories(Equiv PUBLIC ../../) diff --git a/dev/examples/equiv/equiv.cc b/dev/examples/equiv/equiv.cc deleted file mode 100644 index 41128a2..0000000 --- a/dev/examples/equiv/equiv.cc +++ /dev/null @@ -1,19 +0,0 @@ -/* - string checksum example - written by Amlal El Mahrouss. - licensed under the Boost Software License - */ - -#include -#include - -/* finally test it */ -int main(int argc, char** argv) -{ - std::cout << std::boolalpha; - std::cout << ocl::equiv::is_same::value << std::endl; - std::cout << ocl::equiv::is_same::value << std::endl; - std::cout << ocl::equiv::is_same::value << std::endl; - - return 0; -} diff --git a/dev/examples/fix/CMakeLists.txt b/dev/examples/fix/CMakeLists.txt deleted file mode 100644 index 5ed31e7..0000000 --- a/dev/examples/fix/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ - -cmake_minimum_required(VERSION 3.15...3.31) - -project( - Fix - VERSION 1.0 - LANGUAGES CXX) - -find_package(Boost REQUIRED COMPONENTS container) - -add_executable(Fix fix.cc) - -target_link_libraries(Fix PRIVATE Boost::container) -set_property(TARGET Fix PROPERTY CXX_STANDARD 20) -target_include_directories(Fix PUBLIC ../../) diff --git a/dev/examples/fix/fix.cc b/dev/examples/fix/fix.cc deleted file mode 100644 index e09178b..0000000 --- a/dev/examples/fix/fix.cc +++ /dev/null @@ -1,37 +0,0 @@ -/* - fix example - written by Amlal El Mahrouss. - licensed under the Boost Software License - */ - -#include -#include -#include -#include -#include -#include -#include - -/* finally test it */ -int main(int argc, char** argv) -{ - constexpr auto default_fix = "8=FIX.4.2|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=062|"; - - ocl::fix::basic_visitor basic_visitor; - ocl::fix::basic_range_data fix = basic_visitor.visit(default_fix); - - std::cout << "magic=" << fix.magic_ << std::endl; - std::cout << "magic_len=" << fix.magic_len_ << std::endl; - std::cout << "is_valid=" << std::boolalpha << fix.is_valid() << std::endl; - - ocl::basic_error_handler handler; - ocl::fix::must_pass(fix, handler); - - for (auto fields : fix.body_) - { - ocl::io::print("key=", fields.first); - ocl::io::print(", value=", fields.second); - } - - return 0; -} diff --git a/dev/examples/opt/CMakeLists.txt b/dev/examples/opt/CMakeLists.txt deleted file mode 100644 index b63b1de..0000000 --- a/dev/examples/opt/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ - -cmake_minimum_required(VERSION 3.15...3.31) - -project( - Opt - VERSION 1.0 - LANGUAGES CXX) - -add_executable(Opt opt.cc) - -set_property(TARGET Opt PROPERTY CXX_STANDARD 20) -target_include_directories(Opt PUBLIC ../../) diff --git a/dev/examples/opt/opt.cc b/dev/examples/opt/opt.cc deleted file mode 100644 index acd59fd..0000000 --- a/dev/examples/opt/opt.cc +++ /dev/null @@ -1,45 +0,0 @@ -/* - String checksum example - Written by Amlal El Mahrouss. - Licensed under the Boost Software License - */ - -#include -#include -#include -#include - -static const char do_hash(const std::string& in) -{ - int hash = 0; - - for (long index = 0; index < in.size(); ++index) - { - hash += in[index]; - } - - return hash; -} - -static auto do_some(const std::string recv_data, const std::string check_data) -{ - const int hash_to_check = do_hash(check_data); /* here we assume this should match opt_hash */ - const int opt_hash = do_hash(recv_data); /* we assume that the hash is correct */ - - auto opt = ocl::opt(ocl::eval_eq(hash_to_check, opt_hash)); /* do the compute */ - return opt; -} - -/* finally test it */ -int main(int argc, char** argv) -{ - // ... let's assume we fetch data from network... - - ocl::io::println("Testing data..."); - - auto opt = do_some("Ohio", "Ohio"); - opt.expect("Checksum failed, Ohio isn't Ohio!"); - - - return 0; -} diff --git a/dev/examples/tracked_ptr/CMakeLists.txt b/dev/examples/tracked_ptr/CMakeLists.txt deleted file mode 100644 index 9396506..0000000 --- a/dev/examples/tracked_ptr/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ - -cmake_minimum_required(VERSION 3.15...3.31) - -project( - Fix - VERSION 1.0 - LANGUAGES CXX) - -add_executable(TrackedPtr tracked_ptr.cc) - -set_property(TARGET TrackedPtr PROPERTY CXX_STANDARD 20) -target_include_directories(TrackedPtr PUBLIC ../../) diff --git a/dev/examples/tracked_ptr/tracked_ptr.cc b/dev/examples/tracked_ptr/tracked_ptr.cc deleted file mode 100644 index 27d942c..0000000 --- a/dev/examples/tracked_ptr/tracked_ptr.cc +++ /dev/null @@ -1,52 +0,0 @@ -/* - tracked_ptr example - written by Amlal El Mahrouss. - licensed under the Boost Software License - */ - -#include -#include - -static void summon_tracked_ptr() -{ - ocl::memory::tracked_ptr ptr = ocl::memory::make_tracked(42); - std::cout << ptr.data() << "=" << ptr.manager().allocator().allocated_count_ << std::endl; -} - -static void summon_leak_tracked_ptr() -{ - ocl::memory::tracked_ptr* ptr = new ocl::memory::tracked_ptr(42); - std::cout << ptr->data() << "=" << ptr->manager().allocator().allocated_count_ << std::endl; -} - -/* finally test it */ -int main(int argc, char** argv) -{ - summon_tracked_ptr(); - summon_tracked_ptr(); - summon_tracked_ptr(); - summon_tracked_ptr(); - - ocl::memory::tracked_ptr ptr; - - std::cout << ptr.data() << "=" << ptr.manager().allocator().allocated_count_ << std::endl; - - std::cout << "total=" << ptr.manager().allocator().deallocated_count_ << std::endl; - std::cout << "leak-detected=" << std::boolalpha << (ptr.manager().allocator().allocated_count_ > ptr.manager().allocator().deallocated_count_) << std::endl; - - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - summon_leak_tracked_ptr(); - - std::cout << "total=" << ptr.manager().allocator().deallocated_count_ << std::endl; - std::cout << "leak-detected=" << std::boolalpha << (ptr.manager().allocator().allocated_count_ > ptr.manager().allocator().deallocated_count_) << std::endl; - - ocl::memory::must_pass(ptr); - - return EXIT_SUCCESS; -} diff --git a/dev/lib/core/chunk_string.hpp b/dev/lib/core/chunk_string.hpp deleted file mode 100644 index e32d030..0000000 --- a/dev/lib/core/chunk_string.hpp +++ /dev/null @@ -1,121 +0,0 @@ -/* -* File: core/chunk_string.hpp - * Purpose: String implementation for the OCL C++ library. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss - */ - -#ifndef OCL_UTILITY_CHUNK_STRING_HPP -#define OCL_UTILITY_CHUNK_STRING_HPP - -#include -#include -#include - -namespace ocl -{ - template - class basic_chunk_string; - - template - class basic_chunk_string final - { - private: - char_type packed_chunks_[max_chunk_size] = {0}; - std::size_t chunk_total_{}; - - bool bad_{false}; - - public: - const bool& bad{bad_}; - - basic_chunk_string() = default; - - basic_chunk_string(const char_type* in) - { - this->operator+=(in); - } - - basic_chunk_string(const std::basic_string& in) - { - this->operator+=(in); - } - - ~basic_chunk_string() = default; - - basic_chunk_string& operator=(const basic_chunk_string&) = delete; - basic_chunk_string(const basic_chunk_string&) = delete; - - public: - /// @brief Append a std::basic_string to the chunk string. - basic_chunk_string& operator+=(const char_type* in) - { - if (in == nullptr || bad_) - return *this; - - const auto& sz = std::strlen(in); - - this->operator+=(std::basic_string(in, sz)); - - return *this; - } - - basic_chunk_string& operator+=(const std::basic_string& in) - { - if (in.empty() || bad_) - return *this; - - if (in.size() > max_chunk_size) - { - bad_ = true; - return *this; - } - - if (chunk_total_ > max_chunk_size) - { - bad_ = true; - return *this; - } - - const auto& sz = in.size(); - const static auto size_max_chunk = max_chunk_size; - const auto& ptr = in.data(); - - if (chunk_total_ < size_max_chunk) - { - std::memcpy(packed_chunks_ + chunk_total_, ptr, sz); - chunk_total_ += sz; - } - - return *this; - } - - /// @brief Convert to basic_string or return from cache. - std::basic_string str() const noexcept - { - static std::basic_string ret; - const auto& sz = ret.size(); - - if (chunk_total_ > sz) - ret.clear(); - else - return ret; - - ret = packed_chunks_; - - return ret; - } - - void print() noexcept - { - ocl::io::print(packed_chunks_); - } - }; - - template - inline void print(basic_chunk_string& fmt) noexcept - { - fmt.print(); - } -} // namespace ocl -#endif // ifndef OCL_UTILITY_CHUNK_STRING_HPP diff --git a/dev/lib/core/error_handler.hpp b/dev/lib/core/error_handler.hpp deleted file mode 100644 index 832f109..0000000 --- a/dev/lib/core/error_handler.hpp +++ /dev/null @@ -1,47 +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&) = delete; - basic_error_handler(const basic_error_handler&) = delete; - - 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 standard_error_handler = basic_error_handler; - using error_handler_type = basic_error_handler; -} // namespace ocl - -#endif // ifndef _OCL_ERROR_HANDLER_HPP diff --git a/dev/lib/core/includes.hpp b/dev/lib/core/includes.hpp deleted file mode 100644 index a1c6e86..0000000 --- a/dev/lib/core/includes.hpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - * File: core/includes.hpp - * Purpose: Core includes for the OCL library. - * 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 - -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/dev/lib/except/error.hpp b/dev/lib/except/error.hpp deleted file mode 100644 index b00a32b..0000000 --- a/dev/lib/except/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/dev/lib/fix/fix.hpp b/dev/lib/fix/fix.hpp deleted file mode 100644 index 0c6685d..0000000 --- a/dev/lib/fix/fix.hpp +++ /dev/null @@ -1,211 +0,0 @@ -/* - * File: fix/fix.hpp - * Purpose: Financial Information Exchange parser in C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#ifndef _OCL_FIX_PARSER_HPP -#define _OCL_FIX_PARSER_HPP - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace ocl::fix -{ - template - class basic_visitor; - - template - struct basic_range; - - template - class basic_range_data; - - /// @brief Buffer+Length structure - template - using range_ptr_t = basic_range; - - namespace detail - { - template - const char_type* begin_fix() noexcept; - - template <> - inline const char* begin_fix() noexcept - { - return "FIX.4.2"; - } - - template <> - inline const char16_t* begin_fix() noexcept - { - return u"FIX.4.2"; - } - - template <> - inline const char8_t* begin_fix() noexcept - { - return u8"FIX.4.2"; - } - } // namespace detail - - template - struct basic_range final - { - char_type* bytes_{nullptr}; - size_t length_{}; - - bool is_valid() noexcept - { - return this->bytes_ && this->length_ > 0; - } - - explicit operator bool() - { - return this->is_valid(); - } - }; - - /// @brief Convert basic_range to usable string. - /// @note This function assumes that the basic_range is valid and contains ASCII bytes. - template - inline std::basic_string to_string(basic_range& basic_range) noexcept - { - if (basic_range.length_ < 0) - return std::basic_string{}; - - return std::basic_string(basic_range.ascii_bytes_, basic_range.length_); - } - - /// @brief a basic_range object containing the FIX packet values. - template - class basic_range_data final - { - public: - std::size_t magic_len_{}; - std::basic_string magic_{}; - std::size_t body_len_{}; - std::vector, std::basic_string>> body_{}; - - static inline const char_type* begin = detail::begin_fix(); - - explicit 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; - - std::basic_string operator[](const std::basic_string& key) - { - if (key.empty()) - { - return std::basic_string{}; - } - - for (const auto& pair : this->body_) - { - if (pair.first == key) - { - return pair.second; - } - } - - return std::basic_string{}; - } - - bool is_valid() - { - return magic_.starts_with(basic_range_data::begin); - } - - explicit operator bool() - { - return this->is_valid(); - } - }; - - /// @brief basic_visitor object which returns a fix::basic_range_data instance. - template - class basic_visitor final - { - public: - static constexpr const char_type soh = '|'; - static constexpr const char_type eq = '='; - static constexpr uint32_t base = 10U; - - explicit basic_visitor() = default; - ~basic_visitor() = default; - - basic_visitor& operator=(const basic_visitor&) = default; - basic_visitor(const basic_visitor&) = default; - - basic_range operator()(const std::basic_string& in) - { - return this->visit(in); - } - - /// @brief Visit a FIX message and parse it into a basic_range_data object. - /// @param in The input FIX message as a string. - /// @warning This function may throw exceptions. - basic_range_data visit(const std::basic_string& in) - { - thread_local basic_range_data ret{}; - - if (in.empty()) - return ret; - - std::basic_string in_tmp{"", in.size()}; - - for (auto& ch : in) - { - if (ch != basic_visitor::soh) - { - in_tmp += ch; - continue; - } - - std::basic_string key = in_tmp.substr(0, in_tmp.find(basic_visitor::eq)); - std::basic_string val = in_tmp.substr(in_tmp.find(basic_visitor::eq) + 1); - - if (ret.magic_.empty()) - { - ret.magic_ = val; - ret.magic_len_ = ret.magic_.size(); - } - else - { - ret.body_.emplace_back(std::make_pair(key, val)); - ret.body_len_ += in_tmp.size(); - } - - in_tmp.clear(); - } - - in_tmp.clear(); - return ret; - } - }; - - template - inline void must_pass(basic_range_data& basic_range, error_handler& handler) - { - if (!basic_range.is_valid()) - { - handler.template error("Invalid FIX Message."); - } - } - - using fix_tag_type = std::uint32_t; - - using range_data = basic_range_data; - using visitor = basic_visitor; -} // namespace ocl::fix - -#endif // ifndef _OCL_FIX_PARSER_HPP \ No newline at end of file diff --git a/dev/lib/io/print.hpp b/dev/lib/io/print.hpp deleted file mode 100644 index c710156..0000000 --- a/dev/lib/io/print.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * File: print.hpp - * Purpose: OCL Print library - * Author: Amlal El Mahrouss. (amlal@nekernel.org) - * Copyright 2025 - */ - -#ifndef _OCL_PRINT_HPP -#define _OCL_PRINT_HPP - -#include - -namespace ocl::io -{ - template - inline void print(T fmt) noexcept - { - std::cout << fmt; - } - - inline void print() noexcept - { - } - - template - inline void print(Args... fmt) noexcept - { - print(fmt...); - print(); - } - - template - inline void print(T fmt, Args... other) noexcept - { - std::cout << fmt; - print(other...); - } - - template - inline void println(T... fmt) noexcept - { - print(fmt...); - print("\n"); - } -} // namespace ocl::io - -#endif // ifndef _OCL_PRINT_HPP diff --git a/dev/lib/logic/equiv.hpp b/dev/lib/logic/equiv.hpp deleted file mode 100644 index 1bdb6d9..0000000 --- a/dev/lib/logic/equiv.hpp +++ /dev/null @@ -1,104 +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 - -/// @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/dev/lib/logic/math.hpp b/dev/lib/logic/math.hpp deleted file mode 100644 index d131ef9..0000000 --- a/dev/lib/logic/math.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * File: math.hpp - * Purpose: Mathematics c++ header. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. - */ - -#pragma once - -namespace ocl -{ - template <__SIZE_TYPE__ T> - struct is_non_boolean_integer final - { - static constexpr const bool value = true; - }; - - template <> - struct is_non_boolean_integer final - { - static constexpr const bool value = false; - }; - - template <> - struct is_non_boolean_integer final - { - static constexpr const bool value = false; - }; - - constexpr inline auto not_a_number = __builtin_nanf(""); - constexpr inline auto positive_infinity = __builtin_inff(); - constexpr inline auto negative_infinity = -positive_infinity; -} // namespace ocl \ No newline at end of file diff --git a/dev/lib/logic/opt.hpp b/dev/lib/logic/opt.hpp deleted file mode 100644 index 07a3227..0000000 --- a/dev/lib/logic/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/dev/lib/memory/allocator_system.hpp b/dev/lib/memory/allocator_system.hpp deleted file mode 100644 index 0fe7af3..0000000 --- a/dev/lib/memory/allocator_system.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * File: core/allocator_system.hpp - * Purpose: Allocator System container. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. Licensed under the BSL 1.0 license - */ - -#ifndef _OCL_ALLOCATOR_SYSTEM_HPP -#define _OCL_ALLOCATOR_SYSTEM_HPP - -#include -#include - -namespace ocl -{ - template - struct new_op final - { - inline auto operator()() -> type* - { - return new type; - } - - template - inline auto var_alloc(var_type... args) -> type* - { - return new type{args...}; - } - }; - - template - struct delete_op final - { - inline auto operator()(type* t) -> void - { - delete t; - } - }; - - template - class allocator_system - { - allocator_new m_alloc_{}; - allocator_delete m_free_{}; - - public: - allocator_system() = default; - ~allocator_system() = default; - - allocator_system& operator=(const allocator_system&) = delete; - allocator_system(const allocator_system&) = delete; - - ret_type* claim() noexcept - { - return m_alloc_(); - } - - template - auto construct(var_type... args) -> std::shared_ptr - { - return std::shared_ptr(m_alloc_.template var_alloc(args...), allocator_delete{}); - } - - void unclaim(ret_type* ptr) - { - m_free_(ptr); - } - }; - - template - using standard_allocator_type = allocator_system, delete_op>; -} // namespace ocl - -#endif // ifndef _OCL_ALLOCATOR_SYSTEM_HPP \ No newline at end of file diff --git a/dev/lib/memory/tracked_ptr.hpp b/dev/lib/memory/tracked_ptr.hpp deleted file mode 100644 index 2df5db5..0000000 --- a/dev/lib/memory/tracked_ptr.hpp +++ /dev/null @@ -1,235 +0,0 @@ -/* - * File: memory/tracked_ptr.hpp - * Purpose: Custom smart pointer implementation in 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 - -namespace ocl::memory -{ - template - class tracked_allocator; - - template - class tracked_mgr; - - template - class tracked_ptr; - - template - class tracked_allocator - { - public: - std::atomic allocated_count_ = 0; - std::atomic deallocated_count_ = 0; - - public: - explicit tracked_allocator() = default; - virtual ~tracked_allocator() = default; - - tracked_allocator& operator=(const tracked_allocator&) = default; - tracked_allocator(const tracked_allocator&) = default; - - public: - template - void retain(T*& ptr, U&&... args) - { - ptr = new T(std::forward(args)...); - - if (ptr) - { - ++allocated_count_; - return; - } - - throw std::bad_alloc(); - } - - template - void must_retain(T*& ptr, U&&... args) noexcept - { - this->retain(ptr, args...); - } - - void dispose(T*& ptr) noexcept - { - if (ptr) - { - if (allocated_count_) - --allocated_count_; - - ++deallocated_count_; - - delete ptr; - ptr = nullptr; - } - } - }; - - template - class tracked_mgr - { - private: - tracked_allocator allocator_; - - public: - explicit tracked_mgr() = default; - virtual ~tracked_mgr() = default; - - tracked_mgr& operator=(const tracked_mgr&) = default; - tracked_mgr(const tracked_mgr&) = default; - - public: - const tracked_allocator& allocator() noexcept - { - return allocator_; - } - - template - T* retain(U&&... args) - { - T* ptr = nullptr; - allocator_.retain(ptr, std::forward(args)...); - - return ptr; - } - - template - T* must_retain(U&&... args) noexcept - { - return this->retain(std::forward(args)...); - } - - void dispose(T*& ptr) noexcept - { - allocator_.dispose(ptr); - } - }; - - template > - class tracked_ptr - { - public: - static Mgr& manager() noexcept - { - static Mgr mgr; - return mgr; - } - - public: - template - tracked_ptr(U&&... args) - : ptr_(nullptr) - { - ptr_ = tracked_ptr::manager().retain(std::forward(args)...); - } - - virtual ~tracked_ptr() noexcept - { - this->reset(); - } - - tracked_ptr(const tracked_ptr&) = delete; - tracked_ptr& operator=(const tracked_ptr&) = delete; - - public: - void reset() - { - if (ptr_) - { - tracked_ptr::manager().dispose(ptr_); - } - } - - T* get() const - { - return ptr_; - } - - T* data() - { - return ptr_; - } - - T& operator*() const - { - return *ptr_; - } - - T* operator->() const - { - return ptr_; - } - - explicit operator bool() const - { - return ptr_ != nullptr; - } - - void swap(tracked_ptr& other) - { - std::swap(ptr_, other.ptr_); - } - - public: - tracked_ptr(tracked_ptr&& other) noexcept - : ptr_(other.ptr_) - { - other.ptr_ = nullptr; - } - - tracked_ptr& operator=(tracked_ptr&& other) noexcept - { - if (this != &other) - { - this->reset(); - ptr_ = other.ptr_; - other.ptr_ = nullptr; - } - - return *this; - } - - private: - T* ptr_{nullptr}; - }; - - template - inline auto make_tracked() -> tracked_ptr - { - return tracked_ptr(); - } - - template - inline auto make_tracked(T&&... arg) -> tracked_ptr - { - return tracked_ptr(std::forward(arg)...); - } - - template - inline void swap(tracked_ptr& a, tracked_ptr& b) - { - a.swap(b); - } - - /// @brief a Must Pass function is a standard way to verify a container' validity, inspired from NeKernel/VMKernel. - template - inline void must_pass(tracked_ptr& ptr, error_handler handler) - { - if (ptr.manager().allocator().allocated_count_ < ptr.manager().allocator().deallocated_count_) - { - handler.template error("Invalid TrackedPtr detected: Deallocated count exceeds allocated count."); - } - } -} // namespace ocl::memory diff --git a/dev/lib/net/modem.hpp b/dev/lib/net/modem.hpp deleted file mode 100644 index d86234b..0000000 --- a/dev/lib/net/modem.hpp +++ /dev/null @@ -1,167 +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 - -#define OCL_MODEM_INTERFACE : public ocl::net::modem - -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; - - private: - socket_type fd_{}; - bool server_fd_{false}; - bool bad_{true}; - - public: - const bool& 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->server_fd_) - 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); - server_fd_ = 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/dev/lib/net/url.hpp b/dev/lib/net/url.hpp deleted file mode 100644 index 60440ad..0000000 --- a/dev/lib/net/url.hpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * File: net/url.hpp - * Purpose: URL container 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 - -/// @author Amlal El Mahrouss (amlal@nekernel.org) -/// @brief Parse URLs (in a non-standard way). - -namespace ocl::net -{ - template - class basic_url; - - enum class url_protocol - { - invalid = 0, - http, - https, - mailto, - ftp, - tel, - bad = 0xff, - }; - - /// @brief Basic URL parser container. - template - class basic_url final - { - url_protocol m_protocol_{url_protocol::invalid}; - std::basic_stringstream m_ss_{}; - std::basic_string m_port_{""}; - - public: - explicit basic_url(const std::basic_string& protocol) - { - if (protocol.starts_with("https://")) - { - m_protocol_ = url_protocol::https; - this->operator/=(protocol.substr(std::size("https://"))); - } - else if (protocol.starts_with("http://")) - { - m_protocol_ = url_protocol::http; - this->operator/=(protocol.substr(std::size("http://"))); - } - else if (protocol.starts_with("mailto:")) - { - m_protocol_ = url_protocol::mailto; - this->operator/=(protocol.substr(std::size("mailto:"))); - } - else if (protocol.starts_with("tel:")) - { - m_protocol_ = url_protocol::tel; - this->operator/=(protocol.substr(std::size("tel:"))); - } - else if (protocol.starts_with("ftp:")) - { - m_protocol_ = url_protocol::ftp; - this->operator/=(protocol.substr(std::size("ftp:"))); - } - } - - ~basic_url() = default; - - basic_url& operator=(const basic_url&) = default; - basic_url(const basic_url&) = default; - - private: - basic_url& operator/=(const std::basic_string& in) - { - if (in.empty()) - return *this; - - if (in.starts_with(":")) - { - m_port_ = in.substr(1); - return *this; - } - - m_ss_ += in; - return *this; - } - - basic_url& operator/=(const char_type& in) - { - m_ss_ += in; - return *this; - } - - explicit operator bool() - { - return this->is_valid(); - } - - public: - auto protocol() const noexcept - { - return this->m_protocol_; - } - - auto port() const noexcept - { - return this->m_port_; - } - - auto is_valid() const noexcept - { - return m_ss_.size() > 0 && this->m_protocol_ != url_protocol::bad || this->m_protocol_ != url_protocol::invalid; - } - }; - - using url = basic_url; -} // namespace ocl::net diff --git a/dev/lib/simd/basic_simd.hpp b/dev/lib/simd/basic_simd.hpp deleted file mode 100644 index 975ab2b..0000000 --- a/dev/lib/simd/basic_simd.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * File: simd/basic_simd.hpp - * Purpose: Basic SIMD backend C++ library. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the BSL 1.0 license. - */ - -#pragma once - -#include - -#ifdef __x86_64__ -#include -using simd_type = __m256; -#endif - -#ifdef __aarch64__ -#include -using simd_type = float32x4_t; -#endif - -namespace ocl::simd -{ - struct basic_simd final - { - struct simd_traits final - { - simd_type __val; - - private: - static bool bad; - friend class basic_simd; - }; - - using register_type = simd_traits; - - const bool& is_bad() noexcept - { - return register_type::bad; - } - - std::basic_string isa() - { - return "basic_simd"; - } - }; -} // namespace ocl::simd diff --git a/dev/lib/simd/simd.hpp b/dev/lib/simd/simd.hpp deleted file mode 100644 index f15f88a..0000000 --- a/dev/lib/simd/simd.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - * File: simd/simd.hpp - * Purpose: SIMD C++ library. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the BSL 1.0 license. - */ - -#pragma once - -#include - -/// @author Amlal El Mahrouss -/// @brief Basic SIMD processor. - -namespace ocl::simd -{ - template - class real_type - { - private: - backend_type backend_; - - enum opcode - { - bad = 0, - add, - mul, - div, - invalid = 0xfff, - }; - - public: - real_type() = default; - virtual ~real_type() = default; - - real_type& operator=(const real_type&) = delete; - real_type(const real_type&) = delete; - - typename backend_type::register_type& call(const opcode& op, typename backend_type::register_type& lhs, typename backend_type::register_type& rhs) - { - switch (op) - { - case add: - return backend_.add(lhs, rhs); - case mul: - return backend_.mul(lhs, rhs); - case div: - return backend_.div(lhs, rhs); - default: - break; - } - - return backend_.is_bad(); - } - - std::basic_string isa() - { - return backend_.isa(); - } - }; -} // namespace ocl::simd diff --git a/dev/lib/tests/gtest.hpp b/dev/lib/tests/gtest.hpp deleted file mode 100644 index ee328b0..0000000 --- a/dev/lib/tests/gtest.hpp +++ /dev/null @@ -1,10 +0,0 @@ -/* - * File: tests/gtest.hpp - * Purpose: Google Test wrapper for the OCL library. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#pragma once - -#include diff --git a/dev/lib/tests/hpptest.hpp b/dev/lib/tests/hpptest.hpp deleted file mode 100644 index a3136b7..0000000 --- a/dev/lib/tests/hpptest.hpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - * File: tests/hpptest.hpp - * Purpose: HPP Test wrapper for the OCL library. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#pragma once - -#include -#include - -namespace ocl::hpptest -{ - /// @brief Standard termination error handler, called when a test fails. - struct standard_terminate final - { - template - static void error() noexcept - { - ocl::io::print("standard_terminate::error, terminating...\n"); - - if (stop_execution) - std::terminate(); - } - }; - - struct posix_terminate final - { - template - static void error(errno_t err) noexcept - { - ocl::io::print("posix_terminate::error: expected=", strerror(args), ", got=", strerror(err), "\n"); - - if (stop_execution) - std::terminate(); - } - }; - - typedef bool condition_type; - - template - consteval inline void must_pass() - { -#ifdef OCL_HPPTEST - OCL_HPPTEST_ASSERT(expr); -#endif // _WIN32 - } - - template - inline void must_pass(condition_type cond) noexcept - { - if (cond != expect) - { - on_fail::template error(); - } - } - - template - inline void must_pass(errno_t ern) noexcept - { - if (ern != expect) - { - posix_terminate::error(ern); - } - } - -#ifdef _WIN32 - struct win32_terminate final - { - template - static void error(HRESULT err) noexcept - { - ocl::io::print("win32_terminate::error: expected=S_OK, got=", err, "\n"); - - if (stop_execution) - std::terminate(); - } - }; - - template - inline void must_pass(HRESULT hr) noexcept - { - if (hr != expect) - { - win32_terminate::error(hr); - } - } -#endif // _WIN32 -} // namespace ocl::hpptest diff --git a/dev/lib/utility/cgi.hpp b/dev/lib/utility/cgi.hpp deleted file mode 100644 index 4cc913b..0000000 --- a/dev/lib/utility/cgi.hpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * File: cgi.hpp - * Author: Amlal El Mahrouss, - * Copyright 2023-2025, Amlal El Mahrouss, Licensed under the Boost Software License. - */ - -#ifndef _OCL_CGI_HPP -#define _OCL_CGI_HPP - -#include -#include -#include -#include - -namespace ocl -{ - namespace cgi - { - /// @brief CGI Writer class, writes to stdout; as CGI expects. - template - class basic_writer - { - private: - basic_writer& eval_(const basic_chunk_string& mime, const basic_chunk_string& ss) noexcept - { - std::basic_stringstream ss_out; - - ss_out << std::format("Content-Type: {}\r\n", mime.str()); - ss_out << std::format("Server: {}\r\n", "OCL/1.0"); - ss_out << std::format("Content-Length: {}\r\n\r\n", ss.str().size()); - ss_out << ss.str(); - - io::print(ss_out.str()); - - return *this; - } - - public: - explicit basic_writer() = default; - virtual ~basic_writer() = default; - - basic_writer& operator=(const basic_writer&) = default; - basic_writer(const basic_writer&) = default; - - public: - friend void operator<<(basic_writer& self, const basic_chunk_string& ss_in) - { - self = self.eval_("text/plain", ss_in); - } - - basic_writer& binary(const basic_chunk_string& ss_in) - { - return this->eval_("application/octet-stream", ss_in); - } - - basic_writer& html(const basic_chunk_string& ss_in) - { - return this->eval_("text/html", ss_in); - } - - basic_writer& xml(const basic_chunk_string& ss_in) - { - return this->eval_("application/xml", ss_in); - } - - basic_writer& json(const basic_chunk_string& ss_in) - { - return this->eval_("application/json", ss_in); - } - - basic_writer& js(const basic_chunk_string& ss_in) - { - return this->eval_("text/javascript", ss_in); - } - }; - } // namespace cgi -} // namespace ocl - -#endif // ifndef _OCL_CGI_HPP diff --git a/dev/lib/utility/crc32.hpp b/dev/lib/utility/crc32.hpp deleted file mode 100644 index 2bcab29..0000000 --- a/dev/lib/utility/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/dev/lib/utility/embfs.hpp b/dev/lib/utility/embfs.hpp deleted file mode 100644 index 8a716ce..0000000 --- a/dev/lib/utility/embfs.hpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * File: embfs.hpp - * Purpose: Embedded File System. - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. - */ - -#ifndef _OCL_EMBFS_HPP -#define _OCL_EMBFS_HPP - -#include -#include - -/// @brief A filesystem designed for tiny storage medias. -/// @author Amlal EL Mahrouss (amlal@nekernel.org) - -namespace ocl::embfs -{ - namespace traits - { - struct embfs_superblock; - struct embfs_inode; - - inline constexpr const size_t _superblock_name_len = 16; - inline constexpr const size_t _superblock_reserve_len = 462; - - inline constexpr const size_t _inode_name_len = 128; - inline constexpr const size_t _inode_arr_len = 12; - inline constexpr const size_t _inode_lookup_len = 8; - -#if defined(EMBFS_28BIT_LBA) - typedef std::uint32_t lba_t; -#elif defined(EMBFS_48BIT_LBA) - typedef std::uint64_t lba_t; -#else - typedef std::uint32_t lba_t; -#endif - - typedef std::int16_t sword_t; - - typedef std::int32_t sdword_t; - - typedef std::uint8_t utf8_char_t; - - /// @brief Superblock data structure - struct embfs_superblock - { - sword_t s_block_mag; - sdword_t s_num_inodes; - sdword_t s_part_size; - sdword_t s_part_used; - sdword_t s_version; - sword_t s_sector_sz; - lba_t s_inode_start; - lba_t s_inode_end; - utf8_char_t s_name[_superblock_name_len]; - utf8_char_t s_reserved[_superblock_reserve_len]; - }; - - /// @brief Indexed node structure. - /// @brief i_name file name - /// @brief i_size_virt, i_size_phys: virtual and physical (sector count) size. - /// @brief i_offset direct block pointer. - /// @brief i_checksum crc32 checksum. - /// @brief i_flags_perms flags and permissions - /// @brief i_acl_* ACL to keep track of inode allocation status. - struct embfs_inode - { - utf8_char_t i_name[_inode_name_len]; - sword_t i_size_virt, i_size_phys; - lba_t i_offset[_inode_lookup_len]; - sword_t i_checksum, i_flags_perms; - lba_t i_acl_creat, i_acl_edit, i_acl_delet; - }; - - /// @brief Indexed node linear array. - typedef embfs_inode embfs_inode_arr_t[_inode_arr_len]; - } // namespace traits -} // namespace ocl::embfs - -#endif // ifndef _OCL_EMBFS_HPP \ No newline at end of file diff --git a/dev/tests/.gitkeep b/dev/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/dev/tests/chunk_string/CMakeLists.txt b/dev/tests/chunk_string/CMakeLists.txt deleted file mode 100644 index 89d0e4d..0000000 --- a/dev/tests/chunk_string/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -cmake_minimum_required(VERSION 3.27) -project(BasicChunkUsage LANGUAGES CXX) - -# find_package(Boost REQUIRED COMPONENTS container) - -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip -) - -# For Windows: Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) - -enable_testing() - -add_executable(BasicChunkUsage chunk_test.cc) -target_link_libraries(BasicChunkUsage PRIVATE gtest_main) - -set_property(TARGET BasicChunkUsage PROPERTY CXX_STANDARD 20) -target_include_directories(BasicChunkUsage PUBLIC ../../) - -include(GoogleTest) -gtest_discover_tests(BasicChunkUsage) diff --git a/dev/tests/chunk_string/chunk_test.cc b/dev/tests/chunk_string/chunk_test.cc deleted file mode 100644 index 3498fa8..0000000 --- a/dev/tests/chunk_string/chunk_test.cc +++ /dev/null @@ -1,31 +0,0 @@ -/* - * File: tests/chunk_test.cc - * Purpose: Chunk unit tests in C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#include -#include -#include - -TEST(ChunkTest, BasicChunkUsage) -{ - const char* test_string = "HELLO, WORLD!\r\n"; - const auto iterations = 1024000; - const auto limit = 30; - - auto start = std::chrono::high_resolution_clock::now(); - - ocl::basic_chunk_string optimized; - - for (unsigned i = 0; i < iterations; ++i) - { - optimized += test_string; - } - - auto end = std::chrono::high_resolution_clock::now(); - auto optimized_time = std::chrono::duration_cast(end - start); - - EXPECT_TRUE(optimized_time.count() < 100U); -} diff --git a/dev/tests/fix_basic/CMakeLists.txt b/dev/tests/fix_basic/CMakeLists.txt deleted file mode 100644 index 7b06112..0000000 --- a/dev/tests/fix_basic/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(FIXTestBasic) - -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip -) - -# For Windows: Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) - -enable_testing() - -add_executable(FIXTestBasic fix_test.cc) -target_link_libraries(FIXTestBasic gtest_main) - -set_property(TARGET FIXTestBasic PROPERTY CXX_STANDARD 20) -target_include_directories(FIXTestBasic PUBLIC ../../) - -include(GoogleTest) -gtest_discover_tests(FIXTestBasic) diff --git a/dev/tests/fix_basic/fix_test.cc b/dev/tests/fix_basic/fix_test.cc deleted file mode 100644 index 9055803..0000000 --- a/dev/tests/fix_basic/fix_test.cc +++ /dev/null @@ -1,21 +0,0 @@ -/* - * File: tests/tracked_ptr_test.cc - * Purpose: Custom smart pointer unit tests in C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#include -#include -#include - -TEST(FIXTest, BasicFIXUsage) -{ - ocl::fix::basic_visitor basic_visitor; - ocl::fix::basic_range_data fix = basic_visitor.visit("8=FIX.4.2|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=062|"); - - ocl::hpptest::must_pass(EPERM); - - EXPECT_EQ(fix.magic_, ocl::fix::detail::begin_fix()); - EXPECT_TRUE(fix.is_valid()); -} diff --git a/dev/tests/network_basic/CMakeLists.txt b/dev/tests/network_basic/CMakeLists.txt deleted file mode 100644 index 4cfe0d1..0000000 --- a/dev/tests/network_basic/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 3.27) -project(NetworkTestBasic LANGUAGES CXX) - -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip -) - -# For Windows: Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) - -enable_testing() - -add_executable(NetworkTestBasic net_test.cc) -target_link_libraries(NetworkTestBasic gtest_main) - -set_property(TARGET NetworkTestBasic PROPERTY CXX_STANDARD 20) -target_include_directories(NetworkTestBasic PUBLIC ../../) - -include(GoogleTest) -gtest_discover_tests(NetworkTestBasic) diff --git a/dev/tests/network_basic/net_test.cc b/dev/tests/network_basic/net_test.cc deleted file mode 100644 index a40ca5d..0000000 --- a/dev/tests/network_basic/net_test.cc +++ /dev/null @@ -1,22 +0,0 @@ -/* - * File: tests/net_test.cc - * Purpose: Network unit tests in C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#include -#include -#include -#include - -TEST(NetworkTest, BasicNetworkUsage) -{ - ocl::net::modem modem; - modem.construct(ocl::net::modem::local_address_ip4, true); - - EXPECT_TRUE(modem.is_valid()); - - std::basic_string buf_dst = "HELLO, NET!"; - EXPECT_TRUE(modem.transmit(buf_dst)); -} diff --git a/dev/tests/tracked_ptr_basic/CMakeLists.txt b/dev/tests/tracked_ptr_basic/CMakeLists.txt deleted file mode 100644 index 1dd5095..0000000 --- a/dev/tests/tracked_ptr_basic/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(TrackedPtrTestBasic) - -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip -) - -# For Windows: Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) - -enable_testing() - -add_executable(TrackedPtrTestBasic tracked_ptr_test.cc) -target_link_libraries(TrackedPtrTestBasic gtest_main) - -set_property(TARGET TrackedPtrTestBasic PROPERTY CXX_STANDARD 20) -target_include_directories(TrackedPtrTestBasic PUBLIC ../../) - -include(GoogleTest) -gtest_discover_tests(TrackedPtrTestBasic) diff --git a/dev/tests/tracked_ptr_basic/tracked_ptr_test.cc b/dev/tests/tracked_ptr_basic/tracked_ptr_test.cc deleted file mode 100644 index ec3c51f..0000000 --- a/dev/tests/tracked_ptr_basic/tracked_ptr_test.cc +++ /dev/null @@ -1,25 +0,0 @@ -/* - * File: tests/tracked_ptr_test.cc - * Purpose: Custom smart pointer unit tests in C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#include -#include - -TEST(TrackedPtrTest, BasicTrackedPtrUsage) -{ - ocl::memory::tracked_ptr ptr = ocl::memory::make_tracked(42); - - ASSERT_TRUE(ptr); - EXPECT_EQ(*ptr, 42); - - ocl::memory::tracked_ptr ptr2; - - ocl::memory::swap(ptr, ptr2); - - ptr2.reset(); - - EXPECT_EQ(ocl::memory::tracked_ptr::manager().allocator().allocated_count_, 1); -} \ No newline at end of file diff --git a/dev/tests/tracked_ptr_leak/CMakeLists.txt b/dev/tests/tracked_ptr_leak/CMakeLists.txt deleted file mode 100644 index 30c91a1..0000000 --- a/dev/tests/tracked_ptr_leak/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(TrackedPtrTestLeak) - -include(FetchContent) -FetchContent_Declare( - googletest - URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip -) - -# For Windows: Prevent overriding the parent project's compiler/linker settings -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(googletest) - -enable_testing() - -add_executable(TrackedPtrTestLeak tracked_ptr_test.cc) -target_link_libraries(TrackedPtrTestLeak gtest_main) - -set_property(TARGET TrackedPtrTestLeak PROPERTY CXX_STANDARD 20) -target_include_directories(TrackedPtrTestLeak PUBLIC ../../) - -include(GoogleTest) -gtest_discover_tests(TrackedPtrTestLeak) diff --git a/dev/tests/tracked_ptr_leak/tracked_ptr_test.cc b/dev/tests/tracked_ptr_leak/tracked_ptr_test.cc deleted file mode 100644 index 8ca6615..0000000 --- a/dev/tests/tracked_ptr_leak/tracked_ptr_test.cc +++ /dev/null @@ -1,19 +0,0 @@ -/* - * File: tests/tracked_ptr_test.cc - * Purpose: Custom smart pointer unit tests in C++ - * Author: Amlal El Mahrouss (amlal@nekernel.org) - * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. - */ - -#include -#include - -TEST(TrackedPtrTest, LeakTrackedPtrUsage) -{ - ocl::memory::tracked_ptr* ptr = new ocl::memory::tracked_ptr(42); - ocl::memory::tracked_ptr* ptr2 = new ocl::memory::tracked_ptr(42); - ocl::memory::tracked_ptr* ptr3 = new ocl::memory::tracked_ptr(42); - - EXPECT_EQ(ocl::memory::tracked_ptr::manager().allocator().allocated_count_, 3); - ASSERT_TRUE(ocl::memory::tracked_ptr::manager().allocator().deallocated_count_ == 0); -} \ No newline at end of file diff --git a/examples/allocator_system/CMakeLists.txt b/examples/allocator_system/CMakeLists.txt new file mode 100644 index 0000000..a4bb69d --- /dev/null +++ b/examples/allocator_system/CMakeLists.txt @@ -0,0 +1,16 @@ + +cmake_minimum_required(VERSION 3.15...3.31) + +project( + Alloc + VERSION 1.0 + LANGUAGES CXX) + +find_package(Boost REQUIRED COMPONENTS container) + +add_executable(Alloc allocator_system.cc) + +target_link_libraries(Alloc PRIVATE Boost::container) + +set_property(TARGET Alloc PROPERTY CXX_STANDARD 20) +target_include_directories(Alloc PUBLIC ../../include/ocl) diff --git a/examples/allocator_system/allocator_system.cc b/examples/allocator_system/allocator_system.cc new file mode 100644 index 0000000..fd7ae56 --- /dev/null +++ b/examples/allocator_system/allocator_system.cc @@ -0,0 +1,53 @@ +/* + * File: allocator_system.cc + * Purpose: Allocator System container. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. Licensed under the BSL 1.0 license + */ + +#include +#include + +class MyClass final +{ +public: + int a{}; + std::string b{}; + + MyClass() : a(0), b("default") + { + std::cout << "MyClass() constructed\n"; + } + + MyClass(int x, std::string y) : a(x), b(std::move(y)) + { + std::cout << "MyClass(int, string) constructed\n"; + } + + ~MyClass() + { + std::cout << "~MyClass() destroyed\n"; + } +}; + +int main() +{ + ocl::standard_allocator_type allocator; + + // Test 1: claim() + unclaim() + std::cout << "=== Test 1: claim/unclaim ===\n"; + + MyClass* raw = allocator.claim(); + + std::cout << "raw->a = " << raw->a << ", raw->b = " << raw->b << "\n"; + allocator.unclaim(raw); // Manual delete + + // Test 2: construct() → shared_ptr + std::cout << "\n=== Test 2: construct (shared_ptr) ===\n"; + + auto ptr = allocator.construct(42, "hello"); + std::cout << "ptr->a = " << ptr->a << ", ptr->b = " << ptr->b << "\n"; + + // `shared_ptr` will automatically delete the object + std::cout << "\n=== End of main ===\n"; +} diff --git a/examples/cgi/CMakeLists.txt b/examples/cgi/CMakeLists.txt new file mode 100644 index 0000000..e30707c --- /dev/null +++ b/examples/cgi/CMakeLists.txt @@ -0,0 +1,16 @@ + +cmake_minimum_required(VERSION 3.15...3.31) + +project( + CGI + VERSION 1.0 + LANGUAGES CXX) + +find_package(Boost REQUIRED COMPONENTS container) + +add_executable(CGI cgi.cc) + +target_link_libraries(CGI PRIVATE Boost::container) + +set_property(TARGET CGI PROPERTY CXX_STANDARD 20) +target_include_directories(CGI PUBLIC ../../include/ocl) diff --git a/examples/cgi/cgi.cc b/examples/cgi/cgi.cc new file mode 100644 index 0000000..b837433 --- /dev/null +++ b/examples/cgi/cgi.cc @@ -0,0 +1,75 @@ +/* + cgi example + written by Amlal El Mahrouss. + licensed under the Boost Software License + */ + +#include + +static ocl::basic_chunk_string text_sample = R"( + + + + + Error | OCL + + + +

Uh Oh!

+
No index file was found in this directory.
+
+ + + + + + + + + +
Name

Refresh

+
OCL's Common Gateway Server.
+ + +)"; + +/* finally test it */ +/* @brief this stub loads a 'index.html' or returns an error message if not found. */ +int main(int argc, char** argv) +{ + ocl::cgi::basic_writer<> writer; + writer << text_sample; + + return 0; +} diff --git a/examples/equiv/CMakeLists.txt b/examples/equiv/CMakeLists.txt new file mode 100644 index 0000000..4a374ce --- /dev/null +++ b/examples/equiv/CMakeLists.txt @@ -0,0 +1,12 @@ + +cmake_minimum_required(VERSION 3.15...3.31) + +project( + Equiv + VERSION 1.0 + LANGUAGES CXX) + +add_executable(Equiv equiv.cc) + +set_property(TARGET Equiv PROPERTY CXX_STANDARD 20) +target_include_directories(Equiv PUBLIC ../../include/ocl) diff --git a/examples/equiv/equiv.cc b/examples/equiv/equiv.cc new file mode 100644 index 0000000..0c68e21 --- /dev/null +++ b/examples/equiv/equiv.cc @@ -0,0 +1,19 @@ +/* + string checksum example + written by Amlal El Mahrouss. + licensed under the Boost Software License + */ + +#include +#include + +/* finally test it */ +int main(int argc, char** argv) +{ + std::cout << std::boolalpha; + std::cout << ocl::equiv::is_same::value << std::endl; + std::cout << ocl::equiv::is_same::value << std::endl; + std::cout << ocl::equiv::is_same::value << std::endl; + + return 0; +} diff --git a/examples/fix/CMakeLists.txt b/examples/fix/CMakeLists.txt new file mode 100644 index 0000000..4c0a432 --- /dev/null +++ b/examples/fix/CMakeLists.txt @@ -0,0 +1,15 @@ + +cmake_minimum_required(VERSION 3.15...3.31) + +project( + Fix + VERSION 1.0 + LANGUAGES CXX) + +find_package(Boost REQUIRED COMPONENTS container) + +add_executable(Fix fix.cc) + +target_link_libraries(Fix PRIVATE Boost::container) +set_property(TARGET Fix PROPERTY CXX_STANDARD 20) +target_include_directories(Fix PUBLIC ../../include/ocl) diff --git a/examples/fix/fix.cc b/examples/fix/fix.cc new file mode 100644 index 0000000..eabe3ac --- /dev/null +++ b/examples/fix/fix.cc @@ -0,0 +1,37 @@ +/* + fix example + written by Amlal El Mahrouss. + licensed under the Boost Software License + */ + +#include +#include +#include +#include +#include +#include +#include + +/* finally test it */ +int main(int argc, char** argv) +{ + constexpr auto default_fix = "8=FIX.4.2|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=062|"; + + ocl::fix::basic_visitor basic_visitor; + ocl::fix::basic_range_data fix = basic_visitor.visit(default_fix); + + std::cout << "magic=" << fix.magic_ << std::endl; + std::cout << "magic_len=" << fix.magic_len_ << std::endl; + std::cout << "is_valid=" << std::boolalpha << fix.is_valid() << std::endl; + + ocl::basic_error_handler handler; + ocl::fix::must_pass(fix, handler); + + for (auto fields : fix.body_) + { + ocl::io::print("key=", fields.first); + ocl::io::print(", value=", fields.second); + } + + return 0; +} diff --git a/examples/opt/CMakeLists.txt b/examples/opt/CMakeLists.txt new file mode 100644 index 0000000..e537cec --- /dev/null +++ b/examples/opt/CMakeLists.txt @@ -0,0 +1,12 @@ + +cmake_minimum_required(VERSION 3.15...3.31) + +project( + Opt + VERSION 1.0 + LANGUAGES CXX) + +add_executable(Opt opt.cc) + +set_property(TARGET Opt PROPERTY CXX_STANDARD 20) +target_include_directories(Opt PUBLIC ../../include/ocl) diff --git a/examples/opt/opt.cc b/examples/opt/opt.cc new file mode 100644 index 0000000..75abed4 --- /dev/null +++ b/examples/opt/opt.cc @@ -0,0 +1,45 @@ +/* + String checksum example + Written by Amlal El Mahrouss. + Licensed under the Boost Software License + */ + +#include +#include +#include +#include + +static const char do_hash(const std::string& in) +{ + int hash = 0; + + for (long index = 0; index < in.size(); ++index) + { + hash += in[index]; + } + + return hash; +} + +static auto do_some(const std::string recv_data, const std::string check_data) +{ + const int hash_to_check = do_hash(check_data); /* here we assume this should match opt_hash */ + const int opt_hash = do_hash(recv_data); /* we assume that the hash is correct */ + + auto opt = ocl::opt(ocl::eval_eq(hash_to_check, opt_hash)); /* do the compute */ + return opt; +} + +/* finally test it */ +int main(int argc, char** argv) +{ + // ... let's assume we fetch data from network... + + ocl::io::println("Testing data..."); + + auto opt = do_some("Ohio", "Ohio"); + opt.expect("Checksum failed, Ohio isn't Ohio!"); + + + return 0; +} diff --git a/examples/tracked_ptr/CMakeLists.txt b/examples/tracked_ptr/CMakeLists.txt new file mode 100644 index 0000000..ea1312a --- /dev/null +++ b/examples/tracked_ptr/CMakeLists.txt @@ -0,0 +1,12 @@ + +cmake_minimum_required(VERSION 3.15...3.31) + +project( + Fix + VERSION 1.0 + LANGUAGES CXX) + +add_executable(TrackedPtr tracked_ptr.cc) + +set_property(TARGET TrackedPtr PROPERTY CXX_STANDARD 20) +target_include_directories(TrackedPtr PUBLIC ../../include/ocl) diff --git a/examples/tracked_ptr/tracked_ptr.cc b/examples/tracked_ptr/tracked_ptr.cc new file mode 100644 index 0000000..0f7c43d --- /dev/null +++ b/examples/tracked_ptr/tracked_ptr.cc @@ -0,0 +1,52 @@ +/* + tracked_ptr example + written by Amlal El Mahrouss. + licensed under the Boost Software License + */ + +#include +#include + +static void summon_tracked_ptr() +{ + ocl::memory::tracked_ptr ptr = ocl::memory::make_tracked(42); + std::cout << ptr.data() << "=" << ptr.manager().allocator().allocated_count_ << std::endl; +} + +static void summon_leak_tracked_ptr() +{ + ocl::memory::tracked_ptr* ptr = new ocl::memory::tracked_ptr(42); + std::cout << ptr->data() << "=" << ptr->manager().allocator().allocated_count_ << std::endl; +} + +/* finally test it */ +int main(int argc, char** argv) +{ + summon_tracked_ptr(); + summon_tracked_ptr(); + summon_tracked_ptr(); + summon_tracked_ptr(); + + ocl::memory::tracked_ptr ptr; + + std::cout << ptr.data() << "=" << ptr.manager().allocator().allocated_count_ << std::endl; + + std::cout << "total=" << ptr.manager().allocator().deallocated_count_ << std::endl; + std::cout << "leak-detected=" << std::boolalpha << (ptr.manager().allocator().allocated_count_ > ptr.manager().allocator().deallocated_count_) << std::endl; + + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + summon_leak_tracked_ptr(); + + std::cout << "total=" << ptr.manager().allocator().deallocated_count_ << std::endl; + std::cout << "leak-detected=" << std::boolalpha << (ptr.manager().allocator().allocated_count_ > ptr.manager().allocator().deallocated_count_) << std::endl; + + ocl::memory::must_pass(ptr); + + return EXIT_SUCCESS; +} diff --git a/include/ocl/core/chunk_string.hpp b/include/ocl/core/chunk_string.hpp new file mode 100644 index 0000000..1d922de --- /dev/null +++ b/include/ocl/core/chunk_string.hpp @@ -0,0 +1,121 @@ +/* +* File: core/chunk_string.hpp + * Purpose: String implementation for the OCL C++ library. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss + */ + +#ifndef OCL_UTILITY_CHUNK_STRING_HPP +#define OCL_UTILITY_CHUNK_STRING_HPP + +#include +#include +#include + +namespace ocl +{ + template + class basic_chunk_string; + + template + class basic_chunk_string final + { + private: + char_type packed_chunks_[max_chunk_size] = {0}; + std::size_t chunk_total_{}; + + bool bad_{false}; + + public: + const bool& bad{bad_}; + + basic_chunk_string() = default; + + basic_chunk_string(const char_type* in) + { + this->operator+=(in); + } + + basic_chunk_string(const std::basic_string& in) + { + this->operator+=(in); + } + + ~basic_chunk_string() = default; + + basic_chunk_string& operator=(const basic_chunk_string&) = delete; + basic_chunk_string(const basic_chunk_string&) = delete; + + public: + /// @brief Append a std::basic_string to the chunk string. + basic_chunk_string& operator+=(const char_type* in) + { + if (in == nullptr || bad_) + return *this; + + const auto& sz = std::strlen(in); + + this->operator+=(std::basic_string(in, sz)); + + return *this; + } + + basic_chunk_string& operator+=(const std::basic_string& in) + { + if (in.empty() || bad_) + return *this; + + if (in.size() > max_chunk_size) + { + bad_ = true; + return *this; + } + + if (chunk_total_ > max_chunk_size) + { + bad_ = true; + return *this; + } + + const auto& sz = in.size(); + const static auto size_max_chunk = max_chunk_size; + const auto& ptr = in.data(); + + if (chunk_total_ < size_max_chunk) + { + std::memcpy(packed_chunks_ + chunk_total_, ptr, sz); + chunk_total_ += sz; + } + + return *this; + } + + /// @brief Convert to basic_string or return from cache. + std::basic_string str() const noexcept + { + static std::basic_string ret; + const auto& sz = ret.size(); + + if (chunk_total_ > sz) + ret.clear(); + else + return ret; + + ret = packed_chunks_; + + return ret; + } + + void print() noexcept + { + ocl::io::print(packed_chunks_); + } + }; + + template + inline void print(basic_chunk_string& fmt) noexcept + { + fmt.print(); + } +} // namespace ocl +#endif // ifndef OCL_UTILITY_CHUNK_STRING_HPP diff --git a/include/ocl/core/error_handler.hpp b/include/ocl/core/error_handler.hpp new file mode 100644 index 0000000..f761d63 --- /dev/null +++ b/include/ocl/core/error_handler.hpp @@ -0,0 +1,47 @@ +/* +* 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&) = delete; + basic_error_handler(const basic_error_handler&) = delete; + + 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 standard_error_handler = basic_error_handler; + using error_handler_type = basic_error_handler; +} // namespace ocl + +#endif // ifndef _OCL_ERROR_HANDLER_HPP diff --git a/include/ocl/core/includes.hpp b/include/ocl/core/includes.hpp new file mode 100644 index 0000000..9ed8ffb --- /dev/null +++ b/include/ocl/core/includes.hpp @@ -0,0 +1,23 @@ +/* + * File: core/includes.hpp + * Purpose: Core includes of the OCL. + * 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 + +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/except/error.hpp b/include/ocl/except/error.hpp new file mode 100644 index 0000000..cf038f8 --- /dev/null +++ b/include/ocl/except/error.hpp @@ -0,0 +1,21 @@ +/* + * 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/fix/fix.hpp b/include/ocl/fix/fix.hpp new file mode 100644 index 0000000..0c6685d --- /dev/null +++ b/include/ocl/fix/fix.hpp @@ -0,0 +1,211 @@ +/* + * File: fix/fix.hpp + * Purpose: Financial Information Exchange parser in C++ + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#ifndef _OCL_FIX_PARSER_HPP +#define _OCL_FIX_PARSER_HPP + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ocl::fix +{ + template + class basic_visitor; + + template + struct basic_range; + + template + class basic_range_data; + + /// @brief Buffer+Length structure + template + using range_ptr_t = basic_range; + + namespace detail + { + template + const char_type* begin_fix() noexcept; + + template <> + inline const char* begin_fix() noexcept + { + return "FIX.4.2"; + } + + template <> + inline const char16_t* begin_fix() noexcept + { + return u"FIX.4.2"; + } + + template <> + inline const char8_t* begin_fix() noexcept + { + return u8"FIX.4.2"; + } + } // namespace detail + + template + struct basic_range final + { + char_type* bytes_{nullptr}; + size_t length_{}; + + bool is_valid() noexcept + { + return this->bytes_ && this->length_ > 0; + } + + explicit operator bool() + { + return this->is_valid(); + } + }; + + /// @brief Convert basic_range to usable string. + /// @note This function assumes that the basic_range is valid and contains ASCII bytes. + template + inline std::basic_string to_string(basic_range& basic_range) noexcept + { + if (basic_range.length_ < 0) + return std::basic_string{}; + + return std::basic_string(basic_range.ascii_bytes_, basic_range.length_); + } + + /// @brief a basic_range object containing the FIX packet values. + template + class basic_range_data final + { + public: + std::size_t magic_len_{}; + std::basic_string magic_{}; + std::size_t body_len_{}; + std::vector, std::basic_string>> body_{}; + + static inline const char_type* begin = detail::begin_fix(); + + explicit 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; + + std::basic_string operator[](const std::basic_string& key) + { + if (key.empty()) + { + return std::basic_string{}; + } + + for (const auto& pair : this->body_) + { + if (pair.first == key) + { + return pair.second; + } + } + + return std::basic_string{}; + } + + bool is_valid() + { + return magic_.starts_with(basic_range_data::begin); + } + + explicit operator bool() + { + return this->is_valid(); + } + }; + + /// @brief basic_visitor object which returns a fix::basic_range_data instance. + template + class basic_visitor final + { + public: + static constexpr const char_type soh = '|'; + static constexpr const char_type eq = '='; + static constexpr uint32_t base = 10U; + + explicit basic_visitor() = default; + ~basic_visitor() = default; + + basic_visitor& operator=(const basic_visitor&) = default; + basic_visitor(const basic_visitor&) = default; + + basic_range operator()(const std::basic_string& in) + { + return this->visit(in); + } + + /// @brief Visit a FIX message and parse it into a basic_range_data object. + /// @param in The input FIX message as a string. + /// @warning This function may throw exceptions. + basic_range_data visit(const std::basic_string& in) + { + thread_local basic_range_data ret{}; + + if (in.empty()) + return ret; + + std::basic_string in_tmp{"", in.size()}; + + for (auto& ch : in) + { + if (ch != basic_visitor::soh) + { + in_tmp += ch; + continue; + } + + std::basic_string key = in_tmp.substr(0, in_tmp.find(basic_visitor::eq)); + std::basic_string val = in_tmp.substr(in_tmp.find(basic_visitor::eq) + 1); + + if (ret.magic_.empty()) + { + ret.magic_ = val; + ret.magic_len_ = ret.magic_.size(); + } + else + { + ret.body_.emplace_back(std::make_pair(key, val)); + ret.body_len_ += in_tmp.size(); + } + + in_tmp.clear(); + } + + in_tmp.clear(); + return ret; + } + }; + + template + inline void must_pass(basic_range_data& basic_range, error_handler& handler) + { + if (!basic_range.is_valid()) + { + handler.template error("Invalid FIX Message."); + } + } + + using fix_tag_type = std::uint32_t; + + using range_data = basic_range_data; + using visitor = basic_visitor; +} // namespace ocl::fix + +#endif // ifndef _OCL_FIX_PARSER_HPP \ No newline at end of file diff --git a/include/ocl/io/print.hpp b/include/ocl/io/print.hpp new file mode 100644 index 0000000..c710156 --- /dev/null +++ b/include/ocl/io/print.hpp @@ -0,0 +1,47 @@ +/* + * File: print.hpp + * Purpose: OCL Print library + * Author: Amlal El Mahrouss. (amlal@nekernel.org) + * Copyright 2025 + */ + +#ifndef _OCL_PRINT_HPP +#define _OCL_PRINT_HPP + +#include + +namespace ocl::io +{ + template + inline void print(T fmt) noexcept + { + std::cout << fmt; + } + + inline void print() noexcept + { + } + + template + inline void print(Args... fmt) noexcept + { + print(fmt...); + print(); + } + + template + inline void print(T fmt, Args... other) noexcept + { + std::cout << fmt; + print(other...); + } + + template + inline void println(T... fmt) noexcept + { + print(fmt...); + print("\n"); + } +} // namespace ocl::io + +#endif // ifndef _OCL_PRINT_HPP diff --git a/include/ocl/logic/equiv.hpp b/include/ocl/logic/equiv.hpp new file mode 100644 index 0000000..1bdb6d9 --- /dev/null +++ b/include/ocl/logic/equiv.hpp @@ -0,0 +1,104 @@ +/* + * 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 + +/// @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/logic/math.hpp b/include/ocl/logic/math.hpp new file mode 100644 index 0000000..d131ef9 --- /dev/null +++ b/include/ocl/logic/math.hpp @@ -0,0 +1,33 @@ +/* + * File: math.hpp + * Purpose: Mathematics c++ header. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. + */ + +#pragma once + +namespace ocl +{ + template <__SIZE_TYPE__ T> + struct is_non_boolean_integer final + { + static constexpr const bool value = true; + }; + + template <> + struct is_non_boolean_integer final + { + static constexpr const bool value = false; + }; + + template <> + struct is_non_boolean_integer final + { + static constexpr const bool value = false; + }; + + constexpr inline auto not_a_number = __builtin_nanf(""); + constexpr inline auto positive_infinity = __builtin_inff(); + constexpr inline auto negative_infinity = -positive_infinity; +} // namespace ocl \ No newline at end of file diff --git a/include/ocl/logic/opt.hpp b/include/ocl/logic/opt.hpp new file mode 100644 index 0000000..ba76885 --- /dev/null +++ b/include/ocl/logic/opt.hpp @@ -0,0 +1,134 @@ +/* + * 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/memory/allocator_system.hpp b/include/ocl/memory/allocator_system.hpp new file mode 100644 index 0000000..67e3266 --- /dev/null +++ b/include/ocl/memory/allocator_system.hpp @@ -0,0 +1,74 @@ +/* + * File: core/allocator_system.hpp + * Purpose: Allocator System container. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. Licensed under the BSL 1.0 license + */ + +#ifndef _OCL_ALLOCATOR_SYSTEM_HPP +#define _OCL_ALLOCATOR_SYSTEM_HPP + +#include +#include + +namespace ocl +{ + template + struct new_op final + { + inline auto operator()() -> type* + { + return new type; + } + + template + inline auto var_alloc(var_type... args) -> type* + { + return new type{args...}; + } + }; + + template + struct delete_op final + { + inline auto operator()(type* t) -> void + { + delete t; + } + }; + + template + class allocator_system + { + allocator_new m_alloc_{}; + allocator_delete m_free_{}; + + public: + allocator_system() = default; + ~allocator_system() = default; + + allocator_system& operator=(const allocator_system&) = delete; + allocator_system(const allocator_system&) = delete; + + ret_type* claim() noexcept + { + return m_alloc_(); + } + + template + auto construct(var_type... args) -> std::shared_ptr + { + return std::shared_ptr(m_alloc_.template var_alloc(args...), allocator_delete{}); + } + + void unclaim(ret_type* ptr) + { + m_free_(ptr); + } + }; + + template + using standard_allocator_type = allocator_system, delete_op>; +} // namespace ocl + +#endif // ifndef _OCL_ALLOCATOR_SYSTEM_HPP \ No newline at end of file diff --git a/include/ocl/memory/tracked_ptr.hpp b/include/ocl/memory/tracked_ptr.hpp new file mode 100644 index 0000000..fcaf898 --- /dev/null +++ b/include/ocl/memory/tracked_ptr.hpp @@ -0,0 +1,241 @@ +/* + * File: memory/tracked_ptr.hpp + * Purpose: Custom smart pointer implementation in 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 + +namespace ocl::memory +{ + template + class tracked_allocator; + + template + class tracked_mgr; + + template + class tracked_ptr; + + template + class tracked_allocator + { + public: + std::atomic allocated_count_ = 0; + std::atomic deallocated_count_ = 0; + + public: + explicit tracked_allocator() = default; + virtual ~tracked_allocator() = default; + + tracked_allocator& operator=(const tracked_allocator&) = default; + tracked_allocator(const tracked_allocator&) = default; + + public: + using pointer_type = T*; + + template + void retain(pointer_type& ptr, U&&... args) + { + ptr = new T(std::forward(args)...); + + if (ptr) + { + ++allocated_count_; + return; + } + + throw std::bad_alloc(); + } + + template + void must_retain(pointer_type& ptr, U&&... args) noexcept + { + this->retain(ptr, args...); + } + + void dispose(pointer_type& ptr) noexcept + { + if (ptr) + { + if (allocated_count_) + --allocated_count_; + + ++deallocated_count_; + + delete ptr; + ptr = nullptr; + } + } + }; + + template + class tracked_mgr + { + private: + tracked_allocator allocator_; + + public: + explicit tracked_mgr() = default; + virtual ~tracked_mgr() = default; + + tracked_mgr& operator=(const tracked_mgr&) = default; + tracked_mgr(const tracked_mgr&) = default; + + public: + using pointer_type = T*; + + const tracked_allocator& allocator() noexcept + { + return allocator_; + } + + template + pointer_type retain(U&&... args) + { + pointer_type ptr = nullptr; + allocator_.retain(ptr, std::forward(args)...); + + return ptr; + } + + template + pointer_type must_retain(U&&... args) noexcept + { + return this->retain(std::forward(args)...); + } + + void dispose(pointer_type& ptr) noexcept + { + allocator_.dispose(ptr); + } + }; + + template > + class tracked_ptr + { + public: + static Mgr& manager() noexcept + { + static Mgr mgr; + return mgr; + } + + public: + template + tracked_ptr(U&&... args) + : ptr_(nullptr) + { + ptr_ = tracked_ptr::manager().retain(std::forward(args)...); + } + + virtual ~tracked_ptr() noexcept + { + this->reset(); + } + + tracked_ptr(const tracked_ptr&) = delete; + tracked_ptr& operator=(const tracked_ptr&) = delete; + + public: + using pointer_type = T*; + + void reset() + { + if (ptr_) + { + tracked_ptr::manager().dispose(ptr_); + } + } + + pointer_type get() const + { + return ptr_; + } + + pointer_type data() + { + return ptr_; + } + + T& operator*() const + { + return *ptr_; + } + + pointer_type operator->() const + { + return ptr_; + } + + explicit operator bool() const + { + return ptr_ != nullptr; + } + + void swap(tracked_ptr& other) + { + std::swap(ptr_, other.ptr_); + } + + public: + tracked_ptr(tracked_ptr&& other) noexcept + : ptr_(other.ptr_) + { + other.ptr_ = nullptr; + } + + tracked_ptr& operator=(tracked_ptr&& other) noexcept + { + if (this != &other) + { + this->reset(); + ptr_ = other.ptr_; + other.ptr_ = nullptr; + } + + return *this; + } + + private: + pointer_type ptr_{nullptr}; + }; + + template + inline auto make_tracked() -> tracked_ptr + { + return tracked_ptr(); + } + + template + inline auto make_tracked(T&&... arg) -> tracked_ptr + { + return tracked_ptr(std::forward(arg)...); + } + + template + inline void swap(tracked_ptr& a, tracked_ptr& b) + { + a.swap(b); + } + + /// @brief a Must Pass function is a standard way to verify a container' validity, inspired from NeKernel/VMKernel. + template + inline void must_pass(tracked_ptr& ptr, error_handler handler) + { + if (ptr.manager().allocator().allocated_count_ < ptr.manager().allocator().deallocated_count_) + { + handler.template error("Invalid TrackedPtr detected: Deallocated count exceeds allocated count."); + } + } +} // namespace ocl::memory diff --git a/include/ocl/net/modem.hpp b/include/ocl/net/modem.hpp new file mode 100644 index 0000000..08d5ca5 --- /dev/null +++ b/include/ocl/net/modem.hpp @@ -0,0 +1,173 @@ +/* + * 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 + +#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/url.hpp b/include/ocl/net/url.hpp new file mode 100644 index 0000000..ebfc57a --- /dev/null +++ b/include/ocl/net/url.hpp @@ -0,0 +1,123 @@ +/* + * File: net/url.hpp + * Purpose: URL container 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 + +/// @author Amlal El Mahrouss (amlal@nekernel.org) +/// @brief Parse URLs (in a non-standard way). + +namespace ocl::net +{ + template + class basic_url; + + /// @brief Basic URL parser container. + template + class basic_url final + { + public: + using reference = basic_url&; + + enum + { + invalid = 0, + http, + https, + mailto, + ftp, + tel, + bad = 0xff, + }; + + uint32_t m_protocol_{basic_url::invalid}; + std::basic_stringstream m_ss_{}; + std::basic_string m_port_{""}; + + public: + explicit basic_url(const std::basic_string& protocol) + { + if (protocol.starts_with("https://")) + { + m_protocol_ = basic_url::https; + this->operator/=(protocol.substr(std::size("https://"))); + } + else if (protocol.starts_with("http://")) + { + m_protocol_ = basic_url::http; + this->operator/=(protocol.substr(std::size("http://"))); + } + else if (protocol.starts_with("mailto:")) + { + m_protocol_ = basic_url::mailto; + this->operator/=(protocol.substr(std::size("mailto:"))); + } + else if (protocol.starts_with("tel:")) + { + m_protocol_ = basic_url::tel; + this->operator/=(protocol.substr(std::size("tel:"))); + } + else if (protocol.starts_with("ftp:")) + { + m_protocol_ = basic_url::ftp; + this->operator/=(protocol.substr(std::size("ftp:"))); + } + } + + ~basic_url() = default; + + basic_url& operator=(const basic_url&) = default; + basic_url(const basic_url&) = default; + + private: + reference operator/=(const std::basic_string& in) + { + if (in.empty()) + return *this; + + if (in.starts_with(":")) + { + m_port_ = in.substr(1); + return *this; + } + + m_ss_ += in; + return *this; + } + + reference operator/=(const char_type& in) + { + m_ss_ += in; + return *this; + } + + explicit operator bool() + { + return this->is_valid(); + } + + public: + uint32_t protocol() const noexcept + { + return this->m_protocol_; + } + + std::basic_string port() const noexcept + { + return this->m_port_; + } + + bool is_valid() const noexcept + { + return m_ss_.size() > 0 && this->m_protocol_ != basic_url::bad || this->m_protocol_ != basic_url::invalid; + } + }; + + using url = basic_url; +} // namespace ocl::net diff --git a/include/ocl/simd/basic_simd.hpp b/include/ocl/simd/basic_simd.hpp new file mode 100644 index 0000000..a401dbd --- /dev/null +++ b/include/ocl/simd/basic_simd.hpp @@ -0,0 +1,47 @@ +/* + * File: simd/basic_simd.hpp + * Purpose: Basic SIMD backend C++ library. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the BSL 1.0 license. + */ + +#pragma once + +#include + +#ifdef __x86_64__ +#include +using simd_type = __m256; +#endif + +#ifdef __aarch64__ +#include +using simd_type = float32x4_t; +#endif + +namespace ocl::simd +{ + struct basic_simd final + { + struct simd_traits final + { + simd_type __val; + + private: + static bool bad; + friend class basic_simd; + }; + + using register_type = simd_traits; + + const bool& is_bad() noexcept + { + return register_type::bad; + } + + std::basic_string isa() + { + return "basic_simd"; + } + }; +} // namespace ocl::simd diff --git a/include/ocl/simd/simd.hpp b/include/ocl/simd/simd.hpp new file mode 100644 index 0000000..711bf31 --- /dev/null +++ b/include/ocl/simd/simd.hpp @@ -0,0 +1,61 @@ +/* + * File: simd/simd.hpp + * Purpose: SIMD C++ library. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the BSL 1.0 license. + */ + +#pragma once + +#include + +/// @author Amlal El Mahrouss +/// @brief Basic SIMD processor. + +namespace ocl::simd +{ + template + class real_type + { + private: + backend_type backend_; + + enum opcode + { + bad = 0, + add, + mul, + div, + invalid = 0xfff, + }; + + public: + real_type() = default; + virtual ~real_type() = default; + + real_type& operator=(const real_type&) = delete; + real_type(const real_type&) = delete; + + typename backend_type::register_type& call(const opcode& op, typename backend_type::register_type& lhs, typename backend_type::register_type& rhs) + { + switch (op) + { + case add: + return backend_.add(lhs, rhs); + case mul: + return backend_.mul(lhs, rhs); + case div: + return backend_.div(lhs, rhs); + default: + break; + } + + return backend_.is_bad(); + } + + std::basic_string isa() + { + return backend_.isa(); + } + }; +} // namespace ocl::simd diff --git a/include/ocl/tests/gtest.hpp b/include/ocl/tests/gtest.hpp new file mode 100644 index 0000000..ee328b0 --- /dev/null +++ b/include/ocl/tests/gtest.hpp @@ -0,0 +1,10 @@ +/* + * File: tests/gtest.hpp + * Purpose: Google Test wrapper for the OCL library. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#pragma once + +#include diff --git a/include/ocl/tests/hpptest.hpp b/include/ocl/tests/hpptest.hpp new file mode 100644 index 0000000..0c7b4e5 --- /dev/null +++ b/include/ocl/tests/hpptest.hpp @@ -0,0 +1,90 @@ +/* + * File: tests/hpptest.hpp + * Purpose: HPP Test wrapper for the OCL library. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#pragma once + +#include +#include + +namespace ocl::hpptest +{ + /// @brief Standard termination error handler, called when a test fails. + struct standard_terminate final + { + template + static void error() noexcept + { + ocl::io::print("standard_terminate::error, terminating...\n"); + + if (stop_execution) + std::terminate(); + } + }; + + struct posix_terminate final + { + template + static void error(errno_t err) noexcept + { + ocl::io::print("posix_terminate::error: expected=", strerror(args), ", got=", strerror(err), "\n"); + + if (stop_execution) + std::terminate(); + } + }; + + typedef bool condition_type; + + template + consteval inline void must_be() + { +#ifdef OCL_HPPTEST + OCL_HPPTEST_ASSERT(expr); +#endif // _WIN32 + } + + template + inline void must_be(condition_type cond) noexcept + { + if (cond != expect) + { + on_fail::template error(); + } + } + + template + inline void must_be(errno_t ern) noexcept + { + if (ern != expect) + { + posix_terminate::error(ern); + } + } + +#ifdef _WIN32 + struct win32_terminate final + { + template + static void error(HRESULT err) noexcept + { + ocl::io::print("win32_terminate::error: expected=S_OK, got=", err, "\n"); + + if (stop_execution) + std::terminate(); + } + }; + + template + inline void must_be(HRESULT hr) noexcept + { + if (hr != expect) + { + win32_terminate::error(hr); + } + } +#endif // _WIN32 +} // namespace ocl::hpptest diff --git a/include/ocl/utility/cgi.hpp b/include/ocl/utility/cgi.hpp new file mode 100644 index 0000000..8849c2d --- /dev/null +++ b/include/ocl/utility/cgi.hpp @@ -0,0 +1,79 @@ +/* + * File: cgi.hpp + * Author: Amlal El Mahrouss, + * Copyright 2023-2025, Amlal El Mahrouss, Licensed under the Boost Software License. + */ + +#ifndef _OCL_CGI_HPP +#define _OCL_CGI_HPP + +#include +#include +#include +#include + +namespace ocl +{ + namespace cgi + { + /// @brief CGI Writer class, writes to stdout; as CGI expects. + template + class basic_writer + { + private: + basic_writer& eval_(const basic_chunk_string& mime, const basic_chunk_string& ss) noexcept + { + std::basic_stringstream ss_out; + + ss_out << std::format("Content-Type: {}\r\n", mime.str()); + ss_out << std::format("Server: {}\r\n", "OCL/1.0"); + ss_out << std::format("Content-Length: {}\r\n\r\n", ss.str().size()); + ss_out << ss.str(); + + io::print(ss_out.str()); + + return *this; + } + + public: + explicit basic_writer() = default; + virtual ~basic_writer() = default; + + basic_writer& operator=(const basic_writer&) = default; + basic_writer(const basic_writer&) = default; + + public: + friend void operator<<(basic_writer& self, const basic_chunk_string& ss_in) + { + self = self.eval_("text/plain", ss_in); + } + + basic_writer& binary(const basic_chunk_string& ss_in) + { + return this->eval_("application/octet-stream", ss_in); + } + + basic_writer& html(const basic_chunk_string& ss_in) + { + return this->eval_("text/html", ss_in); + } + + basic_writer& xml(const basic_chunk_string& ss_in) + { + return this->eval_("application/xml", ss_in); + } + + basic_writer& json(const basic_chunk_string& ss_in) + { + return this->eval_("application/json", ss_in); + } + + basic_writer& js(const basic_chunk_string& ss_in) + { + return this->eval_("text/javascript", ss_in); + } + }; + } // namespace cgi +} // namespace ocl + +#endif // ifndef _OCL_CGI_HPP diff --git a/include/ocl/utility/crc32.hpp b/include/ocl/utility/crc32.hpp new file mode 100644 index 0000000..2bcab29 --- /dev/null +++ b/include/ocl/utility/crc32.hpp @@ -0,0 +1,81 @@ +/* + * 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/utility/embfs.hpp b/include/ocl/utility/embfs.hpp new file mode 100644 index 0000000..8a716ce --- /dev/null +++ b/include/ocl/utility/embfs.hpp @@ -0,0 +1,81 @@ +/* + * File: embfs.hpp + * Purpose: Embedded File System. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, Licensed under the Boost Software License. + */ + +#ifndef _OCL_EMBFS_HPP +#define _OCL_EMBFS_HPP + +#include +#include + +/// @brief A filesystem designed for tiny storage medias. +/// @author Amlal EL Mahrouss (amlal@nekernel.org) + +namespace ocl::embfs +{ + namespace traits + { + struct embfs_superblock; + struct embfs_inode; + + inline constexpr const size_t _superblock_name_len = 16; + inline constexpr const size_t _superblock_reserve_len = 462; + + inline constexpr const size_t _inode_name_len = 128; + inline constexpr const size_t _inode_arr_len = 12; + inline constexpr const size_t _inode_lookup_len = 8; + +#if defined(EMBFS_28BIT_LBA) + typedef std::uint32_t lba_t; +#elif defined(EMBFS_48BIT_LBA) + typedef std::uint64_t lba_t; +#else + typedef std::uint32_t lba_t; +#endif + + typedef std::int16_t sword_t; + + typedef std::int32_t sdword_t; + + typedef std::uint8_t utf8_char_t; + + /// @brief Superblock data structure + struct embfs_superblock + { + sword_t s_block_mag; + sdword_t s_num_inodes; + sdword_t s_part_size; + sdword_t s_part_used; + sdword_t s_version; + sword_t s_sector_sz; + lba_t s_inode_start; + lba_t s_inode_end; + utf8_char_t s_name[_superblock_name_len]; + utf8_char_t s_reserved[_superblock_reserve_len]; + }; + + /// @brief Indexed node structure. + /// @brief i_name file name + /// @brief i_size_virt, i_size_phys: virtual and physical (sector count) size. + /// @brief i_offset direct block pointer. + /// @brief i_checksum crc32 checksum. + /// @brief i_flags_perms flags and permissions + /// @brief i_acl_* ACL to keep track of inode allocation status. + struct embfs_inode + { + utf8_char_t i_name[_inode_name_len]; + sword_t i_size_virt, i_size_phys; + lba_t i_offset[_inode_lookup_len]; + sword_t i_checksum, i_flags_perms; + lba_t i_acl_creat, i_acl_edit, i_acl_delet; + }; + + /// @brief Indexed node linear array. + typedef embfs_inode embfs_inode_arr_t[_inode_arr_len]; + } // namespace traits +} // namespace ocl::embfs + +#endif // ifndef _OCL_EMBFS_HPP \ No newline at end of file diff --git a/make_dist_linux.sh b/make_dist_linux.sh index 221b5f4..2432323 100755 --- a/make_dist_linux.sh +++ b/make_dist_linux.sh @@ -4,7 +4,7 @@ outputDir=dist/lib/ mkdir -p $outputDir -for f in dev/lib/*/*.hpp; do +for f in include/ocl/*/*.hpp; do baseName=`echo $f | cut -d "." -f 1` echo "RUN:" cp --parents $f.hpp $outputDir$baseName cp --parents $f.hpp $outputDir$baseName diff --git a/make_dist_osx.sh b/make_dist_osx.sh index 9d91de3..505c583 100755 --- a/make_dist_osx.sh +++ b/make_dist_osx.sh @@ -4,7 +4,7 @@ outputDir=dist/ mkdir -p $outputDir -for f in dev/lib/*/*.hpp; do +for f in include/ocl/*/*.hpp; do baseName=`echo $f | cut -d "." -f 1` echo "RUN:" ditto $baseName.hpp $outputDir$baseName ditto $baseName.hpp $outputDir$baseName diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/chunk_string/CMakeLists.txt b/tests/chunk_string/CMakeLists.txt new file mode 100644 index 0000000..53a9add --- /dev/null +++ b/tests/chunk_string/CMakeLists.txt @@ -0,0 +1,25 @@ +cmake_minimum_required(VERSION 3.27) +project(BasicChunkUsage LANGUAGES CXX) + +# find_package(Boost REQUIRED COMPONENTS container) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip +) + +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable(BasicChunkUsage chunk_test.cc) +target_link_libraries(BasicChunkUsage PRIVATE gtest_main) + +set_property(TARGET BasicChunkUsage PROPERTY CXX_STANDARD 20) +target_include_directories(BasicChunkUsage PUBLIC ../../include/ocl) + +include(GoogleTest) +gtest_discover_tests(BasicChunkUsage) diff --git a/tests/chunk_string/chunk_test.cc b/tests/chunk_string/chunk_test.cc new file mode 100644 index 0000000..6b2d290 --- /dev/null +++ b/tests/chunk_string/chunk_test.cc @@ -0,0 +1,31 @@ +/* + * File: tests/chunk_test.cc + * Purpose: Chunk unit tests in C++ + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#include +#include +#include + +TEST(ChunkTest, BasicChunkUsage) +{ + const char* test_string = "HELLO, WORLD!\r\n"; + const auto iterations = 1024000; + const auto limit = 30; + + auto start = std::chrono::high_resolution_clock::now(); + + ocl::basic_chunk_string optimized; + + for (unsigned i = 0; i < iterations; ++i) + { + optimized += test_string; + } + + auto end = std::chrono::high_resolution_clock::now(); + auto optimized_time = std::chrono::duration_cast(end - start); + + EXPECT_TRUE(optimized_time.count() < 100U); +} diff --git a/tests/fix_basic/CMakeLists.txt b/tests/fix_basic/CMakeLists.txt new file mode 100644 index 0000000..b94e3b5 --- /dev/null +++ b/tests/fix_basic/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.10) +project(FIXTestBasic) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip +) + +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable(FIXTestBasic fix_test.cc) +target_link_libraries(FIXTestBasic gtest_main) + +set_property(TARGET FIXTestBasic PROPERTY CXX_STANDARD 20) +target_include_directories(FIXTestBasic PUBLIC ../../include/ocl) + +include(GoogleTest) +gtest_discover_tests(FIXTestBasic) diff --git a/tests/fix_basic/fix_test.cc b/tests/fix_basic/fix_test.cc new file mode 100644 index 0000000..f58973b --- /dev/null +++ b/tests/fix_basic/fix_test.cc @@ -0,0 +1,19 @@ +/* + * File: tests/fix_test.cc + * Purpose: Custom FIX protocol tests. + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#include +#include +#include + +TEST(FIXTest, BasicFIXUsage) +{ + ocl::fix::basic_visitor basic_visitor; + ocl::fix::basic_range_data fix = basic_visitor.visit("8=FIX.4.2|9=65|35=A|49=SERVER|56=CLIENT|34=177|52=20090107-18:15:16|98=0|108=30|10=062|"); + + EXPECT_EQ(fix.magic_, ocl::fix::detail::begin_fix()); + EXPECT_TRUE(fix.is_valid()); +} diff --git a/tests/network_basic/CMakeLists.txt b/tests/network_basic/CMakeLists.txt new file mode 100644 index 0000000..88fa1c8 --- /dev/null +++ b/tests/network_basic/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.27) +project(NetworkTestBasic LANGUAGES CXX) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip +) + +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable(NetworkTestBasic net_test.cc) +target_link_libraries(NetworkTestBasic gtest_main) + +set_property(TARGET NetworkTestBasic PROPERTY CXX_STANDARD 20) +target_include_directories(NetworkTestBasic PUBLIC ../../include/ocl) + +include(GoogleTest) +gtest_discover_tests(NetworkTestBasic) diff --git a/tests/network_basic/net_test.cc b/tests/network_basic/net_test.cc new file mode 100644 index 0000000..15090d0 --- /dev/null +++ b/tests/network_basic/net_test.cc @@ -0,0 +1,22 @@ +/* + * File: tests/net_test.cc + * Purpose: Network unit tests in C++ + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#include +#include +#include +#include + +TEST(NetworkTest, BasicNetworkUsage) +{ + ocl::net::modem modem; + modem.construct(ocl::net::modem::local_address_ip4, true); + + EXPECT_TRUE(modem.is_valid()); + + std::basic_string buf_dst = "HELLO, NET!"; + EXPECT_TRUE(modem.transmit(buf_dst)); +} diff --git a/tests/tracked_ptr_basic/CMakeLists.txt b/tests/tracked_ptr_basic/CMakeLists.txt new file mode 100644 index 0000000..7c3dac6 --- /dev/null +++ b/tests/tracked_ptr_basic/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.10) +project(TrackedPtrTestBasic) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip +) + +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable(TrackedPtrTestBasic tracked_ptr_test.cc) +target_link_libraries(TrackedPtrTestBasic gtest_main) + +set_property(TARGET TrackedPtrTestBasic PROPERTY CXX_STANDARD 20) +target_include_directories(TrackedPtrTestBasic PUBLIC ../../include/ocl) + +include(GoogleTest) +gtest_discover_tests(TrackedPtrTestBasic) diff --git a/tests/tracked_ptr_basic/tracked_ptr_test.cc b/tests/tracked_ptr_basic/tracked_ptr_test.cc new file mode 100644 index 0000000..652974a --- /dev/null +++ b/tests/tracked_ptr_basic/tracked_ptr_test.cc @@ -0,0 +1,25 @@ +/* + * File: tests/tracked_ptr_test.cc + * Purpose: Custom smart pointer unit tests in C++ + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#include +#include + +TEST(TrackedPtrTest, BasicTrackedPtrUsage) +{ + ocl::memory::tracked_ptr ptr = ocl::memory::make_tracked(42); + + ASSERT_TRUE(ptr); + EXPECT_EQ(*ptr, 42); + + ocl::memory::tracked_ptr ptr2; + + ocl::memory::swap(ptr, ptr2); + + ptr2.reset(); + + EXPECT_EQ(ocl::memory::tracked_ptr::manager().allocator().allocated_count_, 1); +} \ No newline at end of file diff --git a/tests/tracked_ptr_leak/CMakeLists.txt b/tests/tracked_ptr_leak/CMakeLists.txt new file mode 100644 index 0000000..314e666 --- /dev/null +++ b/tests/tracked_ptr_leak/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.10) +project(TrackedPtrTestLeak) + +include(FetchContent) +FetchContent_Declare( + googletest + URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip +) + +# For Windows: Prevent overriding the parent project's compiler/linker settings +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(googletest) + +enable_testing() + +add_executable(TrackedPtrTestLeak tracked_ptr_test.cc) +target_link_libraries(TrackedPtrTestLeak gtest_main) + +set_property(TARGET TrackedPtrTestLeak PROPERTY CXX_STANDARD 20) +target_include_directories(TrackedPtrTestLeak PUBLIC ../../include/ocl) + +include(GoogleTest) +gtest_discover_tests(TrackedPtrTestLeak) diff --git a/tests/tracked_ptr_leak/tracked_ptr_test.cc b/tests/tracked_ptr_leak/tracked_ptr_test.cc new file mode 100644 index 0000000..14d8f8e --- /dev/null +++ b/tests/tracked_ptr_leak/tracked_ptr_test.cc @@ -0,0 +1,19 @@ +/* + * File: tests/tracked_ptr_test.cc + * Purpose: Custom smart pointer unit tests in C++ + * Author: Amlal El Mahrouss (amlal@nekernel.org) + * Copyright 2025, Amlal El Mahrouss, licensed under the Boost Software License. + */ + +#include +#include + +TEST(TrackedPtrTest, LeakTrackedPtrUsage) +{ + ocl::memory::tracked_ptr* ptr = new ocl::memory::tracked_ptr(42); + ocl::memory::tracked_ptr* ptr2 = new ocl::memory::tracked_ptr(42); + ocl::memory::tracked_ptr* ptr3 = new ocl::memory::tracked_ptr(42); + + EXPECT_EQ(ocl::memory::tracked_ptr::manager().allocator().allocated_count_, 3); + ASSERT_TRUE(ocl::memory::tracked_ptr::manager().allocator().deallocated_count_ == 0); +} \ No newline at end of file -- cgit v1.2.3