Changeset 274 for trunk


Ignore:
Timestamp:
07/04/14 21:57:48 (11 years ago)
Author:
epyon
Message:
  • packed_indexed_array (experimental)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/handle.hh

    r273 r274  
    123123        };
    124124
    125 
    126 
    127125        template < typename T, typename HANDLE = handle<>, typename TINDEX = sint32 >
    128         class entity_store
     126        class packed_indexed_array
    129127        {
    130128        public:
     
    138136                typedef typename storage::const_reference const_reference;
    139137
     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
    140231                entity_store() {}
    141232
     
    160251                }
    161252
    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                
    167253                void destroy( handle e )
    168254                {
     
    179265                        m_indexes.free_handle( e );
    180266                }
     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(); }
    181272
    182273                iterator        begin()        { return m_data.begin(); }
Note: See TracChangeset for help on using the changeset viewer.