X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ftexrow.C;h=9e1b10e5634be4c4215564b96f0e1d039a0f4d85;hb=530749439472bddf13d9f4ee74ee6184ef76e3f9;hp=ae847224dc14f21a9c256f11f100dfd99f02e0d0;hpb=27de1486ca34aaad446adb798d71a77d6f6304da;p=lyx.git diff --git a/src/texrow.C b/src/texrow.C index ae847224dc..9e1b10e563 100644 --- a/src/texrow.C +++ b/src/texrow.C @@ -1,123 +1,85 @@ -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright (C) 1995 Matthias Ettrich - * Copyright (C) 1995-1998 The LyX Team. +/** + * \file texrow.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - *======================================================*/ + * \author Matthias Ettrich + * \author Lars Gullik Bjønnes + * \author John Levon + * + * Full author contact details are available in file CREDITS. + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "texrow.h" -#include "lyxparagraph.h" -#include "error.h" +#include "debug.h" + +#include + +using std::find_if; + + +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_; +}; -// $Id: texrow.C,v 1.1 1999/09/27 18:44:38 larsbj Exp $ +} // namespace anon -#if !defined(lint) && !defined(WITH_WARNINGS) -static char vcid[] = "$Id: texrow.C,v 1.1 1999/09/27 18:44:38 larsbj Exp $"; -#endif /* lint */ -// 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; + lastid = -1; lastpos = -1; } -// Defines paragraph and position for the beginning of this row -void TexRow::start(LyXParagraph *par, int pos) { - lastpar = par; + +void TexRow::start(int id, int pos) +{ + lastid = id; 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 = lastid; + 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) +TexRow & TexRow::operator+=(TexRow const & tr) { - // 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; - } - - ++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; + rowlist.insert(rowlist.end(), tr.rowlist.begin(), tr.rowlist.end()); return *this; -} +}