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 >
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 >
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 >
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 >
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;
std::string className(const T &object)
Print the RTTI name of the given class.
An iterator for LFVector.
STL-like vector implementation providing certain thread-safety guarantees.
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).
LFVectorIterator< const LFVector< T, nSlots >, const T > const_iterator
Iterator over the const vector elements.
bool operator==(const LFVector &rhs) const
#define LBTHROW(exc)
Log a std::exception if topic LOG_EXCEPTION is set before throwing exception.
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.
void expand(const size_t newSize, const T &item=T())
Resize the vector to at least the given size.
const_iterator begin() const
LFVectorIterator< LFVector< T, nSlots >, T > iterator
Iterator over the vector elements.
iterator erase(typename LFVector< T, nSlots >::iterator pos)
Remove an element.