aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvatar Wouter van Kesteren <woutershep@gmail.com> 2013-04-26 17:44:53 +0200
committerAvatar Wouter van Kesteren <woutershep@gmail.com> 2013-04-28 00:19:21 +0200
commite6f2cd8e251e7360c6b9f0920fefb72c01daa098 (patch)
treee7384a4c7a5ba472fe7de438e5b3d380b53b3765
parent149850cb8bc0d261dd9f93161e5bf1f132fe6ed2 (diff)
downloadpaludis-e6f2cd8e251e7360c6b9f0920fefb72c01daa098.tar.gz
paludis-e6f2cd8e251e7360c6b9f0920fefb72c01daa098.tar.xz
Add StreamHolder
-rw-r--r--paludis/util/files.m41
-rw-r--r--paludis/util/stream_holder.hh123
2 files changed, 124 insertions, 0 deletions
diff --git a/paludis/util/files.m4 b/paludis/util/files.m4
index 28a780c..39c2f2c 100644
--- a/paludis/util/files.m4
+++ b/paludis/util/files.m4
@@ -79,6 +79,7 @@ add(`sha256', `hh', `cc', `gtest')
add(`sha512', `hh', `cc', `gtest')
add(`simple_parser', `hh', `cc', `gtest', `fwd')
add(`singleton', `hh', `impl', `gtest')
+add(`stream_holder', `hh')
add(`stringify', `hh', `gtest')
add(`string_list_stream', `hh', `cc', `fwd', `gtest')
add(`strip', `hh', `cc', `gtest')
diff --git a/paludis/util/stream_holder.hh b/paludis/util/stream_holder.hh
new file mode 100644
index 0000000..dea8c6f
--- /dev/null
+++ b/paludis/util/stream_holder.hh
@@ -0,0 +1,123 @@
+/* vim: set sw=4 sts=4 et foldmethod=syntax : */
+
+/*
+ * Copyright (c) 2013 Wouter van Kesteren <woutershep@gmail.com>
+ *
+ * This file is part of the Paludis package manager. Paludis is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU General
+ * Public License version 2, as published by the Free Software Foundation.
+ *
+ * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef PALUDIS_GUARD_PALUDIS_STREAM_HOLDER_HH
+#define PALUDIS_GUARD_PALUDIS_STREAM_HOLDER_HH 1
+
+#include <paludis/util/attributes.hh>
+#include <utility>
+#include <ostream>
+#include <ios>
+
+namespace paludis
+{
+ /**
+ * Holder for a stream so the destructor can throw.
+ */
+ template <typename Stream_>
+ class PALUDIS_VISIBLE StreamHolder
+ {
+ private:
+ Stream_ s;
+ typedef std::basic_ostream<typename Stream_::char_type, typename Stream_::traits_type> ostream_type;
+ typedef std::basic_ios<typename Stream_::char_type, typename Stream_::traits_type> ios_type;
+
+ public:
+ ///\name Basic operations
+ ///\{
+
+ template<typename... Args_>
+ StreamHolder(Args_ && ... args) : s(std::forward<Args_>(args)...)
+ {
+ }
+
+ ///\}
+
+ ///\name Formatted output
+ ///\{
+
+ template <typename T_>
+ StreamHolder<Stream_>& operator<<(T_ && rhs)
+ {
+ s << std::forward<T_>(rhs);
+ return *this;
+ }
+
+ /**
+ * Overload for stream manipulators (std::endl, std::flush, etc.)
+ *
+ * see 27.7.3.6.3
+ */
+ ostream_type& operator<<(ostream_type& (*rhs)(ostream_type&))
+ {
+ return rhs(s);
+ }
+
+ /**
+ * Overload for stream manipulators (std::endl, std::flush, etc.)
+ *
+ * see 27.7.3.6.3
+ */
+ ostream_type& operator<<(ios_type& (*rhs)(ios_type&))
+ {
+ rhs(s);
+ return s;
+ }
+
+ /**
+ * Overload for stream manipulators (std::endl, std::flush, etc.)
+ *
+ * see 27.7.3.6.3
+ */
+ ostream_type& operator<<(std::ios_base& (*rhs)(std::ios_base&))
+ {
+ rhs(s);
+ return s;
+ }
+
+ ///\}
+
+ ///\name Conversions
+ ///\{
+
+ bool operator!() const
+ {
+ return !s;
+ }
+
+ operator bool() const
+ {
+ return s;
+ }
+
+ operator Stream_&()
+ {
+ return s;
+ }
+
+ operator Stream_*()
+ {
+ return &s;
+ }
+
+ ///\}
+ };
+}
+
+#endif