#include "DocIterator.h"
-#include "support/debug.h"
#include "InsetList.h"
#include "Paragraph.h"
#include "Text.h"
#include "insets/InsetTabular.h"
-#include <boost/assert.hpp>
+#include "support/debug.h"
+
+#include "support/assert.h"
#include <ostream>
Inset * DocIterator::nextInset() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
if (pos() == lastpos())
return 0;
if (pos() > lastpos()) {
}
if (inMathed())
return nextAtom().nucleus();
- return paragraph().isInset(pos()) ? paragraph().getInset(pos()) : 0;
+ return paragraph().getInset(pos());
}
Inset * DocIterator::prevInset() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
if (pos() == 0)
return 0;
if (inMathed()) {
else
return prevAtom().nucleus();
}
- return paragraph().isInset(pos() - 1) ? paragraph().getInset(pos() - 1) : 0;
+ return paragraph().getInset(pos() - 1);
}
Inset * DocIterator::realInset() const
{
- BOOST_ASSERT(inTexted());
+ LASSERT(inTexted(), /**/);
// if we are in a tabular, we need the cell
if (inset().lyxCode() == TABULAR_CODE) {
InsetTabular & tabular = static_cast<InsetTabular&>(inset());
MathAtom & DocIterator::prevAtom() const
{
- BOOST_ASSERT(!empty());
- BOOST_ASSERT(pos() > 0);
+ LASSERT(!empty(), /**/);
+ LASSERT(pos() > 0, /**/);
return cell()[pos() - 1];
}
MathAtom & DocIterator::nextAtom() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
//lyxerr << "lastpos: " << lastpos() << " next atom:\n" << *this << endl;
- BOOST_ASSERT(pos() < lastpos());
+ LASSERT(pos() < lastpos(), /**/);
return cell()[pos()];
}
Text * DocIterator::text() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
return top().text();
}
{
if (!inTexted())
LYXERR0(*this);
- BOOST_ASSERT(inTexted());
+ LASSERT(inTexted(), /**/);
return top().paragraph();
}
Paragraph & DocIterator::innerParagraph() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
return innerTextSlice().paragraph();
}
CursorSlice const & DocIterator::innerTextSlice() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
// go up until first non-0 text is hit
// (innermost text is 0 in mathed)
for (int i = depth() - 1; i >= 0; --i)
// This case is in principe not possible. We _must_
// be inside a Text.
- BOOST_ASSERT(false);
+ LASSERT(false, /**/);
static CursorSlice dummy;
return dummy;
}
MathData & DocIterator::cell() const
{
-// BOOST_ASSERT(inMathed());
+// LASSERT(inMathed(), /**/);
return top().cell();
}
Text * DocIterator::innerText() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
// go up until first non-0 text is hit
// (innermost text is 0 in mathed)
for (int i = depth() - 1; i >= 0; --i)
CursorSlice & tip = top();
//lyxerr << "XXX\n" << *this << endl;
- // this is used twice and shows up in the profiler!
- pos_type const lastp = lastpos();
-
- // move into an inset to the right if possible
- Inset * n = 0;
-
- if (tip.pos() != lastp) {
- // this is impossible for pos() == size()
- if (inMathed()) {
+ // not at cell/paragraph end?
+ if (tip.pos() != tip.lastpos()) {
+ // move into an inset to the right if possible
+ Inset * n = 0;
+ if (inMathed())
n = (tip.cell().begin() + tip.pos())->nucleus();
- } else {
- if (paragraph().isInset(tip.pos()))
- n = paragraph().getInset(tip.pos());
+ else
+ n = paragraph().getInset(tip.pos());
+ if (n && n->isActive()) {
+ //lyxerr << "... descend" << endl;
+ push_back(CursorSlice(*n));
+ return;
}
}
- if (n && n->isActive()) {
- //lyxerr << "... descend" << endl;
- push_back(CursorSlice(*n));
- return;
- }
-
+ // jump to the next cell/paragraph if possible
if (!tip.at_end()) {
tip.forwardPos();
return;
}
+
// otherwise leave inset and jump over inset as a whole
pop_back();
// 'tip' is invalid now...
return;
}
+ // at inset beginning?
if (top().at_begin()) {
pop_back();
return;
top().backwardPos();
+ // entered another cell/paragraph from the right?
+ if (top().pos() == top().lastpos())
+ return;
+
// move into an inset to the left if possible
Inset * n = 0;
-
- if (inMathed()) {
+ if (inMathed())
n = (top().cell().begin() + top().pos())->nucleus();
- } else {
- if (paragraph().isInset(top().pos()))
- n = paragraph().getInset(top().pos());
- }
-
+ else
+ n = paragraph().getInset(top().pos());
if (n && n->isActive()) {
push_back(CursorSlice(*n));
top().idx() = lastidx();
size_t const n = slices_.size();
slices_.resize(0);
for (size_t i = 0 ; i < n; ++i) {
- BOOST_ASSERT(inset);
+ LASSERT(inset, /**/);
push_back(dit[i]);
top().inset_ = inset;
if (i + 1 != n)
bool DocIterator::fixIfBroken()
{
+ if (empty())
+ return false;
+
// Go through the slice stack from the bottom.
// Check that all coordinates (idx, pit, pos) are correct and
// that the inset is the one which is claimed to be there
// get inset which is supposed to be in the next slice
if (cs.inset().inMathed())
inset = (cs.cell().begin() + cs.pos())->nucleus();
- else if (cs.paragraph().isInset(cs.pos()))
- inset = cs.paragraph().getInset(cs.pos());
+ else if (Inset * csInset = cs.paragraph().getInset(cs.pos()))
+ inset = csInset;
else {
// there are slices left, so there must be another inset
break;
}
-DocIterator::idx_type DocIterator::find(MathData const & cell) const
+int DocIterator::find(MathData const & cell) const
{
for (size_t l = 0; l != slices_.size(); ++l) {
if (slices_[l].asInsetMath() && &slices_[l].cell() == &cell)
}
-DocIterator::idx_type DocIterator::find(InsetMath const * inset) const
+int DocIterator::find(Inset const * inset) const
{
for (size_t l = 0; l != slices_.size(); ++l) {
- if (slices_[l].asInsetMath() == inset)
+ if (&slices_[l].inset() == inset)
return l;
}
return -1;
}
-void DocIterator::cutOff(DocIterator::idx_type above, vector<CursorSlice> & cut)
+void DocIterator::cutOff(int above, vector<CursorSlice> & cut)
{
cut = vector<CursorSlice>(slices_.begin() + above + 1, slices_.end());
slices_.resize(above + 1);
}
-void DocIterator::cutOff(DocIterator::idx_type above)
+void DocIterator::cutOff(int above)
{
slices_.resize(above + 1);
}