Add Result class inspired by Rust

This commit is contained in:
apio 2022-07-30 12:54:25 +00:00
parent 1827b27996
commit 582ce26776
2 changed files with 37 additions and 0 deletions

View File

@ -56,6 +56,7 @@ add_executable(
src/sapphirepch.h
src/IRBuilder.cpp
src/IRBuilder.h
src/Result.h
)
target_include_directories(sapphirec PUBLIC src)

36
src/Result.h Normal file
View File

@ -0,0 +1,36 @@
#pragma once
#include "Token.h"
// Kinda copying Rust here, but it's a great idea.
template<typename T>
class Result
{
public:
Result() = default;
bool is_error() const { return m_is_error; }
void ethrow();
std::shared_ptr<T> get() { return m_result; }
protected:
std::shared_ptr<Token> m_token;
std::shared_ptr<T> m_result;
bool m_is_error;
std::string m_error;
Result(T* result, Token* token) : m_result(result), m_token(token) {}
Result(const std::string& error, Token* token) : m_error(std::move(error)), m_token(token) {}
};
template<typename T>
class Ok : public Result<T>
{
public:
Ok(T* result, Token* token) : Result<T>(result,token) {}
};
template<typename T>
class Err : public Result<T>
{
public:
Err(const std::string& error, Token* token) : Result<T>(std::move(error),token) {}
};