]> git.lyx.org Git - lyx.git/blobdiff - src/texstream.h
Fix compiler warning about unused string consts
[lyx.git] / src / texstream.h
index 282d210163189bb5e0a93bf816e2ca2b652bebf3..a14f84bf95fec38f64fe101b594c513a6d6532c9 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 and also to ensure that no blank lines may be inadvertently output.
+    code.
+  */
+
+class otexrowstream {
+public:
+       ///
+       explicit otexrowstream(odocstream & os);
+       /// defaulted
+       ~otexrowstream();
+       ///
+       odocstream & os() { return os_; }
+       ///
+       TexRow & texrow() { return *texrow_; }
+       ///
+       unique_ptr<TexRow> releaseTexRow();
+       ///
+       void put(char_type const & c);
+       ///
+       void append(TexString ts);
+private:
+       ///
+       odocstream & os_;
+       ///
+       unique_ptr<TexRow> texrow_;
+};
+
+///
+otexrowstream & operator<<(otexrowstream &, odocstream_manip);
+///
+otexrowstream & operator<<(otexrowstream &, TexString);
+///
+otexrowstream & operator<<(otexrowstream &, docstring const &);
+///
+otexrowstream & operator<<(otexrowstream &, std::string const &);
+///
+otexrowstream & operator<<(otexrowstream &, char const *);
+///
+otexrowstream & operator<<(otexrowstream &, char);
+///
+template <typename Type>
+otexrowstream & operator<<(otexrowstream & ots, Type value);
+
+
+/** Subclass for otexrowstream.
+    This class is used to ensure that no blank lines may be inadvertently output.
     To this end, use the special variables "breakln" and "safebreakln" as if
     they were iomanip's to ensure that the next output will start at the
     beginning of a line. Using "breakln", a '\n' char will be output if needed,
@@ -28,19 +76,18 @@ namespace lyx {
     a paragraph break was just output.
   */
 
-class otexstream {
+class otexstream : public otexrowstream {
 public:
        ///
-       otexstream(odocstream & os, TexRow & texrow)
-               : os_(os), texrow_(texrow), canbreakline_(false),
-                 protectspace_(false), parbreak_(true), lastchar_(0) {}
-       ///
-       odocstream & os() { return os_; }
-       ///
-       TexRow & texrow() { return texrow_; }
+       explicit otexstream(odocstream & os)
+               : otexrowstream(os), canbreakline_(false),
+                 protectspace_(false), terminate_command_(false),
+                 parbreak_(true), blankline_(true), lastchar_(0) {}
        ///
        void put(char_type const & c);
        ///
+       void append(TexString ts);
+       ///
        void canBreakLine(bool breakline) { canbreakline_ = breakline; }
        ///
        bool canBreakLine() const { return canbreakline_; }
@@ -49,9 +96,14 @@ public:
        ///
        bool protectSpace() const { return protectspace_; }
        ///
+       void terminateCommand(bool terminate) { terminate_command_ = terminate; }
+       ///
+       bool terminateCommand() const { return terminate_command_; }
+       ///
        void lastChar(char_type const & c)
        {
                parbreak_ = (!canbreakline_ && c == '\n');
+               blankline_ = ((!canbreakline_ && c == ' ') || c == '\n');
                canbreakline_ = (c != '\n');
                lastchar_ = c;
        }
@@ -59,21 +111,42 @@ public:
        char_type lastChar() const { return lastchar_; }
        ///
        bool afterParbreak() const { return parbreak_; }
-private:
-       ///
-       odocstream & os_;
        ///
-       TexRow & texrow_;
+       bool blankLine() const { return blankline_; }
+private:
        ///
        bool canbreakline_;
        ///
        bool protectspace_;
        ///
+       bool terminate_command_;
+       ///
        bool parbreak_;
        ///
+       bool blankline_;
+       ///
        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;
@@ -83,16 +156,26 @@ struct SafeBreakLine {
        char n;
 };
 
+/// Helper structs for terminating a command
+struct TerminateCommand {
+       char n;
+};
+
 extern BreakLine breakln;
 extern SafeBreakLine safebreakln;
+extern TerminateCommand termcmd;
 
 ///
 otexstream & operator<<(otexstream &, BreakLine);
 ///
 otexstream & operator<<(otexstream &, SafeBreakLine);
 ///
+otexstream & operator<<(otexstream &, TerminateCommand);
+///
 otexstream & operator<<(otexstream &, odocstream_manip);
 ///
+otexstream & operator<<(otexstream &, TexString);
+///
 otexstream & operator<<(otexstream &, docstring const &);
 ///
 otexstream & operator<<(otexstream &, std::string const &);
@@ -104,6 +187,7 @@ otexstream & operator<<(otexstream &, char);
 template <typename Type>
 otexstream & operator<<(otexstream & ots, Type value);
 
-}
+
+} // namespace lyx
 
 #endif