diff options
Diffstat (limited to 'include/ocl/core')
| -rw-r--r-- | include/ocl/core/chunk_string.hpp | 121 | ||||
| -rw-r--r-- | include/ocl/core/error_handler.hpp | 47 | ||||
| -rw-r--r-- | include/ocl/core/includes.hpp | 23 |
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 |
