/* iostream specialisations for result and outcome
-(C) 2017-2020 Niall Douglas <http://www.nedproductions.biz/> (21 commits)
+(C) 2017-2022 Niall Douglas <http://www.nedproductions.biz/> (21 commits)
File Created: July 2017
{
template <class T> typename std::add_lvalue_reference<T>::type lvalueref() noexcept;
- template <class T> inline std::ostream &operator<<(std::ostream &s, const value_storage_trivial<T> &v)
+ template <template <class, class> class ValueStorage, class T, class E> inline std::ostream &value_storage_out(std::ostream &s, const ValueStorage<T, E> &v)
{
s << static_cast<uint16_t>(v._status.status_value) << " " << v._status.spare_storage_value << " ";
if(v._status.have_value())
{
s << v._value; // NOLINT
}
+ if(v._status.have_error())
+ {
+ s << v._error; // NOLINT
+ }
return s;
}
- inline std::ostream &operator<<(std::ostream &s, const value_storage_trivial<void> &v)
+ template <template <class, class> class ValueStorage, class E> inline std::ostream &value_storage_out(std::ostream &s, const ValueStorage<void, E> &v)
{
s << static_cast<uint16_t>(v._status.status_value) << " " << v._status.spare_storage_value << " ";
+ if(v._status.have_error())
+ {
+ s << v._error; // NOLINT
+ }
return s;
}
- template <class T> inline std::ostream &operator<<(std::ostream &s, const value_storage_nontrivial<T> &v)
+ template <template <class, class> class ValueStorage, class T> inline std::ostream &value_storage_out(std::ostream &s, const ValueStorage<T, void> &v)
{
s << static_cast<uint16_t>(v._status.status_value) << " " << v._status.spare_storage_value << " ";
if(v._status.have_value())
}
return s;
}
- template <class T> inline std::istream &operator>>(std::istream &s, value_storage_trivial<T> &v)
+
+ template <class T, class E> inline std::ostream &operator<<(std::ostream &s, const value_storage_trivial<T, E> &v) { return value_storage_out(s, v); }
+ template <class T, class E> inline std::ostream &operator<<(std::ostream &s, const value_storage_nontrivial<T, E> &v) { return value_storage_out(s, v); }
+
+ template <template <class, class> class ValueStorage, class T, class E> inline std::istream &value_storage_in(std::istream &s, ValueStorage<T, E> &v)
{
- v = value_storage_trivial<T>();
+ using type = ValueStorage<T, E>;
+ v.~type();
+ new(&v) type;
uint16_t x, y;
s >> x >> y;
v._status.status_value = static_cast<detail::status>(x);
new(&v._value) decltype(v._value)(); // NOLINT
s >> v._value; // NOLINT
}
+ if(v._status.have_error())
+ {
+ new(&v._error) decltype(v._error)(); // NOLINT
+ s >> v._error; // NOLINT
+ }
return s;
}
- inline std::istream &operator>>(std::istream &s, value_storage_trivial<devoid<void>> &v)
+ template <template <class, class> class ValueStorage, class E> inline std::istream &value_storage_in(std::istream &s, ValueStorage<void, E> &v)
{
- v = value_storage_trivial<devoid<void>>();
+ using type = ValueStorage<void, E>;
+ v.~type();
+ new(&v) type;
uint16_t x, y;
s >> x >> y;
v._status.status_value = static_cast<detail::status>(x);
v._status.spare_storage_value = y;
+ if(v._status.have_error())
+ {
+ new(&v._error) decltype(v._error)(); // NOLINT
+ s >> v._error; // NOLINT
+ }
return s;
}
- template <class T> inline std::istream &operator>>(std::istream &s, value_storage_nontrivial<T> &v)
+ template <template <class, class> class ValueStorage, class T> inline std::istream &value_storage_in(std::istream &s, ValueStorage<T, void> &v)
{
- v = value_storage_nontrivial<T>();
+ using type = ValueStorage<T, void>;
+ v.~type();
+ new(&v) type;
uint16_t x, y;
s >> x >> y;
v._status.status_value = static_cast<detail::status>(x);
}
return s;
}
+ template <class T, class E> inline std::istream &operator>>(std::istream &s, value_storage_trivial<T, E> &v) { return value_storage_in(s, v); }
+ template <class T, class E> inline std::istream &operator>>(std::istream &s, value_storage_nontrivial<T, E> &v) { return value_storage_in(s, v); }
BOOST_OUTCOME_TEMPLATE(class T)
BOOST_OUTCOME_TREQUIRES(BOOST_OUTCOME_TPRED(!std::is_constructible<std::error_code, T>::value))
inline std::string safe_message(T && /*unused*/) { return {}; }