@@ -202,6 +202,28 @@ class ario
202202 return parent->members_ .cend ();
203203 }
204204
205+ // ------------------------------------------------------------------------------
206+ // ! @brief Get a const reference to the first member
207+ // ! @return Const reference to the first member
208+ const Member& front () const
209+ {
210+ if ( parent->members_ .empty () ) {
211+ throw std::out_of_range ( " No members in archive" );
212+ }
213+ return parent->members_ .front ();
214+ }
215+
216+ // ------------------------------------------------------------------------------
217+ // ! @brief Get a const reference to the last member
218+ // ! @return Const reference to the last member
219+ const Member& back () const
220+ {
221+ if ( parent->members_ .empty () ) {
222+ throw std::out_of_range ( " No members in archive" );
223+ }
224+ return parent->members_ .back ();
225+ }
226+
205227 private:
206228 ario* parent; // !< Pointer to the parent ario object
207229 };
@@ -383,14 +405,14 @@ class ario
383405 // ! @brief Add a member to the archive
384406 // ! @param member The member to add
385407 // ! @param data The data associated with the member
386- // ! @param added_member Reference to store the added member
387408 // ! @return Error object indicating success or failure
388- Result
389- add_member ( const Member& member,
390- const std::string& data,
391- std::optional<std::reference_wrapper<const ario::Member>>&
392- added_member )
409+ Result add_member ( const Member& member, const std::string& data )
393410 {
411+ // Don't allow empty member names
412+ if ( member.name .empty () ) {
413+ return { " Member name cannot be empty" };
414+ }
415+
394416 // Check if the member with such name already exists
395417 for ( const auto & mem : members_ ) {
396418 if ( mem.name == member.name ) {
@@ -412,7 +434,6 @@ class ario
412434 new_member.short_name = " /" + std::to_string ( location );
413435 }
414436
415- added_member = new_member;
416437 return {};
417438 }
418439
@@ -476,7 +497,10 @@ class ario
476497
477498 pstream->read ( header, HEADER_SIZE );
478499 if ( pstream->gcount () < HEADER_SIZE ) {
479- break ; // End of file or error
500+ if ( pstream->gcount () > 0 ) {
501+ return { " Corrupted archive" }; // End of file or error
502+ }
503+ break ; // End of file reached
480504 }
481505 std::streamoff current_pos = pstream->tellg ();
482506 m.short_name = std::string ( header, FIELD_NAME_SIZE );
0 commit comments