]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/outcome/iostream_support.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / outcome / iostream_support.hpp
index c3e9855da2f055fb9568ba552c97f71a5cd51c3b..e366d333f373bee6b8f4b1fc1d8a357b28ed0ba6 100644 (file)
@@ -1,5 +1,5 @@
 /* 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
 
 
@@ -42,21 +42,29 @@ namespace detail
 {
   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())
@@ -65,9 +73,15 @@ namespace detail
     }
     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);
@@ -77,20 +91,34 @@ namespace detail
       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);
@@ -102,6 +130,8 @@ namespace detail
     }
     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 {}; }