#include <boost/next_prior.hpp>
+
using boost::prior;
+PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
+ lyx::pos_type pos)
+{
+ stack_.push_back(PosIteratorItem(pl, pit, pos));
+}
+
+
+PosIterator::PosIterator(BufferView & bv)
+{
+ LyXText * text = bv.getLyXText();
+ lyx::pos_type pos = text->cursor().pos();
+ ParagraphList::iterator pit = text->cursorPar();
+
+ ParIterator par = bv.buffer()->par_iterator_begin();
+ ParIterator end = bv.buffer()->par_iterator_end();
+ for (; par != end; ++par) {
+ if (par.pit() == pit)
+ break;
+ }
+ setFrom(par, pos);
+}
+
+
+PosIterator::PosIterator(ParIterator const & par, lyx::pos_type pos)
+{
+ setFrom(par, pos);
+}
+
+
+void PosIterator::setFrom(ParIterator const & par, lyx::pos_type pos)
+{
+ BOOST_ASSERT(par.size() > 0);
+
+ ParIterator::PosHolder const & ph = par.positions();
+
+ int const last = par.size() - 1;
+ for (int i = 0; i < last; ++i) {
+ ParPosition const & pp = ph[i];
+ stack_.push_back(
+ PosIteratorItem(const_cast<ParagraphList *>(pp.plist),
+ pp.pit, (*pp.it)->pos, *pp.index + 1));
+ }
+ ParPosition const & pp = ph[last];
+ stack_.push_back(
+ PosIteratorItem(const_cast<ParagraphList *>(pp.plist), pp.pit, pos, 0));
+}
+
+
PosIterator & PosIterator::operator++()
{
BOOST_ASSERT(!stack_.empty());
}
-bool operator!=(PosIterator const & lhs, PosIterator const & rhs)
-{
- return !(lhs == rhs);
-}
-
-
bool operator==(PosIterator const & lhs, PosIterator const & rhs)
{
-
PosIteratorItem const & li = lhs.stack_.back();
PosIteratorItem const & ri = rhs.stack_.back();
}
-PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
- lyx::pos_type pos)
-{
- stack_.push_back(PosIteratorItem(pl, pit, pos));
-}
-
-
-PosIterator::PosIterator(BufferView & bv)
-{
- LyXText * text = bv.getLyXText();
- lyx::pos_type pos = bv.cursor().pos();
- ParagraphList::iterator pit = text->cursorPar();
-
- ParIterator par = bv.buffer()->par_iterator_begin();
- ParIterator end = bv.buffer()->par_iterator_end();
- for ( ; par != end; ++par) {
- if (par.pit() == pit)
- break;
- }
-
- operator=(par.asPosIterator(pos));
-}
-
-
InsetBase * PosIterator::inset() const
{
if (stack_.size() == 1)
#include "insets/insettext.h"
#include <boost/next_prior.hpp>
-#include <boost/optional.hpp>
using boost::next;
-using boost::optional;
-using std::vector;
///
/// ParPosition
///
-class ParPosition {
-public:
- ///
- ParPosition(ParagraphList::iterator p, ParagraphList const & pl);
- ///
- ParagraphList::iterator pit;
- ///
- ParagraphList const * plist;
- ///
- optional<InsetList::iterator> it;
- ///
- optional<int> index;
-};
-
ParPosition::ParPosition(ParagraphList::iterator p, ParagraphList const & pl)
: pit(p), plist(&pl)
/// ParIterator
///
-struct ParIterator::Pimpl {
- typedef vector<ParPosition> PosHolder;
- PosHolder positions;
-};
-
ParIterator::ParIterator(ParagraphList::iterator pit, ParagraphList const & pl)
- : pimpl_(new Pimpl)
{
- pimpl_->positions.push_back(ParPosition(pit, pl));
+ positions_.push_back(ParPosition(pit, pl));
}
ParIterator::ParIterator(ParIterator const & pi)
- : pimpl_(new Pimpl(*pi.pimpl_))
+ : positions_(pi.positions_)
{}
void ParIterator::operator=(ParIterator const & pi)
{
ParIterator tmp(pi);
- pimpl_.swap(tmp.pimpl_);
+ swap(positions_ , tmp.positions_);
}
ParIterator & ParIterator::operator++()
{
- while (!pimpl_->positions.empty()) {
- ParPosition & p = pimpl_->positions.back();
+ while (!positions_.empty()) {
+ ParPosition & p = positions_.back();
// Does the current inset contain more "cells" ?
if (p.index) {
if (LyXText * text = (*p.it)->inset->getText(*p.index)) {
ParagraphList & plist = text->paragraphs();
if (!plist.empty()) {
- pimpl_->positions.push_back(ParPosition(plist.begin(), plist));
+ positions_.push_back(ParPosition(plist.begin(), plist));
return *this;
}
}
ParagraphList & plist = text->paragraphs();
if (!plist.empty()) {
p.index.reset(0);
- pimpl_->positions.push_back(ParPosition(plist.begin(), plist));
+ positions_.push_back(ParPosition(plist.begin(), plist));
return *this;
}
}
// Try to go to the next paragarph
if (next(p.pit) != const_cast<ParagraphList*>(p.plist)->end()
- || pimpl_->positions.size() == 1) {
+ || positions_.size() == 1) {
++p.pit;
p.index.reset();
p.it.reset();
}
// Drop end and move up in the stack.
- pimpl_->positions.pop_back();
+ positions_.pop_back();
}
return *this;
}
LyXText * ParIterator::text(Buffer & buf) const
{
- //lyxerr << "positions.size: " << pimpl_->positions.size() << std::endl;
- if (pimpl_->positions.size() <= 1)
+ //lyxerr << "positions.size: " << positions.size() << std::endl;
+ if (positions_.size() <= 1)
return &buf.text();
- ParPosition const & pos = pimpl_->positions[pimpl_->positions.size() - 2];
+ ParPosition const & pos = positions_[positions_.size() - 2];
return (*pos.it)->inset->getText(*pos.index);
}
InsetBase * ParIterator::inset() const
{
- //lyxerr << "positions.size: " << pimpl_->positions.size() << std::endl;
- if (pimpl_->positions.size() <= 1)
+ //lyxerr << "positions.size: " << positions.size() << std::endl;
+ if (positions_.size() <= 1)
return 0;
- ParPosition const & pos = pimpl_->positions[pimpl_->positions.size() - 2];
+ ParPosition const & pos = positions_[positions_.size() - 2];
return (*pos.it)->inset;
}
int ParIterator::index() const
{
- if (pimpl_->positions.size() <= 1)
+ if (positions_.size() <= 1)
return 0;
- return *(pimpl_->positions[pimpl_->positions.size() - 2].index);
+ return *(positions_[positions_.size() - 2].index);
}
Paragraph & ParIterator::operator*() const
{
- return *pimpl_->positions.back().pit;
+ return *positions_.back().pit;
}
ParagraphList::iterator ParIterator::pit() const
{
- return pimpl_->positions.back().pit;
+ return positions_.back().pit;
}
ParagraphList::iterator ParIterator::operator->() const
{
- return pimpl_->positions.back().pit;
+ return positions_.back().pit;
}
ParagraphList::iterator ParIterator::outerPar() const
{
- return pimpl_->positions[0].pit;
+ return positions_[0].pit;
}
size_t ParIterator::size() const
{
- return pimpl_->positions.size();
+ return positions_.size();
}
ParagraphList & ParIterator::plist() const
{
- return *const_cast<ParagraphList*>(pimpl_->positions.back().plist);
+ return *const_cast<ParagraphList*>(positions_.back().plist);
+}
+
+
+ParIterator::ParIterator(PosIterator const & pos)
+{
+ int const size = pos.stack_.size();
+
+ for (int i = 0; i < size; ++i) {
+ PosIteratorItem const & it = pos.stack_[i];
+ ParPosition pp(it.pit, *it.pl);
+ if (i < size - 1) {
+ InsetBase * inset = it.pit->getInset(it.pos);
+ BOOST_ASSERT(inset);
+ InsetList::iterator beg = it.pit->insetlist.begin();
+ InsetList::iterator end = it.pit->insetlist.end();
+ for ( ; beg != end && beg->inset != inset; ++beg)
+ ;
+ pp.it.reset(beg);
+ pp.index.reset(it.index - 1);
+ }
+ positions_.push_back(pp);
+ }
+}
+
+
+void ParIterator::lockPath(BufferView * bv) const
+{
+ LCursor & cur = bv->cursor();
+ cur.cursor_.clear();
+ int const last = size() - 1;
+ for (int i = 0; i < last; ++i)
+ (*positions_[i].it)->inset->edit(cur, true);
+ cur.resetAnchor();
}
bool operator==(ParIterator const & iter1, ParIterator const & iter2)
{
- return iter1.pimpl_->positions == iter2.pimpl_->positions;
+ return iter1.positions() == iter2.positions();
}
///
-struct ParConstIterator::Pimpl {
- typedef vector<ParPosition> PosHolder;
- PosHolder positions;
-};
-
-
ParConstIterator::ParConstIterator(ParagraphList::iterator pit,
ParagraphList const & pl)
- : pimpl_(new Pimpl)
{
- pimpl_->positions.push_back(ParPosition(pit, pl));
+ positions_.push_back(ParPosition(pit, pl));
}
ParConstIterator::ParConstIterator(ParConstIterator const & pi)
- : pimpl_(new Pimpl(*pi.pimpl_))
+ : positions_(pi.positions_)
{}
ParConstIterator & ParConstIterator::operator++()
{
- while (!pimpl_->positions.empty()) {
- ParPosition & p = pimpl_->positions.back();
+ while (!positions_.empty()) {
+ ParPosition & p = positions_.back();
// Does the current inset contain more "cells" ?
if (p.index) {
if (LyXText * text = (*p.it)->inset->getText(*p.index)) {
ParagraphList & plist = text->paragraphs();
if (!plist.empty()) {
- pimpl_->positions.push_back(ParPosition(plist.begin(), plist));
+ positions_.push_back(ParPosition(plist.begin(), plist));
return *this;
}
}
ParagraphList & plist = text->paragraphs();
if (!plist.empty()) {
p.index.reset(0);
- pimpl_->positions.push_back(ParPosition(plist.begin(), plist));
+ positions_.push_back(ParPosition(plist.begin(), plist));
return *this;
}
}
// Try to go to the next paragarph
if (next(p.pit) != const_cast<ParagraphList*>(p.plist)->end()
- || pimpl_->positions.size() == 1) {
+ || positions_.size() == 1) {
++p.pit;
p.index.reset();
p.it.reset();
}
// Drop end and move up in the stack.
- pimpl_->positions.pop_back();
+ positions_.pop_back();
}
return *this;
Paragraph const & ParConstIterator::operator*() const
{
- return *pimpl_->positions.back().pit;
+ return *positions_.back().pit;
}
ParagraphList::const_iterator ParConstIterator::pit() const
{
- return pimpl_->positions.back().pit;
+ return positions_.back().pit;
}
ParagraphList::const_iterator ParConstIterator::operator->() const
{
- return pimpl_->positions.back().pit;
+ return positions_.back().pit;
}
ParagraphList const & ParConstIterator::plist() const
{
- return *pimpl_->positions.back().plist;
+ return *positions_.back().plist;
}
size_t ParConstIterator::size() const
{
- return pimpl_->positions.size();
+ return positions_.size();
}
bool operator==(ParConstIterator const & iter1, ParConstIterator const & iter2)
{
- return iter1.pimpl_->positions == iter2.pimpl_->positions;
+ return iter1.positions() == iter2.positions();
}
{
return !(iter1 == iter2);
}
-
-
-PosIterator ParIterator::asPosIterator(lyx::pos_type pos) const
-{
- PosIterator p;
-
- int const last = size() - 1;
- for (int i = 0; i < last; ++i) {
- ParPosition & pp = pimpl_->positions[i];
- p.stack_.push_back(
- PosIteratorItem(const_cast<ParagraphList *>(pp.plist),
- pp.pit, (*pp.it)->pos, *pp.index + 1));
- }
- ParPosition const & pp = pimpl_->positions[last];
- p.stack_.push_back(
- PosIteratorItem(const_cast<ParagraphList *>(pp.plist), pp.pit, pos, 0));
- return p;
-}
-
-
-ParIterator::ParIterator(PosIterator const & pos)
- : pimpl_(new Pimpl)
-{
- int const size = pos.stack_.size();
-
- for (int i = 0; i < size; ++i) {
- PosIteratorItem const & it = pos.stack_[i];
- ParPosition pp(it.pit, *it.pl);
- if (i < size - 1) {
- InsetBase * inset = it.pit->getInset(it.pos);
- BOOST_ASSERT(inset);
- InsetList::iterator beg = it.pit->insetlist.begin();
- InsetList::iterator end = it.pit->insetlist.end();
- for ( ; beg != end && beg->inset != inset; ++beg)
- ;
- pp.it.reset(beg);
- pp.index.reset(it.index - 1);
- }
- pimpl_->positions.push_back(pp);
- }
-}
-
-
-void ParIterator::lockPath(BufferView * bv) const
-{
- LCursor & cur = bv->cursor();
- cur.cursor_.clear();
- for (int i = 0, last = size() - 1; i < last; ++i)
- (*pimpl_->positions[i].it)->inset->edit(cur, true);
- cur.resetAnchor();
-}