summaryrefslogtreecommitdiff
path: root/indra/llcommon/llstreamtools.h
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@geenzo.com>2023-08-29 03:40:10 -0700
committerJonathan "Geenz" Goodman <geenz@geenzo.com>2023-08-29 03:40:10 -0700
commitc5bfe869154cd4708c9bca63f08cb4c958198638 (patch)
tree6f79db9976863b2c1ea0f20bbb4049ee0cc98c1c /indra/llcommon/llstreamtools.h
parentfbecd348f897ee91a5639e7e9fe4f0578d72b8e2 (diff)
parent89f2165b4170d9fddc10a55292c28750093a22a0 (diff)
Merge branch 'DRTVWR-559' into DRTVWR-583
Diffstat (limited to 'indra/llcommon/llstreamtools.h')
-rw-r--r--indra/llcommon/llstreamtools.h27
1 files changed, 25 insertions, 2 deletions
diff --git a/indra/llcommon/llstreamtools.h b/indra/llcommon/llstreamtools.h
index 1b04bf91d7..bb7bc20327 100644
--- a/indra/llcommon/llstreamtools.h
+++ b/indra/llcommon/llstreamtools.h
@@ -27,8 +27,10 @@
#ifndef LL_STREAM_TOOLS_H
#define LL_STREAM_TOOLS_H
+#include <deque>
#include <iostream>
#include <string>
+#include <vector>
// unless specifed otherwise these all return input_stream.good()
@@ -113,6 +115,27 @@ LL_COMMON_API std::streamsize fullread(
LL_COMMON_API std::istream& operator>>(std::istream& str, const char *tocheck);
-#endif
-
+/**
+ * cat_streambuf is a std::streambuf subclass that accepts a variadic number
+ * of std::streambuf* (e.g. some_istream.rdbuf()) and virtually concatenates
+ * their contents.
+ */
+// derived from https://stackoverflow.com/a/49441066/5533635
+class cat_streambuf: public std::streambuf
+{
+private:
+ std::deque<std::streambuf*> mInputs;
+ std::vector<char> mBuffer;
+
+public:
+ // only valid for std::streambuf* arguments
+ template <typename... Inputs>
+ cat_streambuf(Inputs... inputs):
+ mInputs{inputs...},
+ mBuffer(1024)
+ {}
+
+ int underflow() override;
+};
+#endif