#include <boost/next_prior.hpp>
#include <boost/optional.hpp>
-#include <stack>
+// it's conceptionally a stack, but undo needs random access...
+//#include <stack>
+#include <vector>
using boost::next;
using boost::optional;
-using std::stack;
+using std::vector;
///
/// ParPosition
///
struct ParIterator::Pimpl {
- typedef stack<ParPosition> PosHolder;
+ typedef vector<ParPosition> PosHolder;
PosHolder positions;
};
ParIterator::ParIterator(ParagraphList::iterator pit, ParagraphList const & pl)
: pimpl_(new Pimpl)
{
- pimpl_->positions.push(ParPosition(pit, pl));
+ pimpl_->positions.push_back(ParPosition(pit, pl));
}
ParIterator & ParIterator::operator++()
{
while (!pimpl_->positions.empty()) {
- ParPosition & p = pimpl_->positions.top();
+ ParPosition & p = pimpl_->positions.back();
// Does the current inset contain more "cells" ?
if (p.index) {
++(*p.index);
ParagraphList * plist = (*p.it)->inset->getParagraphs(*p.index);
if (plist && !plist->empty()) {
- pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+ pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
return *this;
}
++(*p.it);
ParagraphList * plist = (*p.it)->inset->getParagraphs(0);
if (plist && !plist->empty()) {
p.index.reset(0);
- pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+ pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
return *this;
}
}
}
// Drop end and move up in the stack.
- pimpl_->positions.pop();
+ pimpl_->positions.pop_back();
}
return *this;
}
-ParagraphList::iterator ParIterator::operator*() const
+Paragraph & ParIterator::operator*() const
{
- return pimpl_->positions.top().pit;
+ return *pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::iterator ParIterator::pit() const
+{
+ return pimpl_->positions.back().pit;
}
ParagraphList::iterator ParIterator::operator->() const
{
- return pimpl_->positions.top().pit;
+ return pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::iterator ParIterator::outerPar() const
+{
+ return pimpl_->positions[0].pit;
}
ParagraphList & ParIterator::plist() const
{
- return *const_cast<ParagraphList*>(pimpl_->positions.top().plist);
+ return *const_cast<ParagraphList*>(pimpl_->positions.back().plist);
}
struct ParConstIterator::Pimpl {
- typedef stack<ParPosition> PosHolder;
+ typedef vector<ParPosition> PosHolder;
PosHolder positions;
};
ParagraphList const & pl)
: pimpl_(new Pimpl)
{
- pimpl_->positions.push(ParPosition(pit, pl));
+ pimpl_->positions.push_back(ParPosition(pit, pl));
}
ParConstIterator & ParConstIterator::operator++()
{
while (!pimpl_->positions.empty()) {
- ParPosition & p = pimpl_->positions.top();
+ ParPosition & p = pimpl_->positions.back();
// Does the current inset contain more "cells" ?
if (p.index) {
++(*p.index);
ParagraphList * plist = (*p.it)->inset->getParagraphs(*p.index);
if (plist && !plist->empty()) {
- pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+ pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
return *this;
}
++(*p.it);
ParagraphList * plist = (*p.it)->inset->getParagraphs(0);
if (plist && !plist->empty()) {
p.index.reset(0);
- pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+ pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
return *this;
}
}
}
// Drop end and move up in the stack.
- pimpl_->positions.pop();
+ pimpl_->positions.pop_back();
}
return *this;
}
-ParagraphList::iterator ParConstIterator::operator*() const
+Paragraph const & ParConstIterator::operator*() const
+{
+ return *pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::const_iterator ParConstIterator::pit() const
{
- return pimpl_->positions.top().pit;
+ return pimpl_->positions.back().pit;
}
-ParagraphList::iterator ParConstIterator::operator->() const
+ParagraphList::const_iterator ParConstIterator::operator->() const
{
- return pimpl_->positions.top().pit;
+ return pimpl_->positions.back().pit;
}