Skip to content

Commit

Permalink
Refactor result class constructors
Browse files Browse the repository at this point in the history
Simulating named constructors behavior by using dummy enum parameter
  • Loading branch information
GregoryKogan committed Jan 7, 2024
1 parent a6b6366 commit 2591aea
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 44 deletions.
38 changes: 16 additions & 22 deletions result.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,11 @@ template <typename E> class err {
};

template <typename E> template <typename T> inline err<E>::operator result<T, E>() const {
auto res = result<T, E>();
res.make_unsuccessful(error_);
return res;
return result<T, E>(result<T, E>::Unsuccessful::UNSUCCESSFUL, error_);
}

template <typename E> inline err<E>::operator result<void, E>() const {
auto res = result<void, E>();
res.make_unsuccessful(error_);
return res;
return result<void, E>(result<void, E>::Unsuccessful::UNSUCCESSFUL, error_);
}

} // namespace res
Expand All @@ -72,15 +68,11 @@ template <typename T = std::monostate> class ok {
};

template <typename T> template <typename E> inline ok<T>::operator result<T, E>() const {
auto res = result<T, E>();
res.make_successful(value_);
return res;
return result<T, E>(result<T, E>::Successful::SUCCESSFUL, value_);
}

template <typename T> template <typename E> inline ok<T>::operator result<void, E>() const {
auto res = result<void, E>();
res.make_successful();
return res;
return result<void, E>(result<void, E>::Successful::SUCCESSFUL);
}

} // namespace res
Expand All @@ -97,11 +89,15 @@ template <typename T, typename E> class result {
static_assert(!std::is_same_v<T, void>, "T (value type) must not be void");
static_assert(!std::is_same_v<E, void>, "E (error type) must not be void");

bool successful_ = false;
bool successful_;
T value_;
E error_;

result() = default;
// Named constructors
enum Successful { SUCCESSFUL };
enum Unsuccessful { UNSUCCESSFUL };
result(Successful successful, T value) : successful_(true), value_(std::move(value)) {}
result(Unsuccessful unsuccessful, E error) : successful_(false), error_(std::move(error)) {}

auto make_successful(T value) -> void {
successful_ = true;
Expand Down Expand Up @@ -139,16 +135,14 @@ template <typename T, typename E> class result {
template <typename E> class result<void, E> {
static_assert(!std::is_same_v<E, void>, "E (error type) must not be void");

bool successful_ = false;
bool successful_;
E error_;

result() = default;

auto make_successful() -> void { successful_ = true; }
auto make_unsuccessful(E error) -> void {
successful_ = false;
error_ = std::move(error);
}
// Named constructors
enum Successful { SUCCESSFUL };
enum Unsuccessful { UNSUCCESSFUL };
explicit result(Successful successful) : successful_(true) {}
result(Unsuccessful unsuccessful, E error) : successful_(false), error_(std::move(error)) {}

template <typename U> friend class ok;
template <typename U> friend class err;
Expand Down
8 changes: 2 additions & 6 deletions src/err/err.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,11 @@ template <typename E> class err {
};

template <typename E> template <typename T> inline err<E>::operator result<T, E>() const {
auto res = result<T, E>();
res.make_unsuccessful(error_);
return res;
return result<T, E>(result<T, E>::Unsuccessful::UNSUCCESSFUL, error_);
}

template <typename E> inline err<E>::operator result<void, E>() const {
auto res = result<void, E>();
res.make_unsuccessful(error_);
return res;
return result<void, E>(result<void, E>::Unsuccessful::UNSUCCESSFUL, error_);
}

} // namespace res
8 changes: 2 additions & 6 deletions src/ok/ok.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,11 @@ template <typename T = std::monostate> class ok {
};

template <typename T> template <typename E> inline ok<T>::operator result<T, E>() const {
auto res = result<T, E>();
res.make_successful(value_);
return res;
return result<T, E>(result<T, E>::Successful::SUCCESSFUL, value_);
}

template <typename T> template <typename E> inline ok<T>::operator result<void, E>() const {
auto res = result<void, E>();
res.make_successful();
return res;
return result<void, E>(result<void, E>::Successful::SUCCESSFUL);
}

} // namespace res
22 changes: 12 additions & 10 deletions src/result/result.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@ template <typename T, typename E> class result {
static_assert(!std::is_same_v<T, void>, "T (value type) must not be void");
static_assert(!std::is_same_v<E, void>, "E (error type) must not be void");

bool successful_ = false;
bool successful_;
T value_;
E error_;

result() = default;
// Simulate named constructors
enum Successful { SUCCESSFUL };
enum Unsuccessful { UNSUCCESSFUL };
result(Successful successful, T value) : successful_(true), value_(std::move(value)) {}
result(Unsuccessful unsuccessful, E error) : successful_(false), error_(std::move(error)) {}

auto make_successful(T value) -> void {
successful_ = true;
Expand Down Expand Up @@ -60,16 +64,14 @@ template <typename T, typename E> class result {
template <typename E> class result<void, E> {
static_assert(!std::is_same_v<E, void>, "E (error type) must not be void");

bool successful_ = false;
bool successful_;
E error_;

result() = default;

auto make_successful() -> void { successful_ = true; }
auto make_unsuccessful(E error) -> void {
successful_ = false;
error_ = std::move(error);
}
// Simulate named constructors
enum Successful { SUCCESSFUL };
enum Unsuccessful { UNSUCCESSFUL };
explicit result(Successful successful) : successful_(true) {}
result(Unsuccessful unsuccessful, E error) : successful_(false), error_(std::move(error)) {}

template <typename U> friend class ok;
template <typename U> friend class err;
Expand Down

0 comments on commit 2591aea

Please sign in to comment.