summaryrefslogtreecommitdiff
path: root/src/third_party/boost-1.69.0/boost/iostreams/detail/wrap_unwrap.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/boost-1.69.0/boost/iostreams/detail/wrap_unwrap.hpp')
-rw-r--r--src/third_party/boost-1.69.0/boost/iostreams/detail/wrap_unwrap.hpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/third_party/boost-1.69.0/boost/iostreams/detail/wrap_unwrap.hpp b/src/third_party/boost-1.69.0/boost/iostreams/detail/wrap_unwrap.hpp
new file mode 100644
index 00000000000..f5f97897f9e
--- /dev/null
+++ b/src/third_party/boost-1.69.0/boost/iostreams/detail/wrap_unwrap.hpp
@@ -0,0 +1,98 @@
+// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
+// (C) Copyright 2003-2007 Jonathan Turkanis
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
+
+// See http://www.boost.org/libs/iostreams for documentation.
+
+#ifndef BOOST_IOSTREAMS_DETAIL_WRAP_UNWRAP_HPP_INCLUDED
+#define BOOST_IOSTREAMS_DETAIL_WRAP_UNWRAP_HPP_INCLUDED
+
+#if defined(_MSC_VER)
+# pragma once
+#endif
+
+#include <boost/config.hpp> // SFINAE, MSVC.
+#include <boost/detail/workaround.hpp>
+#include <boost/iostreams/detail/enable_if_stream.hpp>
+#include <boost/iostreams/traits_fwd.hpp> // is_std_io.
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/eval_if.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/ref.hpp>
+
+namespace boost { namespace iostreams { namespace detail {
+
+//------------------Definition of wrap/unwrap traits--------------------------//
+
+template<typename T>
+struct wrapped_type
+ : mpl::if_<is_std_io<T>, reference_wrapper<T>, T>
+ { };
+
+template<typename T>
+struct unwrapped_type
+ : unwrap_reference<T>
+ { };
+
+template<typename T>
+struct unwrap_ios
+ : mpl::eval_if<
+ is_std_io<T>,
+ unwrap_reference<T>,
+ mpl::identity<T>
+ >
+ { };
+
+//------------------Definition of wrap----------------------------------------//
+
+#ifndef BOOST_NO_SFINAE //----------------------------------------------------//
+ template<typename T>
+ inline T wrap(const T& t BOOST_IOSTREAMS_DISABLE_IF_STREAM(T))
+ { return t; }
+
+ template<typename T>
+ inline typename wrapped_type<T>::type
+ wrap(T& t BOOST_IOSTREAMS_ENABLE_IF_STREAM(T)) { return boost::ref(t); }
+#else // #ifndef BOOST_NO_SFINAE //-------------------------------------------//
+ template<typename T>
+ inline typename wrapped_type<T>::type // BCC 5.x needs namespace qualification.
+ wrap_impl(const T& t, mpl::true_) { return boost::ref(const_cast<T&>(t)); }
+
+ template<typename T>
+ inline typename wrapped_type<T>::type // BCC 5.x needs namespace qualification.
+ wrap_impl(T& t, mpl::true_) { return boost::ref(t); }
+
+ template<typename T>
+ inline typename wrapped_type<T>::type
+ wrap_impl(const T& t, mpl::false_) { return t; }
+
+ template<typename T>
+ inline typename wrapped_type<T>::type
+ wrap_impl(T& t, mpl::false_) { return t; }
+
+ template<typename T>
+ inline typename wrapped_type<T>::type
+ wrap(const T& t) { return wrap_impl(t, is_std_io<T>()); }
+
+ template<typename T>
+ inline typename wrapped_type<T>::type
+ wrap(T& t) { return wrap_impl(t, is_std_io<T>()); }
+#endif // #ifndef BOOST_NO_SFINAE //------------------------------------------//
+
+//------------------Definition of unwrap--------------------------------------//
+
+template<typename T>
+typename unwrapped_type<T>::type&
+unwrap(const reference_wrapper<T>& ref) { return ref.get(); }
+
+template<typename T>
+typename unwrapped_type<T>::type& unwrap(T& t) { return t; }
+
+template<typename T>
+const typename unwrapped_type<T>::type& unwrap(const T& t) { return t; }
+
+} } } // End namespaces detail, iostreams, boost.
+
+#endif // #ifndef BOOST_IOSTREAMS_DETAIL_WRAP_UNWRAP_HPP_INCLUDED