// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <algorithm>
#include "chrome/browser/autofill/form_group.h"
#include <iterator>
const string16 FormGroup::Label() const { return string16(); }
bool FormGroup::operator!=(const FormGroup& form_group) const {
FieldTypeSet a, b, symmetric_difference;
GetAvailableFieldTypes(&a);
form_group.GetAvailableFieldTypes(&b);
std::set_symmetric_difference(
a.begin(), a.end(),
b.begin(), b.end(),
std::inserter(symmetric_difference, symmetric_difference.begin()));
if (!symmetric_difference.empty())
return true;
return (!IntersectionOfTypesHasEqualValues(form_group));
}
bool FormGroup::IsSubsetOf(const FormGroup& form_group) const {
FieldTypeSet types;
GetAvailableFieldTypes(&types);
for (FieldTypeSet::const_iterator iter = types.begin(); iter != types.end();
++iter) {
if (StringToLowerASCII(GetInfo(*iter)) !=
StringToLowerASCII(form_group.GetInfo(*iter)))
return false;
}
return true;
}
bool FormGroup::IntersectionOfTypesHasEqualValues(
const FormGroup& form_group) const {
FieldTypeSet a, b, intersection;
GetAvailableFieldTypes(&a);
form_group.GetAvailableFieldTypes(&b);
std::set_intersection(a.begin(), a.end(),
b.begin(), b.end(),
std::inserter(intersection, intersection.begin()));
// An empty intersection can't have equal values.
if (intersection.empty())
return false;
for (FieldTypeSet::const_iterator iter = intersection.begin();
iter != intersection.end(); ++iter) {
if (StringToLowerASCII(GetInfo(*iter)) !=
StringToLowerASCII(form_group.GetInfo(*iter)))
return false;
}
return true;
}
void FormGroup::MergeWith(const FormGroup& form_group) {
FieldTypeSet a, b, intersection;
GetAvailableFieldTypes(&a);
form_group.GetAvailableFieldTypes(&b);
std::set_difference(b.begin(), b.end(),
a.begin(), a.end(),
std::inserter(intersection, intersection.begin()));
for (FieldTypeSet::const_iterator iter = intersection.begin();
iter != intersection.end(); ++iter) {
SetInfo(*iter, form_group.GetInfo(*iter));
}
}
void FormGroup::OverwriteWith(const FormGroup& form_group) {
FieldTypeSet a;;
form_group.GetAvailableFieldTypes(&a);
for (FieldTypeSet::const_iterator iter = a.begin(); iter != a.end(); ++iter) {
SetInfo(*iter, form_group.GetInfo(*iter));
}
}