Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: components/policy/core/common/schema.cc

Issue 2539363004: Make base::Value::TYPE a scoped enum. (Closed)
Patch Set: Rebase Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/policy/core/common/schema.h ('k') | components/policy/core/common/schema_internal.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/policy/core/common/schema.h" 5 #include "components/policy/core/common/schema.h"
6 6
7 #include <limits.h> 7 #include <limits.h>
8 #include <stddef.h> 8 #include <stddef.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 // pointer. 64 // pointer.
65 const int kInvalid = -1; 65 const int kInvalid = -1;
66 66
67 bool SchemaTypeToValueType(const std::string& type_string, 67 bool SchemaTypeToValueType(const std::string& type_string,
68 base::Value::Type* type) { 68 base::Value::Type* type) {
69 // Note: "any" is not an accepted type. 69 // Note: "any" is not an accepted type.
70 static const struct { 70 static const struct {
71 const char* schema_type; 71 const char* schema_type;
72 base::Value::Type value_type; 72 base::Value::Type value_type;
73 } kSchemaToValueTypeMap[] = { 73 } kSchemaToValueTypeMap[] = {
74 { schema::kArray, base::Value::TYPE_LIST }, 74 { schema::kArray, base::Value::Type::LIST },
75 { schema::kBoolean, base::Value::TYPE_BOOLEAN }, 75 { schema::kBoolean, base::Value::Type::BOOLEAN },
76 { schema::kInteger, base::Value::TYPE_INTEGER }, 76 { schema::kInteger, base::Value::Type::INTEGER },
77 { schema::kNull, base::Value::TYPE_NULL }, 77 { schema::kNull, base::Value::Type::NONE },
78 { schema::kNumber, base::Value::TYPE_DOUBLE }, 78 { schema::kNumber, base::Value::Type::DOUBLE },
79 { schema::kObject, base::Value::TYPE_DICTIONARY }, 79 { schema::kObject, base::Value::Type::DICTIONARY },
80 { schema::kString, base::Value::TYPE_STRING }, 80 { schema::kString, base::Value::Type::STRING },
81 }; 81 };
82 for (size_t i = 0; i < arraysize(kSchemaToValueTypeMap); ++i) { 82 for (size_t i = 0; i < arraysize(kSchemaToValueTypeMap); ++i) {
83 if (kSchemaToValueTypeMap[i].schema_type == type_string) { 83 if (kSchemaToValueTypeMap[i].schema_type == type_string) {
84 *type = kSchemaToValueTypeMap[i].value_type; 84 *type = kSchemaToValueTypeMap[i].value_type;
85 return true; 85 return true;
86 } 86 }
87 } 87 }
88 return false; 88 return false;
89 } 89 }
90 90
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 void Schema::InternalStorage::DetermineStorageSizes( 359 void Schema::InternalStorage::DetermineStorageSizes(
360 const base::DictionaryValue& schema, 360 const base::DictionaryValue& schema,
361 StorageSizes* sizes) { 361 StorageSizes* sizes) {
362 std::string ref_string; 362 std::string ref_string;
363 if (schema.GetString(schema::kRef, &ref_string)) { 363 if (schema.GetString(schema::kRef, &ref_string)) {
364 // Schemas with a "$ref" attribute don't take additional storage. 364 // Schemas with a "$ref" attribute don't take additional storage.
365 return; 365 return;
366 } 366 }
367 367
368 std::string type_string; 368 std::string type_string;
369 base::Value::Type type = base::Value::TYPE_NULL; 369 base::Value::Type type = base::Value::Type::NONE;
370 if (!schema.GetString(schema::kType, &type_string) || 370 if (!schema.GetString(schema::kType, &type_string) ||
371 !SchemaTypeToValueType(type_string, &type)) { 371 !SchemaTypeToValueType(type_string, &type)) {
372 // This schema is invalid. 372 // This schema is invalid.
373 return; 373 return;
374 } 374 }
375 375
376 sizes->schema_nodes++; 376 sizes->schema_nodes++;
377 377
378 if (type == base::Value::TYPE_LIST) { 378 if (type == base::Value::Type::LIST) {
379 const base::DictionaryValue* items = NULL; 379 const base::DictionaryValue* items = NULL;
380 if (schema.GetDictionary(schema::kItems, &items)) 380 if (schema.GetDictionary(schema::kItems, &items))
381 DetermineStorageSizes(*items, sizes); 381 DetermineStorageSizes(*items, sizes);
382 } else if (type == base::Value::TYPE_DICTIONARY) { 382 } else if (type == base::Value::Type::DICTIONARY) {
383 sizes->properties_nodes++; 383 sizes->properties_nodes++;
384 384
385 const base::DictionaryValue* dict = NULL; 385 const base::DictionaryValue* dict = NULL;
386 if (schema.GetDictionary(schema::kAdditionalProperties, &dict)) 386 if (schema.GetDictionary(schema::kAdditionalProperties, &dict))
387 DetermineStorageSizes(*dict, sizes); 387 DetermineStorageSizes(*dict, sizes);
388 388
389 const base::DictionaryValue* properties = NULL; 389 const base::DictionaryValue* properties = NULL;
390 if (schema.GetDictionary(schema::kProperties, &properties)) { 390 if (schema.GetDictionary(schema::kProperties, &properties)) {
391 for (base::DictionaryValue::Iterator it(*properties); 391 for (base::DictionaryValue::Iterator it(*properties);
392 !it.IsAtEnd(); it.Advance()) { 392 !it.IsAtEnd(); it.Advance()) {
(...skipping 11 matching lines...) Expand all
404 !it.IsAtEnd(); it.Advance()) { 404 !it.IsAtEnd(); it.Advance()) {
405 CHECK(it.value().GetAsDictionary(&dict)); 405 CHECK(it.value().GetAsDictionary(&dict));
406 DetermineStorageSizes(*dict, sizes); 406 DetermineStorageSizes(*dict, sizes);
407 sizes->strings++; 407 sizes->strings++;
408 sizes->property_nodes++; 408 sizes->property_nodes++;
409 } 409 }
410 } 410 }
411 } else if (schema.HasKey(schema::kEnum)) { 411 } else if (schema.HasKey(schema::kEnum)) {
412 const base::ListValue* possible_values = NULL; 412 const base::ListValue* possible_values = NULL;
413 if (schema.GetList(schema::kEnum, &possible_values)) { 413 if (schema.GetList(schema::kEnum, &possible_values)) {
414 if (type == base::Value::TYPE_INTEGER) { 414 if (type == base::Value::Type::INTEGER) {
415 sizes->int_enums += possible_values->GetSize(); 415 sizes->int_enums += possible_values->GetSize();
416 } else if (type == base::Value::TYPE_STRING) { 416 } else if (type == base::Value::Type::STRING) {
417 sizes->string_enums += possible_values->GetSize(); 417 sizes->string_enums += possible_values->GetSize();
418 sizes->strings += possible_values->GetSize(); 418 sizes->strings += possible_values->GetSize();
419 } 419 }
420 sizes->restriction_nodes++; 420 sizes->restriction_nodes++;
421 } 421 }
422 } else if (type == base::Value::TYPE_INTEGER) { 422 } else if (type == base::Value::Type::INTEGER) {
423 if (schema.HasKey(schema::kMinimum) || schema.HasKey(schema::kMaximum)) 423 if (schema.HasKey(schema::kMinimum) || schema.HasKey(schema::kMaximum))
424 sizes->restriction_nodes++; 424 sizes->restriction_nodes++;
425 } else if (type == base::Value::TYPE_STRING) { 425 } else if (type == base::Value::Type::STRING) {
426 if (schema.HasKey(schema::kPattern)) { 426 if (schema.HasKey(schema::kPattern)) {
427 sizes->strings++; 427 sizes->strings++;
428 sizes->string_enums++; 428 sizes->string_enums++;
429 sizes->restriction_nodes++; 429 sizes->restriction_nodes++;
430 } 430 }
431 } 431 }
432 } 432 }
433 433
434 bool Schema::InternalStorage::Parse(const base::DictionaryValue& schema, 434 bool Schema::InternalStorage::Parse(const base::DictionaryValue& schema,
435 int* index, 435 int* index,
(...skipping 10 matching lines...) Expand all
446 reference_list->push_back(std::make_pair(ref_string, index)); 446 reference_list->push_back(std::make_pair(ref_string, index));
447 return true; 447 return true;
448 } 448 }
449 449
450 std::string type_string; 450 std::string type_string;
451 if (!schema.GetString(schema::kType, &type_string)) { 451 if (!schema.GetString(schema::kType, &type_string)) {
452 *error = "The schema type must be declared."; 452 *error = "The schema type must be declared.";
453 return false; 453 return false;
454 } 454 }
455 455
456 base::Value::Type type = base::Value::TYPE_NULL; 456 base::Value::Type type = base::Value::Type::NONE;
457 if (!SchemaTypeToValueType(type_string, &type)) { 457 if (!SchemaTypeToValueType(type_string, &type)) {
458 *error = "Type not supported: " + type_string; 458 *error = "Type not supported: " + type_string;
459 return false; 459 return false;
460 } 460 }
461 461
462 *index = static_cast<int>(schema_nodes_.size()); 462 *index = static_cast<int>(schema_nodes_.size());
463 schema_nodes_.push_back(SchemaNode()); 463 schema_nodes_.push_back(SchemaNode());
464 SchemaNode* schema_node = &schema_nodes_.back(); 464 SchemaNode* schema_node = &schema_nodes_.back();
465 schema_node->type = type; 465 schema_node->type = type;
466 schema_node->extra = kInvalid; 466 schema_node->extra = kInvalid;
467 467
468 if (type == base::Value::TYPE_DICTIONARY) { 468 if (type == base::Value::Type::DICTIONARY) {
469 if (!ParseDictionary(schema, schema_node, id_map, reference_list, error)) 469 if (!ParseDictionary(schema, schema_node, id_map, reference_list, error))
470 return false; 470 return false;
471 } else if (type == base::Value::TYPE_LIST) { 471 } else if (type == base::Value::Type::LIST) {
472 if (!ParseList(schema, schema_node, id_map, reference_list, error)) 472 if (!ParseList(schema, schema_node, id_map, reference_list, error))
473 return false; 473 return false;
474 } else if (schema.HasKey(schema::kEnum)) { 474 } else if (schema.HasKey(schema::kEnum)) {
475 if (!ParseEnum(schema, type, schema_node, error)) 475 if (!ParseEnum(schema, type, schema_node, error))
476 return false; 476 return false;
477 } else if (schema.HasKey(schema::kPattern)) { 477 } else if (schema.HasKey(schema::kPattern)) {
478 if (!ParseStringPattern(schema, schema_node, error)) 478 if (!ParseStringPattern(schema, schema_node, error))
479 return false; 479 return false;
480 } else if (schema.HasKey(schema::kMinimum) || 480 } else if (schema.HasKey(schema::kMinimum) ||
481 schema.HasKey(schema::kMaximum)) { 481 schema.HasKey(schema::kMaximum)) {
482 if (type != base::Value::TYPE_INTEGER) { 482 if (type != base::Value::Type::INTEGER) {
483 *error = "Only integers can have minimum and maximum"; 483 *error = "Only integers can have minimum and maximum";
484 return false; 484 return false;
485 } 485 }
486 if (!ParseRangedInt(schema, schema_node, error)) 486 if (!ParseRangedInt(schema, schema_node, error))
487 return false; 487 return false;
488 } 488 }
489 std::string id_string; 489 std::string id_string;
490 if (schema.GetString(schema::kId, &id_string)) { 490 if (schema.GetString(schema::kId, &id_string)) {
491 if (base::ContainsKey(*id_map, id_string)) { 491 if (base::ContainsKey(*id_map, id_string)) {
492 *error = "Duplicated id: " + id_string; 492 *error = "Duplicated id: " + id_string;
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 if (!schema.GetList(schema::kEnum, &possible_values)) { 607 if (!schema.GetList(schema::kEnum, &possible_values)) {
608 *error = "Enum attribute must be a list value"; 608 *error = "Enum attribute must be a list value";
609 return false; 609 return false;
610 } 610 }
611 if (possible_values->empty()) { 611 if (possible_values->empty()) {
612 *error = "Enum attribute must be non-empty"; 612 *error = "Enum attribute must be non-empty";
613 return false; 613 return false;
614 } 614 }
615 int offset_begin; 615 int offset_begin;
616 int offset_end; 616 int offset_end;
617 if (type == base::Value::TYPE_INTEGER) { 617 if (type == base::Value::Type::INTEGER) {
618 offset_begin = static_cast<int>(int_enums_.size()); 618 offset_begin = static_cast<int>(int_enums_.size());
619 int value; 619 int value;
620 for (base::ListValue::const_iterator it = possible_values->begin(); 620 for (base::ListValue::const_iterator it = possible_values->begin();
621 it != possible_values->end(); ++it) { 621 it != possible_values->end(); ++it) {
622 if (!(*it)->GetAsInteger(&value)) { 622 if (!(*it)->GetAsInteger(&value)) {
623 *error = "Invalid enumeration member type"; 623 *error = "Invalid enumeration member type";
624 return false; 624 return false;
625 } 625 }
626 int_enums_.push_back(value); 626 int_enums_.push_back(value);
627 } 627 }
628 offset_end = static_cast<int>(int_enums_.size()); 628 offset_end = static_cast<int>(int_enums_.size());
629 } else if (type == base::Value::TYPE_STRING) { 629 } else if (type == base::Value::Type::STRING) {
630 offset_begin = static_cast<int>(string_enums_.size()); 630 offset_begin = static_cast<int>(string_enums_.size());
631 std::string value; 631 std::string value;
632 for (base::ListValue::const_iterator it = possible_values->begin(); 632 for (base::ListValue::const_iterator it = possible_values->begin();
633 it != possible_values->end(); ++it) { 633 it != possible_values->end(); ++it) {
634 if (!(*it)->GetAsString(&value)) { 634 if (!(*it)->GetAsString(&value)) {
635 *error = "Invalid enumeration member type"; 635 *error = "Invalid enumeration member type";
636 return false; 636 return false;
637 } 637 }
638 strings_.push_back(value); 638 strings_.push_back(value);
639 string_enums_.push_back(strings_.back().c_str()); 639 string_enums_.push_back(strings_.back().c_str());
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 std::string* error_path, 778 std::string* error_path,
779 std::string* error) const { 779 std::string* error) const {
780 if (!valid()) { 780 if (!valid()) {
781 SchemaErrorFound(error_path, error, "The schema is invalid."); 781 SchemaErrorFound(error_path, error, "The schema is invalid.");
782 return false; 782 return false;
783 } 783 }
784 784
785 if (!value.IsType(type())) { 785 if (!value.IsType(type())) {
786 // Allow the integer to double promotion. Note that range restriction on 786 // Allow the integer to double promotion. Note that range restriction on
787 // double is not supported now. 787 // double is not supported now.
788 if (value.IsType(base::Value::TYPE_INTEGER) && 788 if (value.IsType(base::Value::Type::INTEGER) &&
789 type() == base::Value::TYPE_DOUBLE) { 789 type() == base::Value::Type::DOUBLE) {
790 return true; 790 return true;
791 } 791 }
792 792
793 SchemaErrorFound( 793 SchemaErrorFound(
794 error_path, error, "The value type doesn't match the schema type."); 794 error_path, error, "The value type doesn't match the schema type.");
795 return false; 795 return false;
796 } 796 }
797 797
798 const base::DictionaryValue* dict = NULL; 798 const base::DictionaryValue* dict = NULL;
799 const base::ListValue* list = NULL; 799 const base::ListValue* list = NULL;
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 std::string* error, 860 std::string* error,
861 bool* changed) const { 861 bool* changed) const {
862 if (!valid()) { 862 if (!valid()) {
863 SchemaErrorFound(error_path, error, "The schema is invalid."); 863 SchemaErrorFound(error_path, error, "The schema is invalid.");
864 return false; 864 return false;
865 } 865 }
866 866
867 if (!value->IsType(type())) { 867 if (!value->IsType(type())) {
868 // Allow the integer to double promotion. Note that range restriction on 868 // Allow the integer to double promotion. Note that range restriction on
869 // double is not supported now. 869 // double is not supported now.
870 if (value->IsType(base::Value::TYPE_INTEGER) && 870 if (value->IsType(base::Value::Type::INTEGER) &&
871 type() == base::Value::TYPE_DOUBLE) { 871 type() == base::Value::Type::DOUBLE) {
872 return true; 872 return true;
873 } 873 }
874 874
875 SchemaErrorFound( 875 SchemaErrorFound(
876 error_path, error, "The value type doesn't match the schema type."); 876 error_path, error, "The value type doesn't match the schema type.");
877 return false; 877 return false;
878 } 878 }
879 879
880 base::DictionaryValue* dict = NULL; 880 base::DictionaryValue* dict = NULL;
881 base::ListValue* list = NULL; 881 base::ListValue* list = NULL;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 return Schema(storage, storage->root_node()); 986 return Schema(storage, storage->root_node());
987 } 987 }
988 988
989 base::Value::Type Schema::type() const { 989 base::Value::Type Schema::type() const {
990 CHECK(valid()); 990 CHECK(valid());
991 return node_->type; 991 return node_->type;
992 } 992 }
993 993
994 Schema::Iterator Schema::GetPropertiesIterator() const { 994 Schema::Iterator Schema::GetPropertiesIterator() const {
995 CHECK(valid()); 995 CHECK(valid());
996 CHECK_EQ(base::Value::TYPE_DICTIONARY, type()); 996 CHECK_EQ(base::Value::Type::DICTIONARY, type());
997 return Iterator(storage_, storage_->properties(node_->extra)); 997 return Iterator(storage_, storage_->properties(node_->extra));
998 } 998 }
999 999
1000 namespace { 1000 namespace {
1001 1001
1002 bool CompareKeys(const PropertyNode& node, const std::string& key) { 1002 bool CompareKeys(const PropertyNode& node, const std::string& key) {
1003 return node.key < key; 1003 return node.key < key;
1004 } 1004 }
1005 1005
1006 } // namespace 1006 } // namespace
1007 1007
1008 Schema Schema::GetKnownProperty(const std::string& key) const { 1008 Schema Schema::GetKnownProperty(const std::string& key) const {
1009 CHECK(valid()); 1009 CHECK(valid());
1010 CHECK_EQ(base::Value::TYPE_DICTIONARY, type()); 1010 CHECK_EQ(base::Value::Type::DICTIONARY, type());
1011 const PropertiesNode* node = storage_->properties(node_->extra); 1011 const PropertiesNode* node = storage_->properties(node_->extra);
1012 const PropertyNode* begin = storage_->property(node->begin); 1012 const PropertyNode* begin = storage_->property(node->begin);
1013 const PropertyNode* end = storage_->property(node->end); 1013 const PropertyNode* end = storage_->property(node->end);
1014 const PropertyNode* it = std::lower_bound(begin, end, key, CompareKeys); 1014 const PropertyNode* it = std::lower_bound(begin, end, key, CompareKeys);
1015 if (it != end && it->key == key) 1015 if (it != end && it->key == key)
1016 return Schema(storage_, storage_->schema(it->schema)); 1016 return Schema(storage_, storage_->schema(it->schema));
1017 return Schema(); 1017 return Schema();
1018 } 1018 }
1019 1019
1020 Schema Schema::GetAdditionalProperties() const { 1020 Schema Schema::GetAdditionalProperties() const {
1021 CHECK(valid()); 1021 CHECK(valid());
1022 CHECK_EQ(base::Value::TYPE_DICTIONARY, type()); 1022 CHECK_EQ(base::Value::Type::DICTIONARY, type());
1023 const PropertiesNode* node = storage_->properties(node_->extra); 1023 const PropertiesNode* node = storage_->properties(node_->extra);
1024 if (node->additional == kInvalid) 1024 if (node->additional == kInvalid)
1025 return Schema(); 1025 return Schema();
1026 return Schema(storage_, storage_->schema(node->additional)); 1026 return Schema(storage_, storage_->schema(node->additional));
1027 } 1027 }
1028 1028
1029 SchemaList Schema::GetPatternProperties(const std::string& key) const { 1029 SchemaList Schema::GetPatternProperties(const std::string& key) const {
1030 CHECK(valid()); 1030 CHECK(valid());
1031 CHECK_EQ(base::Value::TYPE_DICTIONARY, type()); 1031 CHECK_EQ(base::Value::Type::DICTIONARY, type());
1032 const PropertiesNode* node = storage_->properties(node_->extra); 1032 const PropertiesNode* node = storage_->properties(node_->extra);
1033 const PropertyNode* begin = storage_->property(node->end); 1033 const PropertyNode* begin = storage_->property(node->end);
1034 const PropertyNode* end = storage_->property(node->pattern_end); 1034 const PropertyNode* end = storage_->property(node->pattern_end);
1035 SchemaList matching_properties; 1035 SchemaList matching_properties;
1036 for (const PropertyNode* it = begin; it != end; ++it) { 1036 for (const PropertyNode* it = begin; it != end; ++it) {
1037 if (re2::RE2::PartialMatch(key, *storage_->CompileRegex(it->key))) { 1037 if (re2::RE2::PartialMatch(key, *storage_->CompileRegex(it->key))) {
1038 matching_properties.push_back( 1038 matching_properties.push_back(
1039 Schema(storage_, storage_->schema(it->schema))); 1039 Schema(storage_, storage_->schema(it->schema)));
1040 } 1040 }
1041 } 1041 }
(...skipping 22 matching lines...) Expand all
1064 Schema additional_property = GetAdditionalProperties(); 1064 Schema additional_property = GetAdditionalProperties();
1065 if (additional_property.valid()) 1065 if (additional_property.valid())
1066 schema_list.push_back(additional_property); 1066 schema_list.push_back(additional_property);
1067 } 1067 }
1068 1068
1069 return schema_list; 1069 return schema_list;
1070 } 1070 }
1071 1071
1072 Schema Schema::GetItems() const { 1072 Schema Schema::GetItems() const {
1073 CHECK(valid()); 1073 CHECK(valid());
1074 CHECK_EQ(base::Value::TYPE_LIST, type()); 1074 CHECK_EQ(base::Value::Type::LIST, type());
1075 if (node_->extra == kInvalid) 1075 if (node_->extra == kInvalid)
1076 return Schema(); 1076 return Schema();
1077 return Schema(storage_, storage_->schema(node_->extra)); 1077 return Schema(storage_, storage_->schema(node_->extra));
1078 } 1078 }
1079 1079
1080 bool Schema::ValidateIntegerRestriction(int index, int value) const { 1080 bool Schema::ValidateIntegerRestriction(int index, int value) const {
1081 const RestrictionNode* rnode = storage_->restriction(index); 1081 const RestrictionNode* rnode = storage_->restriction(index);
1082 if (rnode->ranged_restriction.min_value <= 1082 if (rnode->ranged_restriction.min_value <=
1083 rnode->ranged_restriction.max_value) { 1083 rnode->ranged_restriction.max_value) {
1084 return rnode->ranged_restriction.min_value <= value && 1084 return rnode->ranged_restriction.min_value <= value &&
(...skipping 20 matching lines...) Expand all
1105 return false; 1105 return false;
1106 } else { 1106 } else {
1107 int index = rnode->string_pattern_restriction.pattern_index; 1107 int index = rnode->string_pattern_restriction.pattern_index;
1108 DCHECK(index == rnode->string_pattern_restriction.pattern_index_backup); 1108 DCHECK(index == rnode->string_pattern_restriction.pattern_index_backup);
1109 re2::RE2* regex = storage_->CompileRegex(*storage_->string_enums(index)); 1109 re2::RE2* regex = storage_->CompileRegex(*storage_->string_enums(index));
1110 return re2::RE2::PartialMatch(str, *regex); 1110 return re2::RE2::PartialMatch(str, *regex);
1111 } 1111 }
1112 } 1112 }
1113 1113
1114 } // namespace policy 1114 } // namespace policy
OLDNEW
« no previous file with comments | « components/policy/core/common/schema.h ('k') | components/policy/core/common/schema_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698