21 #ifndef ELM_SERIAL2_MACROS_H
22 #define ELM_SERIAL2_MACROS_H
24 #include <elm/rtti/Enum.h>
25 #include <elm/serial2/serial.h>
27 #define ELM_SERIALIZABLE_EXTEND(name, base, fields) \
29 typedef base __base; \
30 static const elm::serial2::AbstractClass& __class(void); \
31 static const elm::serial2::AbstractClass& __type; \
32 virtual const elm::serial2::AbstractClass& __actual_class(void) const { return __type; } \
33 template <class T> void __visit(T& e) { e & fields; } \
34 template <class T> void __visit(T& e) const { e & fields; } \
37 #define ELM_SERIALIZABLE(name, fields) ELM_SERIALIZABLE_EXTEND(name, void, fields)
39 #define ELM_SERIALIZE(name) \
40 const elm::serial2::AbstractClass& name::__class(void) { static elm::serial2::Class<name> _(#name); return _; } \
41 const elm::serial2::AbstractClass& name::__type = __class();
43 #define ELM_SERIALIZE_EXTENDED(name, ext) \
44 const elm::serial2::AbstractClass& name::__class(void) { static elm::serial2::Class<name, ext> _(#name); return _; } \
45 const elm::serial2::AbstractClass& name::__type = __class();
47 #define ELM_FIELD(name) elm::field(#name, name)
48 #define ELM_DFIELD(name, def) elm::field(#name, name, def)
49 #define ELM_BASE(name) elm::serial2::Base<name>(static_cast<const name *>(this))
52 #define ELM_ENUM(type) \
54 template <> struct type_info<type>: public enum_t<type> { \
55 static elm::rtti::Enum::Value __vals[]; \
56 static inline CString name(void) { return "<enum " #type ">"; } \
57 static inline elm::rtti::Enum::Value *values(void) { return __vals; } \
59 namespace rtti { template <> inline const Type& _type<type>::_(void){ static Enum _("", elm::type_info<type>::__vals); return _; } } \
60 inline elm::io::Output& operator<<(io::Output& out, type value) { out << elm::type_of<type>().asEnum().nameFor(value); return out; } \
62 #define ELM_ENUM_BEGIN(type) \
64 elm::rtti::Enum::Value type_info<type>::__vals[] = {
65 #define ELM_ENUM_END \
66 , rtti::value("", 0) \
69 #define ELM_VALUE(name) elm::rtti::Enum::Value(elm::_unqualify(#name), name)
72 #ifndef ELM_NO_SHORTCUT
73 # define SERIALIZABLE(name, fields) ELM_SERIALIZABLE(name, fields)
74 # define SERIALIZABLE_EXTEND(name, base, fields) ELM_SERIALIZABLE_EXTEND(name, base, fields)
75 # define SERIALIZE(name) ELM_SERIALIZE(name)
76 # define SERIALIZE_EXTENDED(name, ext) ELM_SERIALIZE_EXTENDED(name, ext)
77 # define FIELD(name) ELM_FIELD(name)
78 # define DFIELD(name, def) ELM_DFIELD(name, def)
79 # define BASE(name) ELM_BASE(name)
80 # define ENUM(type) ELM_ENUM(type)
81 # define VALUE(name) ELM_VALUE(name)
82 # define ENUM_BEGIN(type) ELM_ENUM_BEGIN(type)
83 # define ENUM_END ELM_ENUM_END