summaryrefslogtreecommitdiff
path: root/indra/llcommon/llstreamtools.h
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2023-09-11 10:26:41 -0400
committerNat Goodspeed <nat@lindenlab.com>2023-09-11 10:26:41 -0400
commit947483cf14bdfcea5e0456fe00662aedfe068809 (patch)
treeffddb6bc27a2cf1bcc662f28bf1024c80291c997 /indra/llcommon/llstreamtools.h
parentdc8f2ae2ba1a1348f86f412df7f769e6cc2fe541 (diff)
parent7b54f077b48740c69559c0a2089b6133ed8eb605 (diff)
DRTVWR-588: Merge 'DRTVWR-588-maint-W' into DRTVWR-588-cleanup-timers
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