#include #include "mail.hpp" namespace smtp::manage { // //Constructors // Mail::Mail( file::Mail const& file_reader ) : mFileReader( file_reader ) { mMails = mFileReader.Read(); } // //Public methods // MailsSet Mail::GetMailToSend() const { return mMails; } bool Mail::AddMailsToSend( MailsSet const& mails_to_add ) { auto merged_mails = GetMergedMails( mails_to_add ); auto result = mFileReader.Write( merged_mails ); mMails = mFileReader.Read(); return result; } bool Mail::DeleteMailToSend( MailsSet const& mail_to_send ) { auto mails_to_delete = GetItersectionMails( mail_to_send ); auto result_set_after_delete = GetMailsAfterDelete( mails_to_delete ); auto result_of_delete = mFileReader.Write( result_set_after_delete ); if( result_of_delete ) { mMails = result_set_after_delete; } return result_of_delete; } // //Private methods // MailsSet Mail::GetMergedMails( MailsSet const& mails_to_add ) { MailsSet result; auto sorted_mail_to_add = mails_to_add; sorted_mail_to_add.sort(); mMails.sort(); std::set_union( mMails.cbegin(), mMails.cend(), sorted_mail_to_add.cbegin(), sorted_mail_to_add.cend(), std::back_inserter( result )); return result; } MailsSet Mail::GetItersectionMails( MailsSet const& mail_to_send ) { MailsSet result; auto sorted_mail_to_send = mail_to_send; sorted_mail_to_send.sort(); mMails.sort(); std::set_intersection( mMails.cbegin(), mMails.cend(), sorted_mail_to_send.cbegin(), sorted_mail_to_send.cend(), std::back_inserter( result )); return result; } MailsSet Mail::GetMailsAfterDelete( MailsSet const& result_set_after_delete ) { auto result = mMails; for( const auto& element_to_delete: result_set_after_delete ) { result.remove( element_to_delete ); } return result; } }