1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef _BPARR_HXX 25 #define _BPARR_HXX 26 27 #include <tools/solar.h> 28 #include <tools/debug.hxx> 29 30 #include <deque> 31 32 class BigPtrArray; 33 34 /** Base class for container entries 35 */ 36 class BigPtrEntry 37 { 38 friend class BigPtrArray; 39 BigPtrArray* pBigPtrArray_; 40 sal_uLong pos_; 41 42 protected: BigPtrEntry()43 BigPtrEntry() : pBigPtrArray_(0), pos_(0) 44 {} 45 ~BigPtrEntry()46 virtual ~BigPtrEntry() 47 {} 48 GetPos() const49 sal_uLong GetPos() const 50 { 51 return pos_; 52 } 53 GetArray() const54 BigPtrArray& GetArray() const 55 { 56 return *pBigPtrArray_; 57 } 58 }; 59 60 typedef BigPtrEntry* ElementPtr; 61 typedef sal_Bool (*FnForEach)(const ElementPtr&, void* pArgs); 62 63 /** A container abstraction 64 */ 65 class BigPtrArray 66 { 67 public: 68 typedef std::deque<ElementPtr> Container_t; 69 70 public: 71 /** 72 */ 73 BigPtrArray(); 74 75 /** Return the number of entries inserted 76 into the array 77 */ 78 sal_uLong Count() const; 79 80 /** Insert an Element into the array at a certain 81 position 82 83 @param rElem 84 [in] the element 85 86 @param pos 87 [in] the position where to insert the element. 88 89 @pre (pos >= 0 && pos <= BigPtrArray.Count()) 90 @post (((oldCount + 1) == BigPtrArray.Count()) && BigPtrArray[pos] == rElem) 91 */ 92 void Insert(const ElementPtr& rElem, sal_uLong pos); 93 94 /** Remove a specified number of elements starting at a certain position. 95 96 @param pos 97 [in] the position where to start removing elements 98 99 @param n 100 [in] the number of elements to remove 101 102 @pre (pos < BigPtrArray.Count() && n <= BigPtrArray.Count()) 103 @post ((oldCount - n) == BigPtrArray.Count()) 104 */ 105 void Remove(sal_uLong pos, sal_uLong n = 1); 106 107 /** Move an entry from a certain position to another on. 108 109 @param from 110 [in] 111 112 @param to 113 [in] 114 */ 115 void Move(sal_uLong fromPos, sal_uLong toPos); 116 117 /** Replace an entry at a certain position 118 119 @param pos 120 [in] the position of the entry 121 122 @param rElem 123 [in] the new entry 124 125 @pre pos < BigPtrArray.Count() 126 @post (oldCount == BigPtrArray.Count() && BigPtrArray[pos] == rElem) 127 */ 128 void Replace(sal_uLong pos, const ElementPtr& rElem); 129 130 /** Get the entry at a certain index 131 132 @param pos 133 [in] the position of the entry 134 135 @pre pos < BigPtrArray.Count() 136 */ 137 ElementPtr operator[](sal_uLong pos) const; 138 139 /** 140 */ 141 void ForEach(FnForEach fn, void* pArgs = NULL); 142 143 /** 144 */ 145 void ForEach(sal_uLong fromPos, sal_uLong toPos, FnForEach fn, void* pArgs = NULL); 146 147 private: 148 149 void FixElementIndizes(Container_t::const_iterator begin, Container_t::const_iterator end) const; 150 151 private: 152 Container_t container_; 153 }; 154 155 #endif 156