Hi Markus,

On Sun, Aug 5, 2012 at 8:29 AM, Markus Mohrhard
<markus.mohrh...@googlemail.com> wrote:

> [1] is mostly a fix for a strange behavior of ScRangeList which
> affects also conditional formats. ScRangeList did not delete a ScRange
> if UpdateReference removed all the ScRange cells. The second step of
> the patch is to remove the conditional formatting if the ScRangeList
> is empty after updating the range.
...
> [1] 
> http://cgit.freedesktop.org/libreoffice/core/commit/?id=76f56b5e8d4abf17682aa75b7cf183b883809234

Regarding

        iterator itr = begin();
        while(itr != end())
        {
            if(itr->GetRange().empty())
                maConditionalFormats.erase(itr++);
            else
                ++itr;
        }

that erase line causes an undefined behavior, and subtle, hard-to-find
bug later.  maConditionalFormats is a boost::ptr_set which uses
std::set in its implementation.  The std::set's erase call invalidates
the iterator of the element that has just been deleted, and that line
increments the iterator after it's been invalidated.  Instead of doing
post-increment on the invalidated iterator, doing it this way

        iterator itr = begin();
        while(itr != end())
        {
            if(itr->GetRange().empty())
            {
                iterator itErase = itr;
                ++itr;
                maConditionalFormats.erase(itErase);
            }
            else
                ++itr;
        }

_should_ work.

c.f. 
http://stackoverflow.com/questions/1636578/iterator-validity-after-erase-call-in-stdset

Also, this line

class FindDeletedRange : public ::std::unary_function<bool, const ScRange*>

should be

class FindDeletedRange : public ::std::unary_function<const ScRange*,
bool> (swap the 1st and 2nd template arguments.)

The rest looks good to me.

Kohei
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to