/* This file is part of
- * ======================================================
+ * ======================================================
*
* LyX, The Document Processor
*
- * Copyright (C) 1995 Matthias Ettrich
- * Copyright (C) 1995-1999 The LyX Team.
+ * Copyright 1995 Matthias Ettrich
+ * Copyright 1995-2001 The LyX Team.
*
- * ======================================================*/
+ * ====================================================== */
#include <config.h>
+#include <algorithm>
+
#ifdef __GNUG__
#pragma implementation
#endif
#include "texrow.h"
-#include "lyxparagraph.h"
+#include "paragraph.h"
#include "debug.h"
+using std::find_if;
+using std::endl;
+
// Delete linked list
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;
-
+ RowItem tmp;
+ tmp.pos(lastpos);
if (lastpar)
- tmp->id = lastpar->GetID();
+ tmp.id(lastpar->id());
else
- tmp->id = -1;
-
- // Inserts at the beginning of the list
- tmp->next = next;
- next = tmp;
- count++;
- tmp->rownumber = count;
+ tmp.id(-1);
+ tmp.rownumber(++count);
+ rowlist.push_back(tmp);
}
-void TexRow::getIdFromRow(int row, int &id, int &pos)
-{
- TexRow_Item *tmp = next;
- while (tmp && tmp->rownumber != row) {
- tmp = tmp->next;
+class same_rownumber {
+public:
+ same_rownumber(TexRow::RowList::value_type const & v):vt(v){}
+ bool operator()(TexRow::RowList::value_type const & vt1) const {
+ return vt.rownumber() == vt1.rownumber();
}
- 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;
+private:
+ TexRow::RowList::value_type const & vt;
+};
+
+
+
+bool TexRow::getIdFromRow(int row, int & id, int & pos) const
+{
+ RowList::value_type vt;
+ vt.rownumber(row);
+ RowList::const_iterator cit =
+ find_if(rowlist.begin(), rowlist.end(), same_rownumber(vt));
+
+ if (cit != rowlist.end()) {
+ id = cit->id();
+ pos = cit->pos();
+ return true;
}
+ id = -1;
+ pos = 0;
+ return false;
}
-TexRow & TexRow::operator+=(const TexRow &tr)
+// should perhaps have a better name...
+// Increase the pos of all rows with the
+// same id (and where the pos is larger)
+// to avoid putting errorinsets at the
+// same pos.
+void TexRow::increasePos(int id, int pos) const
{
- // 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;
+ RowList::iterator kit = rowlist.begin();
+ RowList::iterator end = rowlist.end();
+ for (; kit != end; ++kit) {
+ if (id == kit->id()
+ && pos < kit->pos()) {
+ kit->pos(kit->pos() + 1);
+ lyxerr[Debug::INFO]
+ << "TeXRow::increasePos: ideally this "
+ "should never happen..." << endl;
+ }
+ // When verified to work this clause should be deleted.
+ if (id == kit->id()
+ && pos == kit->pos()) {
+ lyxerr[Debug::INFO]
+ << "TexRow::increasePos: this should happen "
+ "maximum one time for each run of "
+ "increasePos!" << endl;
}
-
- ++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;
}