- Timestamp:
- 07/04/14 21:57:48 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/handle.hh
r273 r274 123 123 }; 124 124 125 126 127 125 template < typename T, typename HANDLE = handle<>, typename TINDEX = sint32 > 128 class entity_store126 class packed_indexed_array 129 127 { 130 128 public: … … 138 136 typedef typename storage::const_reference const_reference; 139 137 138 packed_indexed_array() {} 139 packed_indexed_array( uint32 reserve ) 140 { 141 m_data.reserve( reserve ); 142 m_indexes.reserve( reserve ); 143 } 144 145 T* insert( handle h ) 146 { 147 resize_indexes_to( h.index() ); 148 m_indexes[ h.index() ] = m_data.size(); 149 m_data.emplace_back(); 150 return &(m_data.back()); 151 } 152 153 bool exists( handle h ) 154 { 155 if ( h.is_nil() || h.index() >= m_indexes.size() ) return false; 156 return m_indexes[ h.index() ] >= 0; 157 } 158 159 T* get( handle h ) 160 { 161 if ( h.is_nil() || h.index() >= m_indexes.size() ) return nullptr; 162 index_type i = m_indexes[ h.index() ]; 163 return i >= 0 ? &(m_data[ i ]) : nullptr; 164 } 165 166 void remove( handle h ) 167 { 168 handle swap_handle = m_handles.back(); 169 sint32 dead_eindex = m_indexes[ h.index() ]; 170 if ( dead_eindex != (sint32)m_data.size()-1 ) 171 { 172 m_data[ dead_eindex ] = m_data.back(); 173 m_handles[ dead_eindex ] = m_handles.back(); 174 m_indexes[ h.index() ] = m_indexes[ swap_handle.index() ]; 175 } 176 m_data.pop_back(); 177 m_handles.pop_back(); 178 m_indexes[ h.index() ] = -1; 179 } 180 181 void clear() 182 { 183 m_data.clear(); 184 m_handles.clear(); 185 m_indexes.clear(); 186 } 187 188 const value_type& operator[] ( index_type i ) const { return m_data[i]; } 189 value_type& operator[] ( index_type i ) { return m_data[i]; } 190 size_t size() const { return m_data.size(); } 191 192 iterator begin() { return m_data.begin(); } 193 const_iterator begin() const { return m_data.cbegin(); } 194 const_iterator cbegin() const { return m_data.cbegin(); } 195 196 iterator end() { return m_data.end(); } 197 const_iterator end() const { return m_data.cend(); } 198 const_iterator cend() const { return m_data.cend(); } 199 200 private: 201 void resize_indexes_to( index_type i ) 202 { 203 index_type size = (index_type)m_indexes.size(); 204 if ( i >= size ) 205 { 206 if ( size == 0 ) size = 1; 207 while ( i >= size ) size = size * 2; 208 m_indexes.resize( size, -1 ); 209 } 210 } 211 212 std::vector< T > m_data; 213 std::vector< handle > m_handles; 214 std::vector< index_type > m_indexes; 215 }; 216 217 218 template < typename T, typename HANDLE = handle<>, typename TINDEX = sint32 > 219 class entity_store 220 { 221 public: 222 typedef HANDLE handle; 223 typedef TINDEX index_type; 224 typedef std::vector< T > storage; 225 typedef T value_type; 226 typedef typename storage::iterator iterator; 227 typedef typename storage::const_iterator const_iterator; 228 typedef typename storage::reference reference; 229 typedef typename storage::const_reference const_reference; 230 140 231 entity_store() {} 141 232 … … 160 251 } 161 252 162 handle get_handle( index_type i ) const { return m_handles[i]; }163 const T& operator[] ( index_type i ) const { return m_data[i]; }164 T& operator[] ( index_type i ) { return m_data[i]; }165 size_t size() const { return m_data.size(); }166 167 253 void destroy( handle e ) 168 254 { … … 179 265 m_indexes.free_handle( e ); 180 266 } 267 268 handle get_handle( index_type i ) const { return m_handles[i]; } 269 const value_type& operator[] ( index_type i ) const { return m_data[i]; } 270 value_type& operator[] ( index_type i ) { return m_data[i]; } 271 size_t size() const { return m_data.size(); } 181 272 182 273 iterator begin() { return m_data.begin(); }
Note: See TracChangeset
for help on using the changeset viewer.