blob: 1e7a501dc7df49e4fa57fa95dd8a5f8fbd6d97f3 [file] [log] [blame]
//===-- 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 <typename T> 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