22 #include "lfVectorIterator.h" 
   27 template< 
class T, 
int32_t nSlots >
 
   31     setZero( slots_, nSlots * 
sizeof( T* ));
 
   34 template< 
class T, 
int32_t nSlots >
 
   39     setZero( slots_, nSlots * 
sizeof( T* ));
 
   41     for( int32_t i = 0; i <= s; ++i )
 
   42         slots_[ i ] = 
new T[ 1<<i ];
 
   45 template< 
class T, 
int32_t nSlots >
 
   50     setZero( slots_, nSlots * 
sizeof( T* ));
 
   52     for( 
size_t i = 0; i <= size_t(s); ++i )
 
   54         const size_t sz = 1<<i;
 
   55         slots_[ i ] = 
new T[ sz ];
 
   56         for( 
size_t j = 0; size_ < n && j < sz ; ++j )
 
   62     LBASSERTINFO( size_ == n, size_ << 
" != " << n );
 
   65 template< 
class T, 
int32_t nSlots >
 
   73 template< 
class T, 
int32_t nSlots >
 
   74 template< 
int32_t fromSlots >
 
   82 template< 
class T, 
int32_t nSlots >
 
   85     for( 
size_t i=0; i < nSlots; ++i )
 
   98     for( 
size_t i = 0; i < size_t(nSlots); ++i )
 
  102             const size_t sz = 1<<i;
 
  104                 slots_[ i ] = 
new T[ sz ];
 
  106             for( 
size_t j = 0; size_ < from.size_ && j < sz ; ++j )
 
  108                 slots_[ i ][ j ] = from.slots_[ i ][ j ];
 
  112         else if( slots_[ i ] ) 
 
  114             delete [] slots_[ i ];
 
  119     LBASSERTINFO( size_ == from.size_, size_ << 
" != " << from.size_ );
 
  123 template< 
class T, 
int32_t nSlots >
 
  129     if( size() != rhs.
size() )
 
  134     for( ; it != end() && rhsIt != end(); ++it, ++rhsIt )
 
  143 #ifdef LB_GCC_4_6_OR_LATER // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51721 
  144 #  ifndef LB_GCC_4_8 // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56824 
  145 #    pragma GCC diagnostic push 
  147 #  pragma GCC diagnostic ignored "-Warray-bounds" 
  150 template< 
class T, 
int32_t nSlots >
 
  154     LBASSERTINFO( size_ >= i, size_ << 
" < " << i );
 
  157     const size_t index = i ^ ( size_t( 1 )<<slot );
 
  159     LBASSERTINFO( slot >=0 && slot < nSlots, slot );
 
  160     LBASSERT( slots_[ slot ] );
 
  161     LBASSERT( index < (1ull<<slot) );
 
  162     return slots_[ slot ][ index ];
 
  165 template< 
class T, 
int32_t nSlots >
 
  168     LBASSERTINFO( size_ > i, size_ << 
" <= " << i );
 
  171     const size_t index = i ^ ( size_t( 1 )<<slot );
 
  173     LBASSERTINFO( slot >=0 && slot < nSlots, slot );
 
  174     LBASSERT( slots_[ slot ] );
 
  175     LBASSERT( index < (1ull<<slot) );
 
  176     return slots_[ slot ][ index ];
 
  179 #ifdef LB_GCC_4_6_OR_LATER 
  181 #    pragma GCC diagnostic pop 
  185 template< 
class T, 
int32_t nSlots >
 
  188     LBASSERT( !empty( ));
 
  189     return slots_[ 0 ][ 0 ];
 
  192 template< 
class T, 
int32_t nSlots >
 
  195     LBASSERT( !empty( ));
 
  196     return (*
this)[ size_ - 1 ];
 
  199 template< 
class T, 
int32_t nSlots >
 
  203     while( newSize > size( ))
 
  204         push_back_unlocked_( item );
 
  207 template< 
class T, 
int32_t nSlots >
 
  211     push_back_unlocked_( item );
 
  214 template< 
class T, 
int32_t nSlots >
 
  221     (*this)[size_] = T(); 
 
  225 template< 
class T, 
int32_t nSlots >
 
  234     (*this)[size_] = T(); 
 
  242     LBASSERT( pos.container_ == 
this );
 
  243     if( pos.container_ != 
this || pos.i_ >= size_ )
 
  248 #pragma warning (push) 
  249 #pragma warning (disable: 4996) // unchecked iterators 
  250     std::copy( pos+1, end()+1, pos );
 
  251 #pragma warning (pop) 
  252     (*this)[size_] = T(); 
 
  261     for( 
size_t i = size_; i != 0 ; --i )
 
  263         if( (*
this)[i-1] == element )
 
  267 #pragma warning (push) 
  268 #pragma warning (disable: 4996) // unchecked iterators 
  269             std::copy( pos+1, end()+1, pos );
 
  270 #pragma warning (pop) 
  279 template< 
class T, 
int32_t nSlots >
 
  283     while( size_ > newSize )
 
  286         (*this)[size_] = T(); 
 
  290     while( size_ < newSize )
 
  291         push_back_unlocked_( value );
 
  294 template< 
class T, 
int32_t nSlots >
 
  301         (*this)[size_] = T(); 
 
  303     for( int32_t i = 0; i < nSlots; ++i )
 
  305         delete [] slots_[ i ];
 
  316 template< 
class T, 
int32_t nSlots >
 
  317 template< 
int32_t fromSlots >
 
  320     setZero( slots_, nSlots * 
sizeof( T* ));
 
  323     for( int32_t i = 0; i < nSlots; ++i )
 
  325         if( i >= fromSlots || !from.slots_[i] ) 
 
  327             LBASSERTINFO( size_ == from.size_,
 
  328                           size_ << 
" != " << from.size_ );
 
  332         const int32_t sz = 1<<i;
 
  333         slots_[ i ] = 
new T[ sz ];
 
  334         for( int32_t j = 0; size_ < from.size_ && j < sz ; ++j )
 
  336             slots_[ i ][ j ] = from.slots_[ i ][ j ];
 
  342 template< 
class T, 
int32_t nSlots >
 
  343 void LFVector< T, nSlots >::push_back_unlocked_( 
const T& item )
 
  345     const size_t i = size_ + 1;
 
  347     if( slot < 0 || slot >= nSlots )
 
  349         LBASSERTINFO( slot >= 0 && slot < nSlots, slot );
 
  350         LBTHROW( std::runtime_error( 
"LFVector full" ));
 
  353     const size_t sz = ( size_t( 1 ) << slot );
 
  355     if( !slots_[ slot ] )
 
  356         slots_[ slot ] = 
new T[ sz ];
 
  358     const ssize_t index = i ^ sz;
 
  359     slots_[ slot ][ index ] = item;
 
  363 template< 
class T, 
int32_t nSlots >
 
  364 void LFVector< T, nSlots >::trim_()
 
  367     if( nextSlot < nSlots && slots_[ nextSlot ] )
 
  369         delete [] slots_[ nextSlot ]; 
 
  370         slots_[ nextSlot ] = 0;
 
  374 template< 
class T, 
int32_t nSlots > 
inline typename 
  380 template< 
class T, 
int32_t nSlots > 
inline typename 
  386 template< 
class T, 
int32_t nSlots > 
inline typename 
  392 template< 
class T, 
int32_t nSlots > 
inline typename 
  399 template< 
class T, 
int32_t nSlots > 
template< 
class Archive >
 
  401                                          const unsigned int  )
 const 
  404     for( 
size_t i = 0; i < size_; ++i )
 
  408 template< 
class T, 
int32_t nSlots > 
template< 
class Archive >
 
  409 inline void LFVector< T, nSlots >::load( Archive& ar,
 
  415     LBASSERT( size_ == newSize );
 
  417     for( 
size_t i = 0; i < size_; ++i )
 
  423 std::ostream& operator << ( std::ostream& os, const LFVector< T >& v )
 
  425     os << 
className( &v ) << 
" size " << v.size() << 
" [ ";
 
  428         if( i.getPosition() > 255 )
 
  435     return os << 
']' << std::endl;
 
An iterator for LFVector. 
 
STL-like vector implementation providing certain thread-safety guarantees. 
 
std::string className(const T *object)
Print the RTTI name of the given class. 
 
int32_t getIndexOfLastBit(T value)
 
LFVector & operator=(const LFVector &from)
 
void push_back(const T &item, bool lock=true)
Add an element to the vector. 
 
ScopedWrite getWriteLock()
 
static void setZero(void *ptr, const size_t size)
OS-independent call to bzero(3). 
 
bool operator==(const LFVector &rhs) const 
 
void pop_back()
Remove the last element (STL version). 
 
void clear()
Clear the vector and all storage. 
 
const_iterator end() const 
 
Abstraction layer and common utilities for multi-threaded programming. 
 
void resize(const size_t size, const T &value=T())
Resize the vector. 
 
ScopedMutex< Lock, WriteOp > ScopedWrite
A scoped mutex for a write operation. 
 
void expand(const size_t newSize, const T &item=T())
Resize the vector to at least the given size. 
 
const_iterator begin() const 
 
#define LBTHROW(exc)
Log a std::exception if topic LOG_EXCEPTION is set before throwing exception. 
 
iterator erase(typename LFVector< T, nSlots >::iterator pos)
Remove an element.