]> git.lyx.org Git - lyx.git/blobdiff - src/texrow.C
remove noload/don't typeset
[lyx.git] / src / texrow.C
index 8b218f23ad28a94d9d00549b675f410887a6b0ef..80c198ea22edab134a9b2dd79d30856675a5a0af 100644 (file)
-/* This file is part of
- * ====================================================== 
- * 
- *           LyX, The Document Processor
- *      
- *         Copyright (C) 1995 Matthias Ettrich
- *          Copyright (C) 1995-1999 The LyX Team.
+/**
+ * \file texrow.C
+ * Copyright 1995-2002 the LyX Team
+ * Read the file COPYING
  *
- * ====================================================== */
+ * \author Matthias Ettrich
+ */
 
 #include <config.h>
 
+#include <algorithm>
+
 #ifdef __GNUG__
 #pragma implementation
 #endif
 
 #include "texrow.h"
-#include "lyxparagraph.h"
+#include "paragraph.h"
 #include "debug.h"
 
-// Delete linked list
+using std::find_if;
+using std::for_each;
+using std::endl;
+
+namespace {
+/// function object returning true when row number is found
+class same_rownumber {
+public:
+       same_rownumber(int row) : row_(row) {}
+       bool operator()(TexRow::RowList::value_type const & vt) const {
+               return vt.rownumber() == row_;
+       }
+private:
+       int row_;
+};
+
+
+/// increment the pos value of the argument if the par id
+/// is the same, and the pos parameter is larger
+class increase_pos {
+public:
+       increase_pos(int id, int pos)
+               : id_(id), pos_(pos) {}
+
+       void operator()(TexRow::RowList::value_type & vt) const {
+               if (vt.id() != id_ || vt.pos() >= pos_)
+                       return;
+               vt.pos(vt.pos() + 1);
+               lyxerr[Debug::INFO]
+                       << "TeXRow::increasePos: ideally this "
+                       "should never happen..." << endl;
+
+               // FIXME: When verified to work this clause should be deleted.
+               if (id_ == vt.id() && pos_ == vt.pos()) {
+                       lyxerr[Debug::INFO]
+                               << "TexRow::increasePos: this should happen "
+                               "maximum one time for each run of "
+                               "increasePos!" << endl;
+               }
+       }
+
+private:
+       int id_;
+       int pos_;
+};
+} // namespace anon 
+
 void TexRow::reset()
 {
-       TexRow_Item *current, *iter = next;
-       while (iter) {
-               // Iterate through the list deleting as you go.
-               // A bit easier to debug than recursive deletion.
-               current = iter;
-               iter = iter->next;
-               delete current;
-       }
+       rowlist.clear();
        count = 0;
-       next = 0;
        lastpar = 0;
        lastpos = -1;
 }
 
-// Defines paragraph and position for the beginning of this row
-void TexRow::start(LyXParagraph *par, int pos) {
+
+void TexRow::start(Paragraph * par, int pos)
+{
        lastpar = par;
        lastpos = pos;
 }
 
-// Insert node when line is completed
+
 void TexRow::newline()
 {
-       TexRow_Item *tmp = new TexRow_Item;
-       tmp->pos = lastpos;
-       
-       if (lastpar)
-               tmp->id = lastpar->GetID();
-       else
-               tmp->id = -1;
-
-       // Inserts at the beginning of the list
-       tmp->next = next;
-       next = tmp;
-       count++;
-       tmp->rownumber = count;
+       int const id = lastpar ? lastpar->id() : -1;
+       RowList::value_type tmp(id, lastpos, ++count);
+       rowlist.push_back(tmp);
 }
 
 
-void TexRow::getIdFromRow(int row, int &id, int &pos)
+bool TexRow::getIdFromRow(int row, int & id, int & pos) const
 {
-       TexRow_Item *tmp = next;
-       while (tmp && tmp->rownumber != row) {
-               tmp = tmp->next;
-       }
-       if (tmp) {
-               TexRow_Item *tmp2 = next;
-               // Increase the pos of all rows with the
-               // same id (and where the pos is larger)
-               // to avoid putting errorinsets at the
-               // same pos.
-               while (tmp2) {
-                       if (tmp2 != tmp &&
-                           tmp2->id == tmp->id &&
-                           tmp2->pos >= tmp->pos)
-                               tmp2->pos++;
-                       tmp2 = tmp2->next;
-               }
-               id = tmp->id;
-               pos = tmp->pos;
-       } else {
-               id = -1;
-               pos = 0;
+       RowList::const_iterator cit =
+               find_if(rowlist.begin(), rowlist.end(), 
+                       same_rownumber(row));
+       if (cit != rowlist.end()) {
+               id = cit->id();
+               pos = cit->pos();
+               return true;
        }
+       id = -1;
+       pos = 0;
+       return false;
 }
 
 
-TexRow & TexRow::operator+= (const TexRow &tr)
+void TexRow::increasePos(int id, int pos)
 {
-       // remember that the lists are stored in reverse 
-       // so you've got to turn the second one around 
-       // as you insert it in the first
-       for (int counter = tr.count; counter > 0; --counter) {
-               int i = 1;
-               TexRow_Item *iter = tr.next;
-               while (i < counter) {
-                       iter = iter->next;
-                       ++i;
-               }
+       for_each(rowlist.begin(), rowlist.end(), increase_pos(id, pos));
+}
 
-               ++count;
-               TexRow_Item *tmp;
-               tmp = new TexRow_Item;
-               tmp->id = iter->id;
-               tmp->pos = iter->pos;
-               tmp->next = next;
-               tmp->rownumber = count;
-               next = tmp;
-       }
-       // should I be doing this or not?
-       //lastpar = tr.lastpar;
-       //lastpos = tr.lastpos;
+
+TexRow & TexRow::operator+=(TexRow const & tr)
+{
+       rowlist.insert(rowlist.end(), tr.rowlist.begin(), tr.rowlist.end());
        return *this;
-}      
+}