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 ARY_STORE_S_BASE_HXX 25 #define ARY_STORE_S_BASE_HXX 26 27 // USED SERVICES 28 #include <deque> 29 #include <cosv/tpl/tpltools.hxx> 30 31 32 33 34 namespace ary 35 { 36 namespace stg 37 { 38 39 40 /** The basic storage container of the repository. 41 42 @collab Storage 43 Implements Storage. Not used elsewhere. 44 45 @tpl ENTITY 46 The type of *it, where it is of type c_iter, has to be ENTITY * const. 47 */ 48 template <class ENTITY> 49 class Base 50 { 51 public: 52 // LIFECYCLE 53 typedef std::deque< ENTITY* > impl_type; 54 typedef typename impl_type::const_iterator c_iter; 55 56 57 /** @param i_nrOfReservedItems 58 The number of actual items to reserve, including the item 59 at index [0] that is always empty and unused. 60 */ 61 Base( 62 uintt i_nrOfReservedItems ); 63 ~Base(); 64 65 // OPERATORS 66 ENTITY * operator[]( 67 uintt i_index ) const; 68 // OPERATIONS 69 uintt Add_Entity( /// @return the index of the new element. 70 DYN ENTITY & pass_newEntity ); 71 DYN ENTITY * Set_Entity( /// @return the previous value. 72 uintt i_index, 73 DYN ENTITY & pass_newEntity ); 74 // INQUIRY 75 uintt Size() const; /// Incl. reserved size. 76 uintt ReservedSize() const; /// Incl. zero for element at [0]. 77 78 c_iter Begin() const; /// @return location of index 1, because 0 is always empty. 79 c_iter BeginUnreserved() const; 80 c_iter End() const; 81 82 private: 83 // DATA 84 impl_type aData; 85 uintt nReservedSize; 86 }; 87 88 89 90 // IMPLEMENTATION 91 92 template <class ENTITY> 93 Base<ENTITY>::Base(uintt i_nrOfReservedItems) 94 : aData(i_nrOfReservedItems, 0), 95 nReservedSize(i_nrOfReservedItems) 96 { 97 } 98 99 template <class ENTITY> 100 Base<ENTITY>::~Base() 101 { 102 csv::erase_container_of_heap_ptrs(aData); 103 } 104 105 106 template <class ENTITY> 107 ENTITY * 108 Base<ENTITY>::operator[](uintt i_index) const 109 { 110 if (i_index < aData.size()) 111 return aData[i_index]; 112 return 0; 113 } 114 115 template <class ENTITY> 116 uintt 117 Base<ENTITY>::Add_Entity(DYN ENTITY & pass_newEntity) 118 { 119 aData.push_back(&pass_newEntity); 120 return aData.size() - 1; 121 } 122 123 template <class ENTITY> 124 DYN ENTITY * 125 Base<ENTITY>::Set_Entity( uintt i_index, 126 DYN ENTITY & pass_newEntity ) 127 { 128 csv_assert(i_index != 0 AND i_index < aData.size()); 129 130 Dyn<ENTITY> 131 ret(aData[i_index]); 132 aData[i_index] = &pass_newEntity; 133 return ret.Release(); 134 } 135 136 template <class ENTITY> 137 uintt 138 Base<ENTITY>::Size() const 139 { 140 return aData.size(); 141 } 142 143 template <class ENTITY> 144 uintt 145 Base<ENTITY>::ReservedSize() const 146 { 147 return nReservedSize; 148 } 149 150 template <class ENTITY> 151 typename Base<ENTITY>::c_iter 152 Base<ENTITY>::Begin() const 153 { 154 return aData.begin() + 1; 155 } 156 157 template <class ENTITY> 158 typename Base<ENTITY>::c_iter 159 Base<ENTITY>::BeginUnreserved() const 160 { 161 return aData.begin() + nReservedSize; 162 } 163 164 template <class ENTITY> 165 typename Base<ENTITY>::c_iter 166 Base<ENTITY>::End() const 167 { 168 return aData.end(); 169 } 170 171 172 173 174 } // namespace stg 175 } // namespace ary 176 #endif 177