Skip to content

Commit 2505fbc

Browse files
committed
feat(Data): Support for std::vector
1 parent ede01f5 commit 2505fbc

File tree

3 files changed

+97
-1
lines changed

3 files changed

+97
-1
lines changed

CF++/include/CF++/CFPP-Data.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#ifndef CFPP_DATA_HPP
3232
#define CFPP_DATA_HPP
3333

34+
#include <vector>
35+
3436
namespace CF
3537
{
3638
class CFPP_EXPORT Data: public PropertyListType< Data >
@@ -60,6 +62,7 @@ namespace CF
6062
Data( const std::string & value );
6163
Data( const Byte * value, CFIndex length );
6264
Data( std::initializer_list< Byte > value );
65+
Data( const std::vector< Byte > & value );
6366
Data( Data && value ) noexcept;
6467

6568
~Data() override;
@@ -71,6 +74,7 @@ namespace CF
7174
Data & operator =( CFStringRef value );
7275
Data & operator =( std::nullptr_t );
7376
Data & operator =( const std::string & value );
77+
Data & operator =( const std::vector< Byte > & value );
7478

7579
operator const Byte * () const;
7680
operator std::string () const;
@@ -82,6 +86,7 @@ namespace CF
8286
Data & operator += ( CFDataRef value );
8387
Data & operator += ( const Data & value );
8488
Data & operator += ( const std::string & value );
89+
Data & operator += ( const std::vector< Byte > & value );
8590

8691
CFTypeID GetTypeID() const override;
8792
CFTypeRef GetCFObject() const override;

CF++/source/CFPP-Data.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,15 @@ namespace CF
118118
}
119119
}
120120

121-
Data::Data( std::initializer_list< Byte > value ): Data( static_cast< CFIndex >( value.size() ) )
121+
Data::Data( std::initializer_list< Byte > value ): Data()
122+
{
123+
for( Byte b: value )
124+
{
125+
CFDataAppendBytes( this->_cfObject, &b, 1 );
126+
}
127+
}
128+
129+
Data::Data( const std::vector< Byte > & value ): Data()
122130
{
123131
for( Byte b: value )
124132
{
@@ -179,6 +187,11 @@ namespace CF
179187
return operator =( Data( value ) );
180188
}
181189

190+
Data & Data::operator =( const std::vector< Byte > & value )
191+
{
192+
return operator =( Data( value ) );
193+
}
194+
182195
Data::operator const Byte * () const
183196
{
184197
if( this->_cfObject == nullptr )
@@ -262,6 +275,16 @@ namespace CF
262275
return *( this );
263276
}
264277

278+
Data & Data::operator += ( const std::vector< Byte > & value )
279+
{
280+
if( this->_cfObject != nullptr )
281+
{
282+
CFDataAppendBytes( this->_cfObject, value.data(), static_cast< CFIndex >( value.size() ) );
283+
}
284+
285+
return *( this );
286+
}
287+
265288
CFTypeID Data::GetTypeID() const
266289
{
267290
return CFDataGetTypeID();

Unit-Tests/Test-CFPP-Data.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,19 @@ TEST( CFPP_Data, CTOR_STDInitializerList )
133133
ASSERT_TRUE( d[ 3 ] == 0xEF );
134134
}
135135

136+
TEST( CFPP_Data, CTOR_STDVector )
137+
{
138+
CF::Data d( std::vector< CF::Data::Byte > { 0xDE, 0xAD, 0xBE, 0xEF } );
139+
140+
ASSERT_TRUE( d.IsValid() );
141+
ASSERT_TRUE( d.GetLength() == 4 );
142+
143+
ASSERT_TRUE( d[ 0 ] == 0xDE );
144+
ASSERT_TRUE( d[ 1 ] == 0xAD );
145+
ASSERT_TRUE( d[ 2 ] == 0xBE );
146+
ASSERT_TRUE( d[ 3 ] == 0xEF );
147+
}
148+
136149
TEST( CFPP_Data, CCTOR )
137150
{
138151
CF::Data d1;
@@ -293,6 +306,32 @@ TEST( CFPP_Data, OperatorAssignSTDString )
293306
ASSERT_TRUE( d2.GetLength() == 0 );
294307
}
295308

309+
TEST( CFPP_Data, OperatorAssignSTDVector )
310+
{
311+
CF::Data d1( { 0xFF } );
312+
CF::Data d2( { 0xFF } );
313+
314+
ASSERT_TRUE( d1.IsValid() );
315+
ASSERT_TRUE( d2.IsValid() );
316+
317+
ASSERT_EQ( d1.GetLength(), 1 );
318+
ASSERT_EQ( d2.GetLength(), 1 );
319+
320+
d1 = std::vector< CF::Data::Byte >( { 0xDE, 0xAD, 0xBE, 0xEF } );
321+
d2 = std::vector< CF::Data::Byte >( {} );
322+
323+
ASSERT_TRUE( d1.IsValid() );
324+
ASSERT_TRUE( d2.IsValid() );
325+
326+
ASSERT_EQ( d1.GetLength(), 4 );
327+
ASSERT_EQ( d2.GetLength(), 0 );
328+
329+
ASSERT_TRUE( d1[ 0 ] == 0xDE );
330+
ASSERT_TRUE( d1[ 1 ] == 0xAD );
331+
ASSERT_TRUE( d1[ 2 ] == 0xBE );
332+
ASSERT_TRUE( d1[ 3 ] == 0xEF );
333+
}
334+
296335
TEST( CFPP_Data, Referencing )
297336
{
298337
CF::Data d1;
@@ -478,6 +517,35 @@ TEST( CFPP_Data, OperatorPlusEqualSTDString )
478517
ASSERT_TRUE( d2[ 4 ] == 'h' );
479518
}
480519

520+
TEST( CFPP_Data, OperatorPlusEqualSTDVector )
521+
{
522+
CF::Data d1( { 0xFF } );
523+
CF::Data d2( { 0xFF } );
524+
525+
ASSERT_TRUE( d1.IsValid() );
526+
ASSERT_TRUE( d2.IsValid() );
527+
528+
ASSERT_EQ( d1.GetLength(), 1 );
529+
ASSERT_EQ( d2.GetLength(), 1 );
530+
531+
d1 += std::vector< CF::Data::Byte >( { 0xDE, 0xAD, 0xBE, 0xEF } );
532+
d2 += std::vector< CF::Data::Byte >( {} );
533+
534+
ASSERT_TRUE( d1.IsValid() );
535+
ASSERT_TRUE( d2.IsValid() );
536+
537+
ASSERT_EQ( d1.GetLength(), 5 );
538+
ASSERT_EQ( d2.GetLength(), 1 );
539+
540+
ASSERT_TRUE( d1[ 0 ] == 0xFF );
541+
ASSERT_TRUE( d1[ 1 ] == 0xDE );
542+
ASSERT_TRUE( d1[ 2 ] == 0xAD );
543+
ASSERT_TRUE( d1[ 3 ] == 0xBE );
544+
ASSERT_TRUE( d1[ 4 ] == 0xEF );
545+
546+
ASSERT_TRUE( d2[ 0 ] == 0xFF );
547+
}
548+
481549
TEST( CFPP_Data, GetTypeID )
482550
{
483551
CF::Data d;

0 commit comments

Comments
 (0)