libheif/error.h (67 lines of code) (raw):

/* * HEIF codec. * Copyright (c) 2017 Dirk Farin <dirk.farin@gmail.com> * * This file is part of libheif. * * libheif is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * libheif is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libheif. If not, see <http://www.gnu.org/licenses/>. */ #ifndef LIBHEIF_ERROR_H #define LIBHEIF_ERROR_H #include <cinttypes> #include <cstddef> #include <vector> #include <string> #include <memory> #include <limits> #include <istream> #include <ostream> #include <sstream> #include "libheif/heif.h" static constexpr char kSuccess[] = "Success"; class ErrorBuffer { public: ErrorBuffer() = default; void set_success() { m_error_message = c_success; } void set_error(const std::string& err) { m_buffer = err; m_error_message = m_buffer.c_str(); } const char* get_error() const { return m_error_message; } private: constexpr static const char* c_success = "Success"; std::string m_buffer; const char* m_error_message = c_success; }; class Error { public: enum heif_error_code error_code = heif_error_Ok; enum heif_suberror_code sub_error_code = heif_suberror_Unspecified; std::string message; Error(); Error(heif_error_code c, heif_suberror_code sc = heif_suberror_Unspecified, const std::string& msg = ""); static Error Ok; static const char kSuccess[]; bool operator==(const Error& other) const { return error_code == other.error_code; } bool operator!=(const Error& other) const { return !(*this == other); } operator bool() const { return error_code != heif_error_Ok; } static const char* get_error_string(heif_error_code err); static const char* get_error_string(heif_suberror_code err); heif_error error_struct(ErrorBuffer* error_buffer) const; }; inline std::ostream& operator<<(std::ostream& ostr, const Error& err) { ostr << err.error_code << "/" << err.sub_error_code; return ostr; } template <typename T> class Result { public: operator bool() const { return error.error_code == heif_error_Ok; } T value; Error error; }; #endif