#include <logfunc.hpp>
using namespace std;
-using boost::scoped_array;
using I2n::Logger::GlobalLogger;
//-----------------------------------------------------------------------------
const std::size_t &payload_size_in_bytes
) :
PayloadSizeInBytes( payload_size_in_bytes ),
- Payload( new uint8_t[ payload_size_in_bytes ] )
+ Payload( payload_size_in_bytes )
{
BOOST_ASSERT( 0 < PayloadSizeInBytes );
- BOOST_ASSERT( Payload.get() != NULL );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
- fill( Payload.get(), Payload.get() + PayloadSizeInBytes, 0 );
+ fill( Payload.begin(), Payload.end(), 0 );
}
/**
const MessagePayload &other
) :
PayloadSizeInBytes( other.PayloadSizeInBytes ),
- Payload( new uint8_t[ other.PayloadSizeInBytes ] )
+ Payload( other.PayloadSizeInBytes )
{
BOOST_ASSERT( 0 < PayloadSizeInBytes );
- BOOST_ASSERT( Payload.get() != NULL );
- BOOST_ASSERT( other.Payload.get() != NULL );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+ BOOST_ASSERT( other.Payload.capacity() == other.PayloadSizeInBytes );
- copy( other.Payload.get(), other.Payload.get() + PayloadSizeInBytes, Payload.get() );
+ copy( other.Payload.begin(), other.Payload.end(), Payload.begin() );
BOOST_ASSERT( PayloadSizeInBytes == other.PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() >= other.Payload.size() );
+ BOOST_ASSERT( equal( Payload.begin(), Payload.end(), other.Payload.begin() ) );
+ BOOST_ASSERT( equal( other.Payload.begin(), other.Payload.end(), Payload.begin() ) );
}
/**
MessagePayload& MessagePayload::operator=( const MessagePayload &other )
{
BOOST_ASSERT( 0 < PayloadSizeInBytes );
- BOOST_ASSERT( Payload.get() != NULL );
- BOOST_ASSERT( other.Payload.get() != NULL );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+ BOOST_ASSERT( other.Payload.capacity() == other.PayloadSizeInBytes );
+ BOOST_ASSERT( !other.Payload.empty() );
// checking for self-assignment (i.e. object1 = object1)
- if ( &other == this ) {
+ if ( &other == this )
+ {
return *this;
}
size_t new_payload_size_in_bytes = other.PayloadSizeInBytes;
- uint8_t *new_payload_data = new uint8_t[ new_payload_size_in_bytes ];
- Payload.reset( new_payload_data );
- PayloadSizeInBytes = new_payload_size_in_bytes;
+ size_t old_payload_size_in_bytes = PayloadSizeInBytes;
+ if ( new_payload_size_in_bytes > old_payload_size_in_bytes )
+ {
+ Payload.reserve( new_payload_size_in_bytes );
+ PayloadSizeInBytes = new_payload_size_in_bytes;
+ }
- copy( other.Payload.get(), other.Payload.get() + other.PayloadSizeInBytes, Payload.get() );
+ copy( other.Payload.begin(), other.Payload.end(), Payload.begin() );
BOOST_ASSERT( PayloadSizeInBytes == other.PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() >= other.Payload.size() );
+ BOOST_ASSERT( equal( Payload.begin(), Payload.end(), other.Payload.begin() ) );
+ BOOST_ASSERT( equal( other.Payload.begin(), other.Payload.end(), Payload.begin() ) );
return *this; //lint !e429
}
*/
const uint8_t& MessagePayload::operator[]( size_t offset ) const
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
BOOST_ASSERT( offset < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
- ptrdiff_t index = static_cast<ptrdiff_t>(offset);
+ ptrdiff_t index = static_cast<ptrdiff_t>( offset );
return Payload[ index ];
}
*/
uint8_t& MessagePayload::operator[]( size_t offset )
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
BOOST_ASSERT( offset < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
- ptrdiff_t index = static_cast<ptrdiff_t>(offset);
+ ptrdiff_t index = static_cast<ptrdiff_t>( offset );
return Payload[ index ];
} //lint !e1762
*
* @return a pointer to the array encapsulated by this class.
*/
-uint8_t* MessagePayload::get() const
+uint8_t* MessagePayload::get()
{
- return Payload.get();
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+
+ // Vector containers have their elements stored in contiguous storage
+ // locations, which means that their elements can be accessed not only
+ // using iterators but also using offsets on regular pointers to elements.
+ return static_cast<uint8_t *>( &Payload[ 0 ] );
}
/**
const size_t extra_payload_size_in_bytes
)
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
BOOST_ASSERT( extra_payload_data != NULL );
if ( 0 < extra_payload_size_in_bytes )
{
BOOST_ASSERT( 0 < extra_payload_size_in_bytes );
- // as Payload.reset() deletes the array previously held by Payload, we
- // can't reference that array by old_payload_data pointer, thus it is
- // required to copy the old array to another memory location in order to
- // keep the original data intact
size_t old_payload_size_in_bytes = PayloadSizeInBytes;
- uint8_t *old_payload_data = new uint8_t[ old_payload_size_in_bytes ];
- copy( Payload.get(), Payload.get() + PayloadSizeInBytes, old_payload_data );
- scoped_array<uint8_t> old_payload( old_payload_data );
-
size_t new_payload_size_in_bytes = old_payload_size_in_bytes + extra_payload_size_in_bytes;
- uint8_t *new_payload_data = new uint8_t[ new_payload_size_in_bytes ];
-
- // copy both data, the original and the one to be appended, to the new
- // buffer, in contiguous memory.
- copy( &old_payload_data[0], &old_payload_data[old_payload_size_in_bytes], &new_payload_data[0] );
- copy( &extra_payload_data[0], &extra_payload_data[extra_payload_size_in_bytes], &new_payload_data[old_payload_size_in_bytes] );
-
- // the reset() deletes the old array held by Payload
- Payload.reset( new_payload_data );
PayloadSizeInBytes = new_payload_size_in_bytes;
+ Payload.insert( Payload.end(),
+ &extra_payload_data[ 0 ],
+ &extra_payload_data[ extra_payload_size_in_bytes ]
+ );
+
#ifndef BOOST_DISABLE_ASSERTS
BOOST_ASSERT( PayloadSizeInBytes == ( old_payload_size_in_bytes + extra_payload_size_in_bytes ) );
- uint8_t *original_data_begin = Payload.get();
- uint8_t *original_data_end = Payload.get() + old_payload_size_in_bytes;
- BOOST_ASSERT( equal( original_data_begin, original_data_end, old_payload_data ) );
-
- uint8_t *extra_data_begin = Payload.get() + old_payload_size_in_bytes;
- uint8_t *extra_data_end = Payload.get() + old_payload_size_in_bytes + extra_payload_size_in_bytes;
+ uint8_t *extra_data_begin = &Payload[ old_payload_size_in_bytes ];
+ uint8_t *extra_data_end = &Payload[ old_payload_size_in_bytes + extra_payload_size_in_bytes ];
BOOST_ASSERT( equal( extra_data_begin, extra_data_end, extra_payload_data ) );
#endif
}
const int bit_index
) const
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
const int max_bit_index = 7;
BOOST_ASSERT( ( 0 <= byte_index ) && ( byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( ( 0 <= bit_index ) && ( bit_index <= max_bit_index ) );
const int byte_index,
const int bit_index,
const bool value
-) const
+)
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
const int max_bit_index = 7;
BOOST_ASSERT( ( 0 <= byte_index ) && ( byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( ( 0 <= bit_index ) && ( bit_index <= max_bit_index ) );
const int right_byte_index
) const
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
BOOST_ASSERT( ( 0 <= left_byte_index ) && ( left_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( ( 0 <= right_byte_index ) && ( right_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( left_byte_index < right_byte_index );
const int left_byte_index,
const int right_byte_index,
const uint16_t value
-) const
+)
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
BOOST_ASSERT( ( 0 <= left_byte_index ) && ( left_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( ( 0 <= right_byte_index ) && ( right_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( left_byte_index < right_byte_index );
const int last_byte_index
) const
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
BOOST_ASSERT( ( 0 <= first_byte_index ) && ( first_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( ( 0 <= last_byte_index ) && ( last_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( first_byte_index < last_byte_index );
const int first_byte_index,
const int last_byte_index,
const uint32_t value
-) const
+)
{
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
BOOST_ASSERT( ( 0 <= first_byte_index ) && ( first_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( ( 0 <= last_byte_index ) && ( last_byte_index < static_cast<int>(PayloadSizeInBytes) ) );
BOOST_ASSERT( first_byte_index < last_byte_index );
*/
istream& MessagePayload::read( istream &is )
{
- BOOST_ASSERT( Payload.get() != NULL );
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
- char *payload_data_array = reinterpret_cast<char *>( Payload.get() );
+ char *payload_data_array = reinterpret_cast<char *>( &Payload[ 0 ] );
(void) is.read( payload_data_array, static_cast<streamsize>( PayloadSizeInBytes ) );
<< " bytes, but received " << is.gcount() << " bytes." << endl;
}
+ BOOST_ASSERT( Payload.size() == PayloadSizeInBytes );
+ BOOST_ASSERT( !Payload.empty() );
+
return is;
}
*/
ostream& MessagePayload::write( ostream &os ) const
{
- BOOST_ASSERT( Payload.get() != NULL );
+ BOOST_ASSERT( 0 < PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.capacity() == PayloadSizeInBytes );
+ BOOST_ASSERT( Payload.size() == PayloadSizeInBytes );
+ BOOST_ASSERT( !Payload.empty() );
- const char *data_array = reinterpret_cast<const char *>( Payload.get() );
+ // Vector containers have their elements stored in contiguous storage
+ // locations, which means that their elements can be accessed not only
+ // using iterators but also using offsets on regular pointers to elements.
+ const char *payload_data_array = reinterpret_cast<const char *>( &Payload[ 0 ] );
- (void) os.write( data_array, static_cast<streamsize>( PayloadSizeInBytes ) );
+ (void) os.write( payload_data_array, static_cast<streamsize>( PayloadSizeInBytes ) );
return os;
}