//===-- A simple classes to manage error return vals ----------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_LIBC_SRC_SUPPORT_CPP_ERROR_H #define LLVM_LIBC_SRC_SUPPORT_CPP_ERROR_H namespace __llvm_libc { namespace cpp { // Many C functions return an error val and/or the actual result of the // evaluation/operation performed by the function. This file defines a simple // convenience data structure to encapsulate the error and the actual val in // a single place. struct Error { int error_code; }; // This class is implemented in a simple fashion as the intention is it add // more generality as required. Currently, it only supports simple copyable // types for T. template class ErrorOr { bool is_error; union { T val; Error error; }; public: ErrorOr(const T &value) : is_error(false), val(value) {} ErrorOr(const Error &error) : is_error(true), error(error) {} operator bool() { return !is_error; } operator T &() { return val; } T &value() { return val; } int error_code() { return is_error ? error.error_code : 0; } }; } // namespace cpp } // namespace __llvm_libc #endif // LLVM_LIBC_SRC_SUPPORT_CPP_ERROR_H