On Tue, May 15, 2007 at 04:28:10PM +0200, Abdelrazak Younes wrote:
> Abdelrazak Younes wrote:
> >Ozgur Ugras BARAN wrote:
> >>This small patch prevents LOF, LOT always selects the last entry.
> >>LOT/LOF still does not follow the cursor, yet, but for this, we need
> >>serious update in TocBackend.
> >
> >Not that much work IMO. The problem is the way we search for the toc 
> >item is very crude. Look at the comment in TocBackend::item():
> >
> >// A good solution for Items inside insets would be to do:
> >//
> >//if (std::distance(it->par_it_, current) <= 0)
> >//    return it;
> >//
> >// But for an unknown reason, std::distance(current, it->par_it_) always
> >// returns  a positive value and std::distance(it->par_it_, current)
> >// takes forever...
> >// So for now, we do:
> >if (it->par_it_.pit() <= par_it_text.pit())
> >    return it;
> >
> >This is not correct and will work only for top-level items. So if 
> >someone could implement an <= operator for ParConstIterator, that would 
> >solve our problem. Jean-Marc, Andre, your the experts in this field, 
> >could you implement this:
> >
> >bool operator<=(ParConstIterator const &, ParConstIterator const &);
> 
> I've done it but I am not sure I got it right. JMarc?
> 
> Abdel.
> 

> Index: DocIterator.cpp
> ===================================================================
> --- DocIterator.cpp   (revision 18303)
> +++ DocIterator.cpp   (working copy)
> @@ -553,7 +553,20 @@
>  }
>  
>  
> +bool operator<=(DocIterator const & di1, DocIterator const & di2)
> +{
> +     size_t const n1 = di1.slices_.size();
> +     size_t const n2 = di2.slices_.size();
> +     for (size_t i = 0 ; i < n1; ++i) {
> +             if (i >= n2)
> +                     return false;
> +             if (di1.slices_[i].pit() <= di2.slices_[i].pit())
> +                     return true;
> +     }
> +     return false;
> +}

The canonical solution wold look like the following (completely
untested!)

bool operator<(DocIterator const & di1, DocIterator const & di2)
{
        size_t const n1 = di1.slices_.size();
        size_t const n2 = di2.slices_.size();
        for (size_t i = 0; i < n1 && i < n2; ++i) {
                Slice const & sl1 = di1.slices_[i];
                Slice const & sl2 = di2.slices_[i];
                if (sl1.idx() != sl2.idx())
                        return sl1.idx() < sl2.idx();
                if (sl1.pit() != sl2.pit())
                        return sl1.pit() < sl2.pit()
                if (sl1.pos() != sl2.pos())
                        return sl1.pos() < sl2.pos()
        }
        return n1 < n2;
}

bool operator<=(DocIterator const & di1, DocIterator const & di2)
{
        return !(di2 < di1);
}

Reply via email to