diff --git a/cmake/retinify.hpp.in b/cmake/retinify.hpp.in index 0e8d39d..36eebb9 100644 --- a/cmake/retinify.hpp.in +++ b/cmake/retinify.hpp.in @@ -8,6 +8,8 @@ #include "retinify/geometry.hpp" #include "retinify/io.hpp" #include "retinify/logging.hpp" +#include "retinify/nocopymove.hpp" +#include "retinify/nothrow.hpp" #include "retinify/paths.hpp" #include "retinify/pipeline.hpp" #include "retinify/status.hpp" diff --git a/retinify/include/retinify/nothrow.hpp b/retinify/include/retinify/nothrow.hpp new file mode 100644 index 0000000..6ad6347 --- /dev/null +++ b/retinify/include/retinify/nothrow.hpp @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: Copyright (c) 2025 Sensui Yagi. All rights reserved. +// SPDX-License-Identifier: Apache-2.0 + +#pragma once + +#include +#include +#include + +#include "retinify/logging.hpp" +#include "retinify/status.hpp" + +namespace retinify +{ +/// @brief +/// Executes a function and converts any exception into a Status. +/// @tparam Function +/// The type of the function to execute. +/// @param function +/// The function to execute. +/// @return +/// A Status object that indicates whether the operation was successful +template auto NoThrow(Function &&function) noexcept -> Status +{ + static_assert(std::is_same_v, Status>, "NoThrow requires Function to return Status"); + + try + { + return std::forward(function)(); + } + catch (const std::exception &ex) + { + LogError(ex.what()); + return Status{StatusCategory::RETINIFY, StatusCode::FAIL}; + } + catch (...) + { + LogError("Unknown exception caught"); + return Status{StatusCategory::RETINIFY, StatusCode::FAIL}; + } +} +} // namespace retinify \ No newline at end of file diff --git a/retinify/src/io.cpp b/retinify/src/io.cpp index cf3b6eb..bd136f5 100644 --- a/retinify/src/io.cpp +++ b/retinify/src/io.cpp @@ -3,6 +3,7 @@ #include "retinify/io.hpp" #include "retinify/logging.hpp" +#include "retinify/nothrow.hpp" #include #include @@ -275,13 +276,12 @@ template [[nodiscard]] auto DeserializeMatr auto SaveCalibrationParameters(const char *filename, const CalibrationParameters ¶meters) noexcept -> Status { - if (IsFilenameEmpty(filename)) - { - return Status(StatusCategory::USER, StatusCode::INVALID_ARGUMENT); - } + return NoThrow([&]() -> Status { + if (IsFilenameEmpty(filename)) + { + return Status{StatusCategory::USER, StatusCode::INVALID_ARGUMENT}; + } - try - { const std::filesystem::path targetPath(filename); const auto dirStatus = EnsureParentDirectory(targetPath); @@ -290,10 +290,10 @@ auto SaveCalibrationParameters(const char *filename, const CalibrationParameters return dirStatus; } - std::ofstream out(targetPath, std::ios::trunc); + std::ofstream out{targetPath, std::ios::trunc}; if (!out.is_open()) { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + return Status{StatusCategory::SYSTEM, StatusCode::FAIL}; } const auto json = SerializeCalibration(parameters); @@ -302,58 +302,39 @@ auto SaveCalibrationParameters(const char *filename, const CalibrationParameters out.flush(); if (!out.good()) { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + return Status{StatusCategory::SYSTEM, StatusCode::FAIL}; } - return Status(); - } - catch (const std::exception &e) - { - LogError(e.what()); - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); - } - catch (...) - { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); - } + return Status{}; + }); } auto LoadCalibrationParameters(const char *filename, CalibrationParameters ¶meters) noexcept -> Status { - if (IsFilenameEmpty(filename)) - { - return Status(StatusCategory::USER, StatusCode::INVALID_ARGUMENT); - } + return NoThrow([&]() -> Status { + if (IsFilenameEmpty(filename)) + { + return Status{StatusCategory::USER, StatusCode::INVALID_ARGUMENT}; + } - try - { std::ifstream in(filename, std::ios::in); if (!in.is_open()) { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + return Status{StatusCategory::SYSTEM, StatusCode::FAIL}; } const auto doc = nlohmann::json::parse(in, nullptr, false); if (doc.is_discarded()) { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + return Status{StatusCategory::SYSTEM, StatusCode::FAIL}; } if (!DeserializeCalibration(doc, parameters)) { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + return Status{StatusCategory::SYSTEM, StatusCode::FAIL}; } - return Status(); - } - catch (const std::exception &e) - { - LogError(e.what()); - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); - } - catch (...) - { - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); - } + return Status{}; + }); } } // namespace retinify diff --git a/retinify/src/paths.cpp b/retinify/src/paths.cpp index 579d7bc..1bc702f 100644 --- a/retinify/src/paths.cpp +++ b/retinify/src/paths.cpp @@ -3,6 +3,7 @@ #include "retinify/paths.hpp" #include "retinify/logging.hpp" +#include "retinify/nothrow.hpp" #include "retinify/retinifyModels.hpp" #include "retinify/version.hpp" @@ -26,12 +27,11 @@ constexpr DirectoryInfo kCacheDirectoryInfo{"XDG_CACHE_HOME", ".cache"}; constexpr DirectoryInfo kDataDirectoryInfo{"XDG_DATA_HOME", ".local/share"}; constexpr DirectoryInfo kStateDirectoryInfo{"XDG_STATE_HOME", ".local/state"}; -constexpr const char *kRetinifyDirName = "retinify"; +constexpr const char kRetinifyDirName[] = "retinify"; -static inline auto GetUserDirectoryPath(const DirectoryInfo &info, std::filesystem::path &path) noexcept -> Status +inline auto GetUserDirectoryPath(const DirectoryInfo &info, std::filesystem::path &path) noexcept -> Status { - try - { + return NoThrow([&]() -> Status { std::filesystem::path baseDirectory; const char *xdgValue = std::getenv(info.environmentVariable); @@ -73,25 +73,13 @@ static inline auto GetUserDirectoryPath(const DirectoryInfo &info, std::filesyst path = fullPath; return Status{}; - } - catch (const std::exception &ex) - { - retinify::LogError(ex.what()); - } - catch (...) - { - retinify::LogError("Unknown exception occurred."); - } - - path.clear(); - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + }); } } // namespace auto HomeDirectoryPath(std::filesystem::path &path) noexcept -> Status { - try - { + return NoThrow([&]() -> Status { const char *homePath = std::getenv("HOME"); if (homePath == nullptr || std::strlen(homePath) == 0) { @@ -102,18 +90,7 @@ auto HomeDirectoryPath(std::filesystem::path &path) noexcept -> Status path = std::filesystem::path{homePath}; return Status{}; - } - catch (const std::exception &ex) - { - retinify::LogError(ex.what()); - } - catch (...) - { - retinify::LogError("Unknown exception occurred."); - } - - path.clear(); - return Status(StatusCategory::SYSTEM, StatusCode::FAIL); + }); } auto ConfigDirectoryPath(std::filesystem::path &path) noexcept -> Status diff --git a/retinify/src/session.cpp b/retinify/src/session.cpp index 04faa4e..ab72ce8 100644 --- a/retinify/src/session.cpp +++ b/retinify/src/session.cpp @@ -5,6 +5,7 @@ #include "mat.hpp" #include "retinify/logging.hpp" +#include "retinify/nothrow.hpp" #include "retinify/paths.hpp" #include @@ -54,8 +55,7 @@ class TensorRTLogger : public nvinfer1::ILogger auto Session::Initialize(const char *modelPath) noexcept -> Status { #ifdef BUILD_WITH_TENSORRT - try - { + return NoThrow([&]() -> Status { TensorRTLogger logger; runtime_.reset(nvinfer1::createInferRuntime(logger)); if (!runtime_) @@ -228,17 +228,7 @@ auto Session::Initialize(const char *modelPath) noexcept -> Status } return Status{}; - } - catch (std::exception &ex) - { - LogError(ex.what()); - return Status{StatusCategory::RETINIFY, StatusCode::FAIL}; - } - catch (...) - { - LogFatal("An unknown error occurred."); - return Status{StatusCategory::RETINIFY, StatusCode::FAIL}; - } + }); #else (void)modelPath; LogError("This function is not available");