[Sync] Clean up ModelType code.

Various cleanup of ModelType usage and implementation. When enumerating
the types in a hard coded manner, we should always strive to order the
code to reflect model_type.h's order. ModelTypeSet's methods are
slightly more inline-able. Updated ModelType histogram and static
asserts.

BUG=

Review-Url: https://codereview.chromium.org/2701003002
Cr-Commit-Position: refs/heads/master@{#453616}
diff --git a/components/sync/base/enum_set_unittest.cc b/components/sync/base/enum_set_unittest.cc
index e6293f9..8f32c7f 100644
--- a/components/sync/base/enum_set_unittest.cc
+++ b/components/sync/base/enum_set_unittest.cc
@@ -77,6 +77,11 @@
   EXPECT_FALSE(enums.Has(TEST_4));
 }
 
+TEST_F(EnumSetTest, DuplicatesInConstructor) {
+  EXPECT_EQ(TestEnumSet(TEST_3, TEST_1, TEST_0, TEST_3, TEST_1, TEST_3),
+            TestEnumSet(TEST_0, TEST_1, TEST_3));
+}
+
 TEST_F(EnumSetTest, All) {
   const TestEnumSet enums(TestEnumSet::All());
   EXPECT_FALSE(enums.Empty());
@@ -88,6 +93,13 @@
   EXPECT_TRUE(enums.Has(TEST_4));
 }
 
+TEST_F(EnumSetTest, FromRange) {
+  EXPECT_EQ(TestEnumSet(TEST_1, TEST_2, TEST_3),
+            TestEnumSet::FromRange(TEST_1, TEST_3));
+  EXPECT_EQ(TestEnumSet::All(), TestEnumSet::FromRange(TEST_0, TEST_4));
+  EXPECT_EQ(TestEnumSet(TEST_1), TestEnumSet::FromRange(TEST_1, TEST_1));
+}
+
 TEST_F(EnumSetTest, Put) {
   TestEnumSet enums(TEST_3);
   enums.Put(TEST_2);
@@ -102,6 +114,12 @@
   EXPECT_EQ(TestEnumSet(TEST_2, TEST_3, TEST_4), enums);
 }
 
+TEST_F(EnumSetTest, PutRange) {
+  TestEnumSet enums;
+  enums.PutRange(TEST_1, TEST_3);
+  EXPECT_EQ(TestEnumSet(TEST_1, TEST_2, TEST_3), enums);
+}
+
 TEST_F(EnumSetTest, RetainAll) {
   TestEnumSet enums(TEST_3, TEST_4);
   enums.RetainAll(TestEnumSet(TEST_2, TEST_3));