summaryrefslogtreecommitdiffhomepage
path: root/include/ocl/core
diff options
context:
space:
mode:
Diffstat (limited to 'include/ocl/core')
-rw-r--r--include/ocl/core/chunk_string.hpp121
-rw-r--r--include/ocl/core/error_handler.hpp47
-rw-r--r--include/ocl/core/includes.hpp23
3 files changed, 191 insertions, 0 deletions
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 <core/includes.hpp>
+#include <io/print.hpp>
+#include <cstring>
+
+namespace ocl
+{
+ template <typename char_type, std::size_t max_chunk_size = 8196>
+ class basic_chunk_string;
+
+ template <typename char_type, std::size_t max_chunk_size>
+ 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<char_type>& 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<char_type>(in, sz));
+
+ return *this;
+ }
+
+ basic_chunk_string& operator+=(const std::basic_string<char_type>& 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<char_type> str() const noexcept
+ {
+ static std::basic_string<char_type> 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 <typename char_type>
+ inline void print(basic_chunk_string<char_type>& 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 <core/includes.hpp>
+#include <io/print.hpp>
+
+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 <bool throw_too = false>
+ void error(const std::basic_string<char>& msg)
+ {
+ this->operator()(msg);
+
+ if constexpr (throw_too)
+ {
+ throw std::runtime_error(msg);
+ }
+ }
+
+ void operator()(const std::basic_string<char>& 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 <boost/config.hpp>
+#include <boost/core/nvp.hpp>
+#include <boost/core/demangle.hpp>
+#include <boost/core/null_deleter.hpp>
+#include <boost/container/allocator.hpp>
+
+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