/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _BPARR_HXX #define _BPARR_HXX #include #include #include class BigPtrArray; /** Base class for container entries */ class BigPtrEntry { friend class BigPtrArray; BigPtrArray* pBigPtrArray_; sal_uLong pos_; protected: BigPtrEntry() : pBigPtrArray_(0), pos_(0) {} virtual ~BigPtrEntry() {} sal_uLong GetPos() const { return pos_; } BigPtrArray& GetArray() const { return *pBigPtrArray_; } }; typedef BigPtrEntry* ElementPtr; typedef sal_Bool (*FnForEach)(const ElementPtr&, void* pArgs); /** A container abstraction */ class BigPtrArray { public: typedef std::deque Container_t; public: /** */ BigPtrArray(); /** Return the number of entries inserted into the array */ sal_uLong Count() const; /** Insert an Element into the array at a certain position @param rElem [in] the element @param pos [in] the position where to insert the element. @pre (pos >= 0 && pos <= BigPtrArray.Count()) @post (((oldCount + 1) == BigPtrArray.Count()) && BigPtrArray[pos] == rElem) */ void Insert(const ElementPtr& rElem, sal_uLong pos); /** Remove a specified number of elements starting at a certain position. @param pos [in] the position where to start removing elements @param n [in] the number of elements to remove @pre (pos < BigPtrArray.Count() && n <= BigPtrArray.Count()) @post ((oldCount - n) == BigPtrArray.Count()) */ void Remove(sal_uLong pos, sal_uLong n = 1); /** Move an entry from a certain position to another on. @param from [in] @param to [in] */ void Move(sal_uLong fromPos, sal_uLong toPos); /** Replace an entry at a certain position @param pos [in] the position of the entry @param rElem [in] the new entry @pre pos < BigPtrArray.Count() @post (oldCount == BigPtrArray.Count() && BigPtrArray[pos] == rElem) */ void Replace(sal_uLong pos, const ElementPtr& rElem); /** Get the entry at a certain index @param pos [in] the position of the entry @pre pos < BigPtrArray.Count() */ ElementPtr operator[](sal_uLong pos) const; /** */ void ForEach(FnForEach fn, void* pArgs = NULL); /** */ void ForEach(sal_uLong fromPos, sal_uLong toPos, FnForEach fn, void* pArgs = NULL); private: void FixElementIndizes(Container_t::const_iterator begin, Container_t::const_iterator end) const; private: Container_t container_; }; #endif