26 #ifndef __UTILS__BUFFER_H__INCL__
27 #define __UTILS__BUFFER_H__INCL__
51 template<
typename T >
53 :
public std::iterator< std::random_access_iterator_tag, T >
56 typedef std::iterator< std::random_access_iterator_tag, T >
_Base;
107 template<
typename T2 >
116 assert( 1 <=
mBuffer->
end< value_type >() - *
this );
124 const_reference
operator[]( difference_type diff )
const {
return *( *
this + diff ); }
130 return ( res += diff );
136 const difference_type res = ( diff *
sizeof(
value_type ) );
141 assert( 0 <=
mIndex + res );
164 return ( res -= diff );
184 return ( (
mIndex - oth.
mIndex ) /
sizeof( value_type ) );
231 template<
typename T >
260 iterator(
Buffer* buffer = NULL, size_type index = 0 ) : _Base( buffer, index ) {}
273 template<
typename T2 >
277 reference
operator*()
const {
return const_cast< reference
>( **(_Base*)
this ); }
281 reference
operator[]( difference_type diff )
const {
return *( *
this + diff ); }
287 return ( res += diff );
305 return ( res -= diff );
320 difference_type
operator-(
const _Base& oth )
const {
return ( *(_Base*)
this - oth ); }
340 Resize< uint8 >( len, fill );
351 template<
typename Iter >
380 template<
typename T >
383 template<
typename T >
386 template<
typename T >
389 template<
typename T >
399 template<
typename T >
400 T&
Get( size_type index ) {
return *( begin< T >() + index ); }
408 template<
typename T >
409 const T&
Get( size_type index )
const {
return *( begin< T >() + index ); }
436 template<
typename T >
443 _ResizeAt< T >( index, 1 );
446 AssignAt< T >( index, value );
454 template<
typename Iter >
459 index = end< typename std::iterator_traits< Iter >::value_type >();
462 _ResizeAt< typename std::iterator_traits< Iter >::value_type >( index, last - first );
465 AssignSeqAt< Iter >( index, first, last );
473 template<
typename T >
480 if( 1 <= end< T >() - index )
483 AssignAt< T >( index, value );
486 _ResizeAt< T >( index, 1 );
491 _ResizeAt< T >( index, 1 );
494 AssignAt< T >( index, value );
503 template<
typename Iter >
508 index = begin< typename std::iterator_traits< Iter >::value_type >();
511 if( last - first <=
end<
typename std::iterator_traits< Iter >::value_type >() - index )
514 AssignSeqAt< Iter >( index, first, last );
517 _ResizeAt< typename std::iterator_traits< Iter >::value_type >( index, last - first );
522 _ResizeAt< typename std::iterator_traits< Iter >::value_type >( index, last - first );
525 AssignSeqAt< Iter >( index, first, last );
535 template<
typename T >
539 assert( 1 <= end< T >() - index );
542 const size_type _index = ( index.template As< uint8 >() - begin< uint8 >() );
544 *(T*)&
mBuffer[ _index ] = value;
553 template<
typename Iter >
557 assert( last - first <=
end<
typename std::iterator_traits< Iter >::value_type >() - index );
563 const size_type _index = ( index.template As< uint8 >() - begin< uint8 >() );
565 const size_type _len =
sizeof(
typename std::iterator_traits< Iter >::value_type ) * ( last - first );
567 memmove( &
mBuffer[ _index ], &*first, _len );
576 template<
typename T >
580 Append< T >( value );
589 template<
typename T >
593 Assign< T >( value );
625 template<
typename T >
629 ReserveAt< T >( begin< T >(), requiredCount );
644 template<
typename T >
648 assert( index <= end< T >() );
651 const size_type _index = ( index.template As< uint8 >() - begin< uint8 >() );
653 const size_type _requiredSize =
sizeof( T ) * requiredCount;
656 if( _index + _requiredSize >
capacity() )
669 template<
typename T >
673 ResizeAt< T >( begin< T >(), requiredCount, fill );
687 template<
typename T >
691 assert( index <= end< T >() );
694 const size_type _oldSize =
size();
696 _ResizeAt< T >( index, requiredCount );
699 const size_type _index = ( index.template As< uint8 >() - begin< uint8 >() );
701 const size_type _requiredSize =
sizeof( T ) * requiredCount;
704 if( _index + _requiredSize > _oldSize )
706 memset( &
mBuffer[ _oldSize ], fill, _index + _requiredSize - _oldSize );
724 template<
typename T >
728 _ResizeAt< T >( begin< T >(), requiredCount );
739 template<
typename T >
743 assert( index <= end< T >() );
746 const size_type _index = ( index.template As< uint8 >() - begin< uint8 >() );
748 const size_type _requiredSize =
sizeof( T ) * requiredCount;
753 mSize = ( _index + _requiredSize );
768 assert( requiredSize <= newCapacity );
774 mBuffer = (
uint8*)realloc( mBuffer, newCapacity );
776 mCapacity = newCapacity;
793 size_type newCapacity = 0;
796 if( 0x100 < requiredSize )
799 else if( 0 < requiredSize )
805 if( requiredSize <= currentCapacity && currentCapacity < newCapacity )
806 return currentCapacity;
void Append(const T &value)
Appends a single value to buffer.
void ResizeAt(const_iterator< T > index, size_type requiredCount, const uint8 &fill=0)
Resizes buffer.
const_reference operator[](difference_type diff) const
Subscript operator.
_Base::const_reference const_reference
Typedef for const reference.
iterator & operator++()
Preincrement operator.
size_type mSize
Current size of buffer, in bytes.
iterator & operator--()
Predecrement operator.
const_iterator & operator=(const const_iterator &oth)
Copy operator.
static size_type _CalcBufferCapacity(size_type currentCapacity, size_type requiredSize)
Calculates buffer capacity.
const_iterator< T > begin() const
Buffer & operator=(const Buffer &value)
Copy operator.
const T * const_pointer
Typedef for const pointer.
std::iterator< std::random_access_iterator_tag, T > _Base
Typedef for our base due to readibility.
_Base::iterator_category iterator_category
Typedef for iterator category.
const Buffer * mBuffer
The parent Buffer.
const T & Get(size_type index) const
Gets const element from buffer.
size_t size_type
Typedef for size type.
~Buffer()
Destructor; deletes buffer.
_Base::value_type value_type
Typedef for value type.
void AssignAt(const_iterator< T > index, const T &value)
Assigns a single value to buffer at specific point.
pointer operator->() const
Dereference operator.
iterator & operator=(const iterator &oth)
Copy operator.
iterator(Buffer *buffer=NULL, size_type index=0)
Default constructor.
const_iterator(const Buffer *buffer=NULL, size_type index=0)
Default constructor.
void ReserveAt(const_iterator< T > index, size_type requiredCount)
Reserves (pre-allocates) memory for buffer at specific point.
reference operator[](difference_type diff) const
Subscript operator.
uint8 * mBuffer
Pointer to start of buffer.
Buffer(Iter first, Iter last)
Creates buffer with given content.
const_iterator operator+(difference_type diff) const
Sum operator.
_Base::const_pointer const_pointer
Typedef for const pointer.
const_iterator< T2 > As() const
Converts const_iterator to another const_iterator with different type.
const_iterator< T > end() const
iterator operator+(difference_type diff) const
Sum operator.
void SafeFree(T *&p)
Frees and nullifies an array pointer.
_Base::difference_type difference_type
Typedef for difference type.
void _Reallocate(size_type requiredSize)
Reallocates buffer.
int64 npowof2(int64 num)
Calculates next (greater or equal) power-of-two number.
_Base::pointer pointer
Typedef for pointer.
Generic class for buffers.
Buffer(size_type len=0, const uint8 &fill=0)
Creates buffer of given length.
void AppendSeq(Iter first, Iter last)
Appends a sequence of elements to buffer.
const_iterator & operator+=(difference_type diff)
Add operator.
bool operator==(const const_iterator &oth) const
Equal operator.
Buffer & operator<<(const T &value)
Appends a value to buffer.
iterator & operator-=(difference_type diff)
Subtract operator.
Buffer(const Buffer &oth)
Copy constructor.
iterator operator--(int)
Postdecrement operator.
iterator operator++(int)
Postincrement operator.
_Base::difference_type difference_type
Typedef for difference type.
const_iterator(const const_iterator &oth)
Copy constructor.
bool operator>=(const const_iterator &oth) const
Greater-equal operator.
void Resize(size_type requiredCount, const uint8 &fill=0)
Resizes buffer.
const_pointer operator->() const
Dereference operator.
const_reference operator*() const
Dereference operator.
void _ResizeAt(const_iterator< T > index, size_type requiredCount)
Resizes buffer.
bool operator!=(const const_iterator &oth) const
Non-equal operator.
iterator< T2 > As() const
Converts iterator to another iterator with different type.
size_type mCapacity
Current capacity of buffer, in bytes.
void Reserve(size_type requiredCount)
Reserves (pre-allocates) memory for buffer.
const uint8 & operator[](size_type index) const
Overload of const access operator[].
bool operator<=(const const_iterator &oth) const
Less-equal operator.
const_iterator< T > _Base
Typedef for our base due to readibility.
_Base::value_type value_type
Typedef for value type.
void _Resize(size_type requiredCount)
Resizes buffer.
difference_type operator-(const _Base &oth) const
Diff operator.
const_iterator & operator--()
Predecrement operator.
const_iterator operator++(int)
Postincrement operator.
void Assign(const T &value)
Assigns a single value to buffer.
_Base::pointer pointer
Typedef for pointer.
_Base::reference reference
Typedef for reference.
Buffer & operator=(const T &value)
Assigns new value to buffer.
bool operator<(const const_iterator &oth) const
Less-than operator.
bool operator>(const const_iterator &oth) const
Greater-than operator.
_Base::reference reference
Typedef for reference.
const_iterator & operator++()
Preincrement operator.
iterator operator-(difference_type diff) const
Diff operator.
difference_type operator-(const const_iterator &oth) const
Diff operator.
void AssignSeq(Iter first, Iter last)
Assigns a sequence of elements to buffer.
T & Get(size_type index)
Gets element from buffer.
const_iterator operator--(int)
Postdecrement operator.
iterator(const iterator &oth)
Copy constructor.
size_type capacity() const
reference operator*() const
Dereference operator.
_Base::iterator_category iterator_category
Typedef for iterator category.
void AssignSeqAt(const_iterator< typename std::iterator_traits< Iter >::value_type > index, Iter first, Iter last)
Assigns a sequence of elements to buffer at specific point.
iterator operator+=(difference_type diff)
Add operator.
size_type mIndex
Index in buffer, in bytes.
uint8 & operator[](size_type index)
Overload of access operator[].
const T & const_reference
Typedef for const reference.
const_iterator & operator-=(difference_type diff)
Subtract operator.
const_iterator operator-(difference_type diff) const
Diff operator.