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 5 #ifndef UI_VIEWS_METADATA_METADATA_MACROS_INTERNAL_H_ 6 #define UI_VIEWS_METADATA_METADATA_MACROS_INTERNAL_H_ 7 8 #include <utility> 9 10 #include "base/compiler_specific.h" 11 #include "ui/views/metadata/metadata_types.h" 12 13 // Internal Metadata Generation Helpers --------------------------------------- 14 15 #define METADATA_CLASS_NAME_INTERNAL(class_name) class_name##_MetaData 16 #define METADATA_FUNCTION_PREFIX_INTERNAL(class_name) \ 17 class_name::METADATA_CLASS_NAME_INTERNAL(class_name) 18 19 // Metadata Accessors --------------------------------------------------------- 20 #define METADATA_ACCESSORS_INTERNAL(class_name) \ 21 static const char kViewClassName[]; \ 22 const char* GetClassName() const override; \ 23 static views::metadata::ClassMetaData* MetaData(); \ 24 views::metadata::ClassMetaData* GetClassMetaData() override; 25 26 // A version of METADATA_ACCESSORS_INTERNAL for View, the root of the metadata 27 // hierarchy; here GetClassName() is not declared as an override. 28 #define METADATA_ACCESSORS_INTERNAL_BASE(class_name) \ 29 static const char kViewClassName[]; \ 30 virtual const char* GetClassName() const; \ 31 static views::metadata::ClassMetaData* MetaData(); \ 32 views::metadata::ClassMetaData* GetClassMetaData() override; 33 34 // Metadata Class ------------------------------------------------------------- 35 #define METADATA_CLASS_INTERNAL(class_name, file, line) \ 36 class METADATA_CLASS_NAME_INTERNAL(class_name) \ 37 : public views::metadata::ClassMetaData { \ 38 public: \ 39 explicit METADATA_CLASS_NAME_INTERNAL(class_name)() \ 40 : ClassMetaData(file, line) { \ 41 BuildMetaData(); \ 42 } \ 43 \ 44 private: \ 45 friend class class_name; \ 46 virtual void BuildMetaData(); \ 47 static views::metadata::ClassMetaData* meta_data_ ALLOW_UNUSED_TYPE; \ 48 DISALLOW_COPY_AND_ASSIGN(METADATA_CLASS_NAME_INTERNAL(class_name)); \ 49 } 50 51 #define METADATA_PROPERTY_TYPE_INTERNAL(class_name, property_type, \ 52 property_name) \ 53 views::metadata::ClassPropertyMetaData< \ 54 class_name, property_type, &class_name::Set##property_name, \ 55 decltype(std::declval<class_name>().Get##property_name()), \ 56 &class_name::Get##property_name> 57 58 #define METADATA_READONLY_PROPERTY_TYPE_INTERNAL(class_name, property_type, \ 59 property_name) \ 60 views::metadata::ClassPropertyReadOnlyMetaData< \ 61 class_name, property_type, \ 62 decltype(std::declval<class_name>().Get##property_name()), \ 63 &class_name::Get##property_name> 64 65 #endif // UI_VIEWS_METADATA_METADATA_MACROS_INTERNAL_H_ 66