| Index: chrome/browser/autofill/personal_data_manager.cc | 
| diff --git a/chrome/browser/autofill/personal_data_manager.cc b/chrome/browser/autofill/personal_data_manager.cc | 
| index 894fa6b0061060a3af2c0da22549ff1bf50aba6b..a4475cbb484ea8a2ed66ddebcbf678881f0f132f 100644 | 
| --- a/chrome/browser/autofill/personal_data_manager.cc | 
| +++ b/chrome/browser/autofill/personal_data_manager.cc | 
| @@ -41,6 +41,19 @@ class FormGroupGUIDMatchesFunctor { | 
| }; | 
|  | 
| template<typename T> | 
| +class FormGroupGUIDMatchesFunctor<T *> { | 
| + public: | 
| +  explicit FormGroupGUIDMatchesFunctor(const std::string& guid) : guid_(guid) {} | 
| + | 
| +  bool operator()(const T* form_group) { | 
| +    return form_group->guid() == guid_; | 
| +  } | 
| + | 
| + private: | 
| +  std::string guid_; | 
| +}; | 
| + | 
| +template<typename T> | 
| class DereferenceFunctor { | 
| public: | 
| template<typename T_Iterator> | 
| @@ -54,49 +67,10 @@ T* address_of(T& v) { | 
| return &v; | 
| } | 
|  | 
| -bool FindInProfilesByGUID(const std::vector<AutoFillProfile>& profiles, | 
| -                          const std::string& guid) { | 
| -  for (std::vector<AutoFillProfile>::const_iterator iter = profiles.begin(); | 
| -       iter != profiles.end(); | 
| -       ++iter) { | 
| -    if (iter->guid() == guid) | 
| -      return true; | 
| -  } | 
| -  return false; | 
| -} | 
| - | 
| -bool FindInScopedProfilesByGUID(const ScopedVector<AutoFillProfile>& profiles, | 
| -                                const std::string& guid) { | 
| -  for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin(); | 
| -       iter != profiles.end(); | 
| -       ++iter) { | 
| -    if ((*iter)->guid() == guid) | 
| -      return true; | 
| -  } | 
| -  return false; | 
| -} | 
| - | 
| -bool FindInCreditCardsByGUID(const std::vector<CreditCard>& credit_cards, | 
| -                             const std::string& guid) { | 
| -  for (std::vector<CreditCard>::const_iterator iter = credit_cards.begin(); | 
| -       iter != credit_cards.end(); | 
| -       ++iter) { | 
| -    if (iter->guid() == guid) | 
| -      return true; | 
| -  } | 
| -  return false; | 
| -} | 
| - | 
| -bool FindInScopedCreditCardsByGUID( | 
| -    const ScopedVector<CreditCard>& credit_cards, const std::string& guid) { | 
| -  for (std::vector<CreditCard*>::const_iterator iter = | 
| -          credit_cards.begin(); | 
| -       iter != credit_cards.end(); | 
| -       ++iter) { | 
| -    if ((*iter)->guid() == guid) | 
| -      return true; | 
| -  } | 
| -  return false; | 
| +template<typename T, typename C> | 
| +bool FindByGUID(const C& container, const std::string& guid) { | 
| +  return std::find_if(container.begin(), container.end(), | 
| +                      FormGroupGUIDMatchesFunctor<T>(guid)) != container.end(); | 
| } | 
|  | 
| }  // namespace | 
| @@ -328,21 +302,21 @@ void PersonalDataManager::SetProfiles(std::vector<AutoFillProfile>* profiles) { | 
| for (std::vector<AutoFillProfile*>::const_iterator iter = | 
| web_profiles_.begin(); | 
| iter != web_profiles_.end(); ++iter) { | 
| -    if (!FindInProfilesByGUID(*profiles, (*iter)->guid())) | 
| +    if (!FindByGUID<AutoFillProfile>(*profiles, (*iter)->guid())) | 
| wds->RemoveAutoFillProfileGUID((*iter)->guid()); | 
| } | 
|  | 
| // Update the web database with the existing profiles. | 
| for (std::vector<AutoFillProfile>::iterator iter = profiles->begin(); | 
| iter != profiles->end(); ++iter) { | 
| -    if (FindInScopedProfilesByGUID(web_profiles_, iter->guid())) | 
| +    if (FindByGUID<AutoFillProfile*>(web_profiles_, iter->guid())) | 
| wds->UpdateAutoFillProfileGUID(*iter); | 
| } | 
|  | 
| // Add the new profiles to the web database. | 
| for (std::vector<AutoFillProfile>::iterator iter = profiles->begin(); | 
| iter != profiles->end(); ++iter) { | 
| -    if (!FindInScopedProfilesByGUID(web_profiles_, iter->guid())) | 
| +    if (!FindByGUID<AutoFillProfile*>(web_profiles_, iter->guid())) | 
| wds->AddAutoFillProfileGUID(*iter); | 
| } | 
|  | 
| @@ -381,21 +355,21 @@ void PersonalDataManager::SetCreditCards( | 
| // removed. | 
| for (std::vector<CreditCard*>::const_iterator iter = credit_cards_.begin(); | 
| iter != credit_cards_.end(); ++iter) { | 
| -    if (!FindInCreditCardsByGUID(*credit_cards, (*iter)->guid())) | 
| +    if (!FindByGUID<CreditCard>(*credit_cards, (*iter)->guid())) | 
| wds->RemoveCreditCardGUID((*iter)->guid()); | 
| } | 
|  | 
| // Update the web database with the existing credit cards. | 
| for (std::vector<CreditCard>::iterator iter = credit_cards->begin(); | 
| iter != credit_cards->end(); ++iter) { | 
| -    if (FindInScopedCreditCardsByGUID(credit_cards_, iter->guid())) | 
| +    if (FindByGUID<CreditCard*>(credit_cards_, iter->guid())) | 
| wds->UpdateCreditCardGUID(*iter); | 
| } | 
|  | 
| // Add the new credit cards to the web database. | 
| for (std::vector<CreditCard>::iterator iter = credit_cards->begin(); | 
| iter != credit_cards->end(); ++iter) { | 
| -    if (!FindInScopedCreditCardsByGUID(credit_cards_, iter->guid())) | 
| +    if (!FindByGUID<CreditCard*>(credit_cards_, iter->guid())) | 
| wds->AddCreditCardGUID(*iter); | 
| } | 
|  | 
|  |