metadata_types.cc 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. // Copyright 2019 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. #include "ui/base/metadata/metadata_types.h"
  5. #include <utility>
  6. #include "base/check_op.h"
  7. #include "base/notreached.h"
  8. #include "base/strings/string_util.h"
  9. #include "ui/base/metadata/base_type_conversion.h"
  10. namespace ui {
  11. namespace metadata {
  12. PropertyFlags operator|(PropertyFlags op1, PropertyFlags op2) {
  13. return static_cast<PropertyFlags>(static_cast<uint32_t>(op1) |
  14. static_cast<uint32_t>(op2));
  15. }
  16. PropertyFlags operator&(PropertyFlags op1, PropertyFlags op2) {
  17. return static_cast<PropertyFlags>(static_cast<uint32_t>(op1) &
  18. static_cast<uint32_t>(op2));
  19. }
  20. PropertyFlags operator^(PropertyFlags op1, PropertyFlags op2) {
  21. return static_cast<PropertyFlags>(static_cast<uint32_t>(op1) ^
  22. static_cast<uint32_t>(op2));
  23. }
  24. bool operator!(PropertyFlags op) {
  25. return !static_cast<bool>(op);
  26. }
  27. MetaDataProvider::MetaDataProvider() = default;
  28. MetaDataProvider::~MetaDataProvider() = default;
  29. base::CallbackListSubscription MetaDataProvider::AddPropertyChangedCallback(
  30. PropertyKey property,
  31. PropertyChangedCallback callback) {
  32. auto entry = property_changed_vectors_.find(property);
  33. if (entry == property_changed_vectors_.end()) {
  34. entry = property_changed_vectors_
  35. .emplace(property, std::make_unique<PropertyChangedCallbacks>())
  36. .first;
  37. }
  38. PropertyChangedCallbacks* property_changed_callbacks = entry->second.get();
  39. return property_changed_callbacks->Add(std::move(callback));
  40. }
  41. void MetaDataProvider::TriggerChangedCallback(PropertyKey property) {
  42. auto entry = property_changed_vectors_.find(property);
  43. if (entry == property_changed_vectors_.end())
  44. return;
  45. PropertyChangedCallbacks* property_changed_callbacks = entry->second.get();
  46. property_changed_callbacks->Notify();
  47. }
  48. ClassMetaData::ClassMetaData() = default;
  49. ClassMetaData::ClassMetaData(std::string file, int line) : line_(line) {
  50. base::TrimString(file, "./\\", &file_);
  51. }
  52. ClassMetaData::~ClassMetaData() = default;
  53. void ClassMetaData::AddMemberData(
  54. std::unique_ptr<MemberMetaDataBase> member_data) {
  55. members_.push_back(member_data.release());
  56. }
  57. MemberMetaDataBase* ClassMetaData::FindMemberData(
  58. const std::string& member_name) {
  59. for (MemberMetaDataBase* member_data : members_) {
  60. if (member_data->member_name() == member_name)
  61. return member_data;
  62. }
  63. if (parent_class_meta_data_ != nullptr)
  64. return parent_class_meta_data_->FindMemberData(member_name);
  65. return nullptr;
  66. }
  67. /** Member Iterator */
  68. ClassMetaData::ClassMemberIterator::ClassMemberIterator(
  69. const ClassMetaData::ClassMemberIterator& other) {
  70. current_collection_ = other.current_collection_;
  71. current_vector_index_ = other.current_vector_index_;
  72. }
  73. ClassMetaData::ClassMemberIterator::~ClassMemberIterator() = default;
  74. // If starting_container's members vector is empty, set current_collection_
  75. // to its parent until parent class has members. Base parent class View
  76. // will always have members, even if all other parent classes do not.
  77. ClassMetaData::ClassMemberIterator::ClassMemberIterator(
  78. ClassMetaData* starting_container) {
  79. current_collection_ = starting_container;
  80. if (!current_collection_) {
  81. current_vector_index_ = SIZE_MAX;
  82. } else if (current_collection_->members().size() == 0) {
  83. do {
  84. current_collection_ = current_collection_->parent_class_meta_data();
  85. } while (current_collection_ && current_collection_->members().empty());
  86. current_vector_index_ = (current_collection_ ? 0 : SIZE_MAX);
  87. } else {
  88. current_vector_index_ = 0;
  89. }
  90. }
  91. bool ClassMetaData::ClassMemberIterator::operator==(
  92. const ClassMemberIterator& rhs) const {
  93. return current_vector_index_ == rhs.current_vector_index_ &&
  94. current_collection_ == rhs.current_collection_;
  95. }
  96. ClassMetaData::ClassMemberIterator&
  97. ClassMetaData::ClassMemberIterator::operator++() {
  98. IncrementHelper();
  99. return *this;
  100. }
  101. ClassMetaData::ClassMemberIterator
  102. ClassMetaData::ClassMemberIterator::operator++(int) {
  103. ClassMetaData::ClassMemberIterator tmp(*this);
  104. IncrementHelper();
  105. return tmp;
  106. }
  107. bool ClassMetaData::ClassMemberIterator::IsLastMember() const {
  108. return current_vector_index_ == current_collection_->members().size() - 1;
  109. }
  110. std::string ClassMetaData::ClassMemberIterator::GetCurrentCollectionName()
  111. const {
  112. return current_collection_->type_name();
  113. }
  114. void ClassMetaData::ClassMemberIterator::IncrementHelper() {
  115. DCHECK_LT(current_vector_index_, SIZE_MAX);
  116. ++current_vector_index_;
  117. if (current_vector_index_ >= current_collection_->members().size()) {
  118. do {
  119. current_collection_ = current_collection_->parent_class_meta_data();
  120. current_vector_index_ = (current_collection_ ? 0 : SIZE_MAX);
  121. } while (current_collection_ && current_collection_->members().empty());
  122. }
  123. }
  124. ClassMetaData::ClassMemberIterator ClassMetaData::begin() {
  125. return ClassMemberIterator(this);
  126. }
  127. ClassMetaData::ClassMemberIterator ClassMetaData::end() {
  128. return ClassMemberIterator(nullptr);
  129. }
  130. void ClassMetaData::SetTypeName(const std::string& type_name) {
  131. type_name_ = type_name;
  132. }
  133. void MemberMetaDataBase::SetValueAsString(void* obj,
  134. const std::u16string& new_value) {
  135. NOTREACHED();
  136. }
  137. const char* MemberMetaDataBase::GetMemberNamePrefix() const {
  138. return "";
  139. }
  140. MemberMetaDataBase::ValueStrings MemberMetaDataBase::GetValidValues() const {
  141. return ValueStrings();
  142. }
  143. } // namespace metadata
  144. } // namespace ui