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