size_t DocRange::length() const
{
- pit_type startpit = from.pit();
- pit_type endpit = to.pit();
- ParagraphList const & ps_ = from.text()->paragraphs();
-
- ParagraphList pars(boost::next(ps_.begin(), startpit),
- boost::next(ps_.begin(), endpit + 1));
-
- // Remove the end of the last paragraph; afterwards, remove the
- // beginning of the first paragraph.
- Paragraph & back = pars.back();
- back.eraseChars(to.pos(), back.size(), false);
- Paragraph & front = pars.front();
- front.eraseChars(0, from.pos(), false);
-
- ParagraphList::const_iterator pit = pars.begin();
- ParagraphList::const_iterator end_it = pars.end();
-
+ ParagraphList const & ps = from.text()->paragraphs();
size_t length = 0;
- for (; pit != end_it; ++pit)
- length += pit->size() + 1;
-
- // The last paragraph has no paragraph-end
- --length;
- return length;
+ pit_type pit = from.pit();
+ pit_type const endpit = to.pit();
+ for (; pit < endpit; ++pit)
+ length += ps[pit].size() + 1;
+ length += to.pos() - from.pos();
+ return length;
}
Vn_.clear();
}
+ /// Gets the value at index. If it is not in the vector
+ /// the default value is inserted and returned.
T & operator[](int index) {
vector<T> & V = index >= 0 ? Vp_ : Vn_;
- if (index < 0)
- index = -index-1;
- while (index >= V.size())
+ unsigned int const ii = index >= 0 ? index : -index - 1;
+ while (ii >= V.size())
V.push_back(default_);
- return V[index];
+ return V[ii];
}
private:
private:
/// Finds the middle snake and returns the length of the
/// shortest edit script.
- int find_middle_snake(DocRangePair const & rp, DocPair & middle_snake);
+ int findMiddleSnake(DocRangePair const & rp, DocPair & middle_snake);
enum SnakeResult {
NoSnake,
/// Retrieve the middle snake when there is overlap between
/// the forward and backward path.
- SnakeResult retrieve_middle_snake(int k, int D, Direction direction,
+ SnakeResult retrieveMiddleSnake(int k, int D, Direction direction,
DocPair & middle_snake);
/// Find the the furthest reaching D-path (number of horizontal
/// and vertical steps; differences between the old and new
/// document) in the k-diagonal (vertical minus horizontal steps).
- void furthest_Dpath_kdiagonal(int D, int k,
+ void furthestDpathKdiagonal(int D, int k,
DocRangePair const & rp, Direction direction);
/// Is there overlap between the forward and backward path
/// Processes the splitted chunks. It either adds them as deleted,
/// as added, or call diff_i for further processing.
- void diff_part(DocRangePair const & rp);
+ void diffPart(DocRangePair const & rp);
/// Runs the algorithm for the inset located at /c it and /c it_n
/// and adds the result to /c pars.
- void diff_inset(Inset * inset, DocPair const & p);
+ void diffInset(Inset * inset, DocPair const & p);
/// Adds the snake to the destination buffer. The algorithm will
/// recursively be applied to any InsetTexts that are within the snake.
- void process_snake(DocRangePair const & rp);
+ void processSnake(DocRangePair const & rp);
/// Writes the range to the destination buffer
void writeToDestBuffer(DocRange const & range,
}
-static void get_paragraph_list(DocRange const & range,
+static void getParagraphList(DocRange const & range,
ParagraphList & pars)
{
// Clone the paragraphs within the selection.
/// position in the old and new file and they are synchronously
/// moved along the snake. The function returns true if a snake
/// was found.
-static bool traverse_snake(DocPair & p, DocRangePair const & range,
+static bool traverseSnake(DocPair & p, DocRangePair const & range,
Direction direction)
{
bool ret = false;
/////////////////////////////////////////////////////////////////////
-void Compare::Impl::furthest_Dpath_kdiagonal(int D, int k,
+void Compare::Impl::furthestDpathKdiagonal(int D, int k,
DocRangePair const & rp, Direction direction)
{
compl_vector<DocIterator> & op = direction == Forward ? ofp : orp;
}
// Traverse snake
- if (traverse_snake(p, rp, direction)) {
+ if (traverseSnake(p, rp, direction)) {
// Record last snake
os[k] = p.o;
ns[k] = p.n;
}
-Compare::Impl::SnakeResult Compare::Impl::retrieve_middle_snake(
+Compare::Impl::SnakeResult Compare::Impl::retrieveMiddleSnake(
int k, int D, Direction direction, DocPair & middle_snake)
{
compl_vector<DocIterator> & os = direction == Forward ? ofs : ors;
}
-int Compare::Impl::find_middle_snake(DocRangePair const & rp,
+int Compare::Impl::findMiddleSnake(DocRangePair const & rp,
DocPair & middle_snake)
{
// The lengths of the old and new chunks.
// Diagonals between -D and D can be reached by a D-path
for (int k = -D; k <= D; k += 2) {
// Find the furthest reaching D-path on this diagonal
- furthest_Dpath_kdiagonal(D, k, rp, direction);
+ furthestDpathKdiagonal(D, k, rp, direction);
// Only check for overlap for forward paths if the offset is odd
// and only for reverse paths if the offset is even.
// Do the forward and backward paths overlap ?
if (overlap(k, D - odd_offset_)) {
- retrieve_middle_snake(k, D, direction, middle_snake);
+ retrieveMiddleSnake(k, D, direction, middle_snake);
return 2 * D - odd_offset_;
}
}
DocRangePair rp(old_buf_, new_buf_);
DocPair from = rp.from();
- traverse_snake(from, rp, Forward);
+ traverseSnake(from, rp, Forward);
DocRangePair const snake(rp.from(), from);
- process_snake(snake);
+ processSnake(snake);
// Start the recursive algorithm
diff_i(rp);
// Divides the problem into two smaller problems, split around
// the snake in the middle.
- int const L_ses = find_middle_snake(rp, middle_snake);
+ int const L_ses = findMiddleSnake(rp, middle_snake);
// Set maximum of progress bar
if (++recursion_level_ == 1)
} else {
// Retrieve the complete snake
DocPair first_part_end = middle_snake;
- traverse_snake(first_part_end, rp, Backward);
+ traverseSnake(first_part_end, rp, Backward);
DocRangePair first_part(rp.from(), first_part_end);
DocPair second_part_begin = middle_snake;
- traverse_snake(second_part_begin, rp, Forward);
+ traverseSnake(second_part_begin, rp, Forward);
DocRangePair second_part(second_part_begin, rp.to());
// Split the string in three parts:
// 1. in front of the snake
- diff_part(first_part);
+ diffPart(first_part);
// 2. the snake itself, and
DocRangePair const snake(first_part.to(), second_part.from());
- process_snake(snake);
+ processSnake(snake);
// 3. behind the snake.
- diff_part(second_part);
+ diffPart(second_part);
}
--recursion_level_;
}
-void Compare::Impl::diff_part(DocRangePair const & rp)
+void Compare::Impl::diffPart(DocRangePair const & rp)
{
// Is there a finite length string in both buffers, if not there
// is an empty string and we write the other one to the buffer.
}
-void Compare::Impl::diff_inset(Inset * inset, DocPair const & p)
+void Compare::Impl::diffInset(Inset * inset, DocPair const & p)
{
// Find the dociterators for the beginning and the
// end of the inset, for the old and new document.
}
-void Compare::Impl::process_snake(DocRangePair const & rp)
+void Compare::Impl::processSnake(DocRangePair const & rp)
{
ParagraphList pars;
- get_paragraph_list(rp.o, pars);
+ getParagraphList(rp.o, pars);
// Find insets in this paragaph list
DocPair it = rp.from();
pos_type const pos = pit ? it.o.pos() : it.o.pos() - rp.o.from.pos();
inset = pars[pit].getInset(pos);
LASSERT(inset, /**/);
- diff_inset(inset, it);
+ diffInset(inset, it);
}
}
writeToDestBuffer(pars);
Change::Type type)
{
ParagraphList pars;
- get_paragraph_list(range, pars);
+ getParagraphList(range, pars);
pos_type size = 0;