forked from KPGPMC/furlang
fix(result, furlang): fix value construction for error result constructor
This commit is contained in:
@@ -42,12 +42,12 @@ public:
|
|||||||
|
|
||||||
explicit result(const error_type& error)
|
explicit result(const error_type& error)
|
||||||
: m_error(true) {
|
: m_error(true) {
|
||||||
m_value.error = error;
|
new (&m_value.error) error_type(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit result(error_type&& error)
|
explicit result(error_type&& error)
|
||||||
: m_error(true) {
|
: m_error(true) {
|
||||||
m_value.error = std::move(error);
|
new (&m_value.error) error_type(std::move(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
~result() {
|
~result() {
|
||||||
@@ -58,17 +58,43 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result(result&& other) noexcept {}
|
result(result&& other) noexcept
|
||||||
|
: m_error(other.m_error) {
|
||||||
|
if (m_error) {
|
||||||
|
new (&m_value.error) error_type(std::move(other.m_value.error));
|
||||||
|
} else {
|
||||||
|
new (&m_value.result) value_type(std::move(other.m_value.result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result& operator=(result&& other) noexcept {
|
result& operator=(result&& other) noexcept {
|
||||||
if (this == &other) return *this;
|
if (this == &other) return *this;
|
||||||
|
m_error = other.m_error;
|
||||||
|
if (m_error) {
|
||||||
|
new (&m_value.error) error_type(std::move(other.m_value.error));
|
||||||
|
} else {
|
||||||
|
new (&m_value.result) value_type(std::move(other.m_value.result));
|
||||||
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
result(const result& other) {}
|
result(const result& other)
|
||||||
|
: m_error(other.m_error) {
|
||||||
|
if (m_error) {
|
||||||
|
new (&m_value.error) error_type(other.m_value.error);
|
||||||
|
} else {
|
||||||
|
new (&m_value.result) value_type(other.m_value.result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result& operator=(const result& other) {
|
result& operator=(const result& other) {
|
||||||
if (this == &other) return *this;
|
if (this == &other) return *this;
|
||||||
|
m_error = other.m_error;
|
||||||
|
if (m_error) {
|
||||||
|
new (&m_value.error) error_type(other.m_value.error);
|
||||||
|
} else {
|
||||||
|
new (&m_value.result) value_type(other.m_value.result);
|
||||||
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
@@ -134,6 +160,14 @@ private:
|
|||||||
union value {
|
union value {
|
||||||
value_type result;
|
value_type result;
|
||||||
error_type error;
|
error_type error;
|
||||||
|
|
||||||
|
value() {}
|
||||||
|
~value() {}
|
||||||
|
|
||||||
|
value(value&&) noexcept {}
|
||||||
|
value& operator=(value&&) noexcept {}
|
||||||
|
value(const value&) {}
|
||||||
|
value& operator=(const value&) {}
|
||||||
} m_value;
|
} m_value;
|
||||||
bool m_error = false;
|
bool m_error = false;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user