Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmake/retinify.hpp.in
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
42 changes: 42 additions & 0 deletions retinify/include/retinify/nothrow.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// SPDX-FileCopyrightText: Copyright (c) 2025 Sensui Yagi. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include <exception>
#include <type_traits>
#include <utility>

#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 <typename Function> auto NoThrow(Function &&function) noexcept -> Status
{
static_assert(std::is_same_v<std::invoke_result_t<Function>, Status>, "NoThrow requires Function to return Status");

try
{
return std::forward<Function>(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
61 changes: 21 additions & 40 deletions retinify/src/io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "retinify/io.hpp"
#include "retinify/logging.hpp"
#include "retinify/nothrow.hpp"

#include <array>
#include <cstdint>
Expand Down Expand Up @@ -275,13 +276,12 @@ template <std::size_t Rows, std::size_t Cols> [[nodiscard]] auto DeserializeMatr

auto SaveCalibrationParameters(const char *filename, const CalibrationParameters &parameters) 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);
Expand All @@ -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);
Expand All @@ -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 &parameters) 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
37 changes: 7 additions & 30 deletions retinify/src/paths.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "retinify/paths.hpp"
#include "retinify/logging.hpp"
#include "retinify/nothrow.hpp"
#include "retinify/retinifyModels.hpp"
#include "retinify/version.hpp"

Expand All @@ -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);
Expand Down Expand Up @@ -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)
{
Expand All @@ -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
Expand Down
16 changes: 3 additions & 13 deletions retinify/src/session.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "mat.hpp"

#include "retinify/logging.hpp"
#include "retinify/nothrow.hpp"
#include "retinify/paths.hpp"

#include <filesystem>
Expand Down Expand Up @@ -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_)
Expand Down Expand Up @@ -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");
Expand Down