Home | History | Annotate | Download | only in autofill
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <algorithm>
      6 
      7 #include "chrome/browser/autofill/form_group.h"
      8 
      9 #include <iterator>
     10 
     11 const string16 FormGroup::Label() const { return string16(); }
     12 
     13 bool FormGroup::operator!=(const FormGroup& form_group) const {
     14   FieldTypeSet a, b, symmetric_difference;
     15   GetAvailableFieldTypes(&a);
     16   form_group.GetAvailableFieldTypes(&b);
     17   std::set_symmetric_difference(
     18       a.begin(), a.end(),
     19       b.begin(), b.end(),
     20       std::inserter(symmetric_difference, symmetric_difference.begin()));
     21 
     22   if (!symmetric_difference.empty())
     23     return true;
     24 
     25   return (!IntersectionOfTypesHasEqualValues(form_group));
     26 }
     27 
     28 bool FormGroup::IsSubsetOf(const FormGroup& form_group) const {
     29   FieldTypeSet types;
     30   GetAvailableFieldTypes(&types);
     31 
     32   for (FieldTypeSet::const_iterator iter = types.begin(); iter != types.end();
     33        ++iter) {
     34     if (StringToLowerASCII(GetInfo(*iter)) !=
     35           StringToLowerASCII(form_group.GetInfo(*iter)))
     36       return false;
     37   }
     38 
     39   return true;
     40 }
     41 
     42 bool FormGroup::IntersectionOfTypesHasEqualValues(
     43     const FormGroup& form_group) const {
     44   FieldTypeSet a, b, intersection;
     45   GetAvailableFieldTypes(&a);
     46   form_group.GetAvailableFieldTypes(&b);
     47   std::set_intersection(a.begin(), a.end(),
     48                         b.begin(), b.end(),
     49                         std::inserter(intersection, intersection.begin()));
     50 
     51   // An empty intersection can't have equal values.
     52   if (intersection.empty())
     53     return false;
     54 
     55   for (FieldTypeSet::const_iterator iter = intersection.begin();
     56        iter != intersection.end(); ++iter) {
     57     if (StringToLowerASCII(GetInfo(*iter)) !=
     58           StringToLowerASCII(form_group.GetInfo(*iter)))
     59       return false;
     60   }
     61 
     62   return true;
     63 }
     64 
     65 void FormGroup::MergeWith(const FormGroup& form_group) {
     66   FieldTypeSet a, b, intersection;
     67   GetAvailableFieldTypes(&a);
     68   form_group.GetAvailableFieldTypes(&b);
     69   std::set_difference(b.begin(), b.end(),
     70                       a.begin(), a.end(),
     71                       std::inserter(intersection, intersection.begin()));
     72 
     73   for (FieldTypeSet::const_iterator iter = intersection.begin();
     74        iter != intersection.end(); ++iter) {
     75     SetInfo(*iter, form_group.GetInfo(*iter));
     76   }
     77 }
     78 
     79 void FormGroup::OverwriteWith(const FormGroup& form_group) {
     80   FieldTypeSet a;;
     81   form_group.GetAvailableFieldTypes(&a);
     82 
     83   for (FieldTypeSet::const_iterator iter = a.begin(); iter != a.end(); ++iter) {
     84     SetInfo(*iter, form_group.GetInfo(*iter));
     85   }
     86 }
     87