office-gobmx/sw/inc/txtrfmrk.hxx
Noel Grandin 7ac940d278 tdf#125372 writer, file with lots of hints very slow to open, part3
There were O(n^2) issues all over the places where we walk these lists.

This takes the opening time from 10m+ to 4m.

(*) Invalidate the sorting on a much less aggressive basis, by having
the SwTextAttr objects tell the SwpHints object when start and end pos
changes
(*) Add a bool field to indicate when the maps become unsorted, so we
can resort them only when we actually need sorted access
(*) Add an API for walking the list of SwTextAttr* without triggering
sorting, which is particularly important when the RedlineManager starts
moving things around.
(*) Add various asserts to catch code that tries to iterate over these
sorted lists but triggers resorting during the loop.

I also moved some of the logic around so that instead of
    update hint
    delete hint
    insert hint
it now goes
    delete hint
    update hint
    insert hint
which means that the needToSort flag does not get set because the
hint is disconnected while it is being updated.

Change-Id: Ie153ddafc9ef9e3470d588db2be2457c676232a8
Reviewed-on: https://gerrit.libreoffice.org/73090
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
2019-05-28 16:41:26 +02:00

52 lines
1.8 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef INCLUDED_SW_INC_TXTRFMRK_HXX
#define INCLUDED_SW_INC_TXTRFMRK_HXX
#include "txatbase.hxx"
class SwTextNode;
// Attribute for content-/position references in text.
class SwTextRefMark : public SwTextAttrEnd
{
SwTextNode * m_pTextNode;
sal_Int32 * m_pEnd; // end is optional (point reference)
public:
SwTextRefMark( SwFormatRefMark& rAttr,
sal_Int32 const nStart, sal_Int32 const*const pEnd = nullptr);
virtual const sal_Int32* GetEnd() const override; // SwTextAttr
virtual void SetEnd(sal_Int32) override; // SwTextAttr
// get and set TextNode pointer
inline const SwTextNode& GetTextNode() const;
void ChgTextNode( SwTextNode* pNew ) { m_pTextNode = pNew; }
};
inline const SwTextNode& SwTextRefMark::GetTextNode() const
{
assert( m_pTextNode );
return *m_pTextNode;
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */