diff options
Diffstat (limited to 'svl/source/inc')
-rw-r--r-- | svl/source/inc/poolio.hxx | 142 |
1 files changed, 1 insertions, 141 deletions
diff --git a/svl/source/inc/poolio.hxx b/svl/source/inc/poolio.hxx index cc406f31e0a0..118deaf50e2e 100644 --- a/svl/source/inc/poolio.hxx +++ b/svl/source/inc/poolio.hxx @@ -31,128 +31,9 @@ class SfxPoolItem; class SfxItemPoolUser; -const sal_uInt32 SFX_ITEMS_DEFAULT = 0xfffffffe; - -static bool CompareSortablePoolItems(SfxPoolItem const* lhs, SfxPoolItem const* rhs) -{ - return (*lhs) < (*rhs); -} -/** - * This array contains a set of SfxPoolItems, if those items are - * poolable then each item has a unique set of properties, and we - * often search linearly to ensure uniqueness. If they are - * non-poolable we maintain an (often large) list of pointers. - */ -struct SfxPoolItemArray_Impl -{ -private: - o3tl::sorted_vector<SfxPoolItem*> maPoolItemSet; - // In some cases, e.g. subclasses of NameOrIndex, the parent class (NameOrIndex) is sortable, - // but the subclasses do not define an operator<, which means that we don't get an ordering - // strong enough to enforce uniqueness purely with operator<, which means we need to do - // a partial scan with operator== - std::vector<SfxPoolItem*> maSortablePoolItems; -public: - o3tl::sorted_vector<SfxPoolItem*>::const_iterator begin() const { return maPoolItemSet.begin(); } - o3tl::sorted_vector<SfxPoolItem*>::const_iterator end() const { return maPoolItemSet.end(); } - /// clear array of PoolItem variants after all PoolItems are deleted - /// or all ref counts are decreased - void clear(); - size_t size() const {return maPoolItemSet.size();} - bool empty() const {return maPoolItemSet.empty();} - o3tl::sorted_vector<SfxPoolItem*>::const_iterator find(SfxPoolItem* pItem) const { return maPoolItemSet.find(pItem); } - void insert(SfxPoolItem* pItem) - { - bool bInserted = maPoolItemSet.insert(pItem).second; - assert( bInserted && "duplicate item?" ); - (void)bInserted; - - if (pItem->IsSortable()) - { - // bail early if someone modified one of these things underneath me - assert( std::is_sorted_until(maSortablePoolItems.begin(), maSortablePoolItems.end(), CompareSortablePoolItems) == maSortablePoolItems.end()); - - auto it = std::lower_bound(maSortablePoolItems.begin(), maSortablePoolItems.end(), pItem, CompareSortablePoolItems); - maSortablePoolItems.insert(maSortablePoolItems.begin() + (it - maSortablePoolItems.begin()), pItem); - } - } - const SfxPoolItem* findByLessThan(const SfxPoolItem* pNeedle) const - { - // bail early if someone modified one of these things underneath me - assert( std::is_sorted_until(maSortablePoolItems.begin(), maSortablePoolItems.end(), CompareSortablePoolItems) == maSortablePoolItems.end()); - assert( maPoolItemSet.empty() || maPoolItemSet.front()->IsSortable() ); - - auto it = std::lower_bound(maSortablePoolItems.begin(), maSortablePoolItems.end(), pNeedle, CompareSortablePoolItems); - for (;;) - { - if (it == maSortablePoolItems.end()) - return nullptr; - if (*pNeedle < **it) - return nullptr; - if (*pNeedle == **it) - return *it; - ++it; - } - } - std::vector<const SfxPoolItem*> findSurrogateRange(const SfxPoolItem* pNeedle) const - { - std::vector<const SfxPoolItem*> rv; - if (!maSortablePoolItems.empty()) - { - // bail early if someone modified one of these things underneath me - assert( std::is_sorted_until(maSortablePoolItems.begin(), maSortablePoolItems.end(), CompareSortablePoolItems) == maSortablePoolItems.end()); - - auto range = std::equal_range(maSortablePoolItems.begin(), maSortablePoolItems.end(), pNeedle, CompareSortablePoolItems); - rv.reserve(std::distance(range.first, range.second)); - for (auto it = range.first; it != range.second; ++it) - rv.push_back(*it); - } - else - { - for (const SfxPoolItem* p : maPoolItemSet) - if (*pNeedle == *p) - rv.push_back(p); - } - return rv; - } - void erase(o3tl::sorted_vector<SfxPoolItem*>::const_iterator it) - { - auto pNeedle = *it; - if ((*it)->IsSortable()) - { - // bail early if someone modified one of these things underneath me - assert( std::is_sorted_until(maSortablePoolItems.begin(), maSortablePoolItems.end(), CompareSortablePoolItems) == maSortablePoolItems.end()); - - auto sortIt = std::lower_bound(maSortablePoolItems.begin(), maSortablePoolItems.end(), pNeedle, CompareSortablePoolItems); - for (;;) - { - if (sortIt == maSortablePoolItems.end()) - { - assert(false && "did not find item?"); - break; - } - if (*pNeedle < **sortIt) - { - assert(false && "did not find item?"); - break; - } - // need to compare by pointer here, since we might have duplicates - if (*sortIt == pNeedle) - { - maSortablePoolItems.erase(sortIt); - break; - } - ++sortIt; - } - } - maPoolItemSet.erase(it); - } -}; - struct SfxItemPool_Impl { SfxBroadcaster aBC; - std::vector<SfxPoolItemArray_Impl> maPoolItemArrays; OUString aName; std::vector<SfxPoolItem*> maPoolDefaults; std::vector<SfxPoolItem*>* mpStaticDefaults; @@ -164,8 +45,7 @@ struct SfxItemPool_Impl MapUnit eDefMetric; SfxItemPool_Impl( SfxItemPool* pMaster, OUString _aName, sal_uInt16 nStart, sal_uInt16 nEnd ) - : maPoolItemArrays(nEnd - nStart + 1) - , aName(std::move(_aName)) + : aName(std::move(_aName)) , maPoolDefaults(nEnd - nStart + 1) , mpStaticDefaults(nullptr) , mpMaster(pMaster) @@ -183,31 +63,11 @@ struct SfxItemPool_Impl void DeleteItems() { - maPoolItemArrays.clear(); maPoolDefaults.clear(); mpPoolRanges.reset(); } - - // unit testing - friend class PoolItemTest; - static SfxItemPool_Impl *GetImpl(SfxItemPool const *pPool) { return pPool->pImpl.get(); } }; - -#define SFX_ITEMPOOL_VER_MAJOR sal_uInt8(2) -#define SFX_ITEMPOOL_VER_MINOR sal_uInt8(0) - -#define SFX_ITEMPOOL_TAG_STARTPOOL_4 sal_uInt16(0x1111) -#define SFX_ITEMPOOL_TAG_STARTPOOL_5 sal_uInt16(0xBBBB) -#define SFX_ITEMPOOL_TAG_TRICK4OLD sal_uInt16(0xFFFF) - -#define SFX_ITEMPOOL_REC sal_uInt8(0x01) -#define SFX_ITEMPOOL_REC_HEADER sal_uInt8(0x10) -#define SFX_ITEMPOOL_REC_VERSIONMAP sal_uInt16(0x0020) -#define SFX_ITEMPOOL_REC_WHICHIDS sal_uInt16(0x0030) -#define SFX_ITEMPOOL_REC_ITEMS sal_uInt16(0x0040) -#define SFX_ITEMPOOL_REC_DEFAULTS sal_uInt16(0x0050) - #endif // INCLUDED_SVL_SOURCE_INC_POOLIO_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |