diff --git a/src/header.cpp b/src/header.cpp index 719e2456..d7159e00 100644 --- a/src/header.cpp +++ b/src/header.cpp @@ -24,6 +24,8 @@ #include "vmime/header.hpp" #include "vmime/parserHelpers.hpp" +#include + namespace vmime { @@ -143,29 +145,23 @@ header& header::operator=(const header& other) const bool header::hasField(const string& fieldName) const { - const string name = utility::stringUtils::toLower(fieldName); + std::vector >::const_iterator pos = + std::find_if(m_fields.begin(), m_fields.end(), + fieldHasName(utility::stringUtils::toLower(fieldName))); - std::vector >::const_iterator pos = m_fields.begin(); - const std::vector >::const_iterator end = m_fields.end(); - - for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos); - - return (pos != end); + return (pos != m_fields.end()); } ref header::findField(const string& fieldName) const { - const string name = utility::stringUtils::toLower(fieldName); - // Find the first field that matches the specified name - std::vector >::const_iterator pos = m_fields.begin(); - const std::vector >::const_iterator end = m_fields.end(); - - for ( ; pos != end && utility::stringUtils::toLower((*pos)->getName()) != name ; ++pos); + std::vector >::const_iterator pos = + std::find_if(m_fields.begin(), m_fields.end(), + fieldHasName(utility::stringUtils::toLower(fieldName))); // No field with this name can be found - if (pos == end) + if (pos == m_fields.end()) { throw exceptions::no_such_field(); } @@ -179,21 +175,11 @@ ref header::findField(const string& fieldName) const std::vector > header::findAllFields(const string& fieldName) { - const string name = utility::stringUtils::toLower(fieldName); - std::vector > result; + std::back_insert_iterator > > back(result); - std::vector >::const_iterator pos = m_fields.begin(); - const std::vector >::const_iterator end = m_fields.end(); - - for ( ; pos != end ; ++pos) - { - // Add the header if it matches the specified type - if (utility::stringUtils::toLower((*pos)->getName()) == name) - { - result.push_back(*pos); - } - } + std::remove_copy_if(m_fields.begin(), m_fields.end(), back, + fieldHasNotName(utility::stringUtils::toLower(fieldName))); return result; } @@ -360,4 +346,30 @@ const std::vector > header::getChildComponents() const } + +// Field search + + +header::fieldHasName::fieldHasName(const string& name) + : m_name(name) +{ +} + +const bool header::fieldHasName::operator() (const ref & field) +{ + return utility::stringUtils::toLower(field->getName()) == m_name; +} + + +header::fieldHasNotName::fieldHasNotName(const string& name) + : m_name(name) +{ +} + +const bool header::fieldHasNotName::operator() (const ref & field) +{ + return utility::stringUtils::toLower(field->getName()) != m_name; +} + + } // vmime diff --git a/vmime/header.hpp b/vmime/header.hpp index 9f10ed41..3d286ae1 100644 --- a/vmime/header.hpp +++ b/vmime/header.hpp @@ -226,6 +226,31 @@ private: std::vector > m_fields; + + class fieldHasName + { + public: + + fieldHasName(const string& name); + const bool operator() (const ref & field); + + private: + + string m_name; + }; + + class fieldHasNotName + { + public: + + fieldHasNotName(const string& name); + const bool operator() (const ref & field); + + private: + + string m_name; + }; + public: using component::parse;