Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
ROOT::RResult< T > Class Template Reference

template<typename T>
class ROOT::RResult< T >

The class is used as a return type for operations that can fail; wraps a value of type T or an RError.

The RResult<T> class and their related classes are used for call chains that can throw exceptions, such as I/O code paths. Throwing of the exception is deferred to allow for if (result) style error checking where it makes sense. If an RResult in error state leaves the scope unchecked, it will throw.

A function returning an RResult might look like this:

RResult<int> MyIOFunc()
{
int rv = syscall(...);
if (rv == -1)
return R__FAIL("user-facing error message");
if (rv == kShortcut)
return 42;
return R__FORWARD_RESULT(FuncThatReturnsRResultOfInt());
}
#define R__FORWARD_RESULT(res)
Short-hand to return an RResult<T> value from a subroutine to the calling stack frame.
Definition RError.hxx:301
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
Definition RError.hxx:299
RResult(const T &value)
Definition RError.hxx:218

Code using MyIOFunc might look like this:

auto result = MyIOOperation();
if (!result) {
// custom error handling or result.Throw()
}
switch (result.Inspect()) {
...
}

Note that RResult<void> can be used for a function without return value, like this

RResult<void> DoSomething()
{
if (failure)
return R__FAIL("user-facing error messge");
}

RResult<T>::Unwrap() can be used as a short hand for "give me the wrapped value or, in case of an error, throw". For instance:

int value = FuncThatReturnsRResultOfInt().Unwrap(); // may throw

There is no implicit operator that converts RResult<T> to T. This is intentional to make it clear in the calling code where an exception may be thrown.

Definition at line 197 of file RError.hxx.

Public Member Functions

 RResult (const RResult &other)=delete
 RResult (const T &value)
 RResult (RError &&error)
 RResult (RResult &&other)=default
 RResult (T &&value)
 ~RResult ()=default
RResultForward (RError::RLocation &&sourceLocation)
 Used by R__FORWARD_RESULT in order to keep track of the stack trace in case of errors.
std::optional< RErrorGetError () const
const T & Inspect ()
 If the operation was successful, returns a const reference to the inner type.
 operator bool ()
RResultoperator= (const RResult &other)=delete
RResultoperator= (RResult &&other)=default
void Throw ()
 Throws an RException with fError.
Unwrap ()
 If the operation was successful, returns the inner type by value.

Static Public Member Functions

static RError ForwardError (RResultBase &&result, RError::RLocation &&sourceLocation)
 Used by R__FORWARD_ERROR in order to keep track of the stack trace.

Protected Member Functions

bool Check ()
 Used by the RResult<T> bool operator.

Protected Attributes

std::unique_ptr< RErrorfError
 This is the nullptr for an RResult representing success.
bool fIsChecked {false}
 Switches to true once the user of an RResult object checks the object status.

Private Member Functions

void ThrowOnError ()

Private Attributes

std::optional< T > fValue
 The result value, only present in case of successful execution.

#include <ROOT/RError.hxx>

Inheritance diagram for ROOT::RResult< T >:
ROOT::RResultBase

Constructor & Destructor Documentation

◆ RResult() [1/5]

template<typename T>
ROOT::RResult< T >::RResult ( const T & value)
inline

Definition at line 218 of file RError.hxx.

◆ RResult() [2/5]

template<typename T>
ROOT::RResult< T >::RResult ( T && value)
inline

Definition at line 219 of file RError.hxx.

◆ RResult() [3/5]

template<typename T>
ROOT::RResult< T >::RResult ( RError && error)
inline

Definition at line 220 of file RError.hxx.

◆ RResult() [4/5]

template<typename T>
ROOT::RResult< T >::RResult ( const RResult< T > & other)
delete

◆ RResult() [5/5]

template<typename T>
ROOT::RResult< T >::RResult ( RResult< T > && other)
default

◆ ~RResult()

template<typename T>
ROOT::RResult< T >::~RResult ( )
default

Member Function Documentation

◆ Check()

bool ROOT::RResultBase::Check ( )
inlineprotectedinherited

Used by the RResult<T> bool operator.

Definition at line 108 of file RError.hxx.

◆ Forward()

template<typename T>
RResult & ROOT::RResult< T >::Forward ( RError::RLocation && sourceLocation)
inline

Used by R__FORWARD_RESULT in order to keep track of the stack trace in case of errors.

Definition at line 230 of file RError.hxx.

◆ ForwardError()

RError ROOT::RResultBase::ForwardError ( RResultBase && result,
RError::RLocation && sourceLocation )
inlinestaticnodiscardinherited

Used by R__FORWARD_ERROR in order to keep track of the stack trace.

Definition at line 128 of file RError.hxx.

◆ GetError()

std::optional< RError > ROOT::RResultBase::GetError ( ) const
inlineinherited

Definition at line 122 of file RError.hxx.

◆ Inspect()

template<typename T>
const T & ROOT::RResult< T >::Inspect ( )
inline

If the operation was successful, returns a const reference to the inner type.

If there was an error, Inspect() instead throws an exception.

Definition at line 239 of file RError.hxx.

◆ operator bool()

template<typename T>
ROOT::RResult< T >::operator bool ( )
inlineexplicit

Definition at line 258 of file RError.hxx.

◆ operator=() [1/2]

template<typename T>
RResult & ROOT::RResult< T >::operator= ( const RResult< T > & other)
delete

◆ operator=() [2/2]

template<typename T>
RResult & ROOT::RResult< T >::operator= ( RResult< T > && other)
default

◆ Throw()

void ROOT::RResultBase::Throw ( )
inherited

Throws an RException with fError.

Definition at line 61 of file RError.cxx.

◆ ThrowOnError()

template<typename T>
void ROOT::RResult< T >::ThrowOnError ( )
inlineprivate

Definition at line 203 of file RError.hxx.

◆ Unwrap()

template<typename T>
T ROOT::RResult< T >::Unwrap ( )
inline

If the operation was successful, returns the inner type by value.

For move-only types, Unwrap can only be called once, as it yields ownership of the inner value to the caller using std::move, potentially leaving the RResult in an unspecified state.

If there was an error, Unwrap() instead throws an exception.

Definition at line 252 of file RError.hxx.

Member Data Documentation

◆ fError

std::unique_ptr<RError> ROOT::RResultBase::fError
protectedinherited

This is the nullptr for an RResult representing success.

Definition at line 100 of file RError.hxx.

◆ fIsChecked

bool ROOT::RResultBase::fIsChecked {false}
protectedinherited

Switches to true once the user of an RResult object checks the object status.

Definition at line 102 of file RError.hxx.

◆ fValue

template<typename T>
std::optional<T> ROOT::RResult< T >::fValue
private

The result value, only present in case of successful execution.

Definition at line 200 of file RError.hxx.


The documentation for this class was generated from the following file: