#ifndef UI_BASE_METADATA_METADATA_IMPL_MACROS_H_
#define UI_BASE_METADATA_METADATA_IMPL_MACROS_H_
#include <memory>
#include <utility>
#include "ui/base/metadata/metadata_cache.h"
#include "ui/base/metadata/metadata_macros_internal.h"
#include "ui/base/metadata/property_metadata.h"
#define BEGIN_METADATA_BASE(class_name) \
METADATA_REINTERPRET_BASE_CLASS_INTERNAL( \
class_name, METADATA_CLASS_NAME_INTERNAL(class_name)) \
BEGIN_METADATA_INTERNAL( \
class_name, METADATA_CLASS_NAME_INTERNAL(class_name), class_name)
#define _BEGIN_NESTED_METADATA(outer_class, class_name, parent_class_name) \
BEGIN_METADATA_INTERNAL(outer_class::class_name, \
METADATA_CLASS_NAME_INTERNAL(class_name), \
parent_class_name) \
METADATA_PARENT_CLASS_INTERNAL(parent_class_name)
#define _BEGIN_METADATA(class_name, parent_class_name) \
BEGIN_METADATA_INTERNAL( \
class_name, METADATA_CLASS_NAME_INTERNAL(class_name), parent_class_name) \
METADATA_PARENT_CLASS_INTERNAL(parent_class_name)
#define _GET_MD_MACRO_NAME(_1, _2, _3, NAME, ...) NAME
#define BEGIN_METADATA(class_name1, class_name2, ...) \
_GET_MD_MACRO_NAME(class_name1, class_name2, ##__VA_ARGS__, \
_BEGIN_NESTED_METADATA, _BEGIN_METADATA) \
(class_name1, class_name2, ##__VA_ARGS__)
#define END_METADATA }
#define ADD_PROPERTY_METADATA(property_type, property_name, ...) \
auto property_name##_prop = \
std::make_unique<METADATA_PROPERTY_TYPE_INTERNAL( \
property_type, property_name, ##__VA_ARGS__)>(#property_name, \
#property_type); \
AddMemberData(std::move(property_name##_prop));
#define ADD_READONLY_PROPERTY_METADATA(property_type, property_name, ...) \
auto property_name##_prop = \
std::make_unique<METADATA_READONLY_PROPERTY_TYPE_INTERNAL( \
property_type, property_name, ##__VA_ARGS__)>(#property_name, \
#property_type); \
AddMemberData(std::move(property_name##_prop));
#define ADD_CLASS_PROPERTY_METADATA(property_type, property_key, ...) \
auto property_key##_prop = \
std::make_unique<METADATA_CLASS_PROPERTY_TYPE_INTERNAL( \
property_type, property_key, ##__VA_ARGS__)>(property_key, \
#property_type); \
AddMemberData(std::move(property_key##_prop));
#endif