]> git.lyx.org Git - lyx.git/blobdiff - src/texstream.h
Cmake build: Prepare for hardening use of external programs
[lyx.git] / src / texstream.h
index 4fff211146d57da631f1e6f7b79bf72bb8bd5efc..e5450ce7417a53a84b77672fcd69225d56c6b4ec 100644 (file)
 #ifndef LYX_TEXSTREAM_H
 #define LYX_TEXSTREAM_H
 
-#include "TexRow.h"
 #include "support/docstream.h"
+#include "support/unique_ptr.h"
 
 namespace lyx {
 
+class TexRow;
+struct TexString;
+
+
 /** Wrapper class for odocstream.
     This class is used to automatically count the lines of the exported latex
     code.
@@ -25,24 +29,31 @@ namespace lyx {
 class otexrowstream {
 public:
        ///
-       otexrowstream(odocstream & os, TexRow & texrow)
-               : os_(os), texrow_(texrow) {}
+       explicit otexrowstream(odocstream & os);
+       /// defaulted
+       ~otexrowstream();
        ///
        odocstream & os() { return os_; }
        ///
-       TexRow & texrow() { return texrow_; }
+       TexRow & texrow() { return *texrow_; }
+       ///
+       unique_ptr<TexRow> releaseTexRow();
        ///
        void put(char_type const & c);
+       ///
+       void append(TexString ts);
 private:
        ///
        odocstream & os_;
        ///
-       TexRow & texrow_;
+       unique_ptr<TexRow> texrow_;
 };
 
 ///
 otexrowstream & operator<<(otexrowstream &, odocstream_manip);
 ///
+otexrowstream & operator<<(otexrowstream &, TexString);
+///
 otexrowstream & operator<<(otexrowstream &, docstring const &);
 ///
 otexrowstream & operator<<(otexrowstream &, std::string const &);
@@ -68,12 +79,14 @@ otexrowstream & operator<<(otexrowstream & ots, Type value);
 class otexstream : public otexrowstream {
 public:
        ///
-       otexstream(odocstream & os, TexRow & texrow)
-               : otexrowstream(os, texrow), canbreakline_(false),
+       explicit otexstream(odocstream & os)
+               : otexrowstream(os), canbreakline_(false),
                  protectspace_(false), parbreak_(true), lastchar_(0) {}
        ///
        void put(char_type const & c);
        ///
+       void append(TexString ts);
+       ///
        void canBreakLine(bool breakline) { canbreakline_ = breakline; }
        ///
        bool canBreakLine() const { return canbreakline_; }
@@ -103,6 +116,25 @@ private:
        char_type lastchar_;
 };
 
+
+/// because we need to pass ods_ to the base class
+struct otexstringstream_helper { odocstringstream ods_; };
+
+/// otexstringstream : a odocstringstream with tex/row correspondence
+class otexstringstream : otexstringstream_helper, public otexstream {
+public:
+       otexstringstream() : otexstringstream_helper(), otexstream(ods_) {}
+       ///
+       docstring str() const { return ods_.str(); }
+       ///
+       size_t length();
+       ///
+       bool empty() { return 0 == length(); }
+       /// move-returns the contents and reset the texstream
+       TexString release();
+};
+
+
 /// Helper structs for breaking a line
 struct BreakLine {
        char n;
@@ -122,6 +154,8 @@ otexstream & operator<<(otexstream &, SafeBreakLine);
 ///
 otexstream & operator<<(otexstream &, odocstream_manip);
 ///
+otexstream & operator<<(otexstream &, TexString);
+///
 otexstream & operator<<(otexstream &, docstring const &);
 ///
 otexstream & operator<<(otexstream &, std::string const &);
@@ -133,6 +167,7 @@ otexstream & operator<<(otexstream &, char);
 template <typename Type>
 otexstream & operator<<(otexstream & ots, Type value);
 
+
 }
 
 #endif