ClassDB: Provide the enum name of integer constants

This commit is contained in:
Ignacio Etcheverry 2017-08-20 17:45:01 +02:00
parent f6c39830cb
commit 32dd9a9f66
107 changed files with 2059 additions and 1894 deletions

View file

@ -151,12 +151,12 @@ void _ResourceSaver::_bind_methods() {
ClassDB::bind_method(D_METHOD("save", "path", "resource", "flags"), &_ResourceSaver::save, DEFVAL(0));
ClassDB::bind_method(D_METHOD("get_recognized_extensions", "type"), &_ResourceSaver::get_recognized_extensions);
BIND_CONSTANT(FLAG_RELATIVE_PATHS);
BIND_CONSTANT(FLAG_BUNDLE_RESOURCES);
BIND_CONSTANT(FLAG_CHANGE_PATH);
BIND_CONSTANT(FLAG_OMIT_EDITOR_PROPERTIES);
BIND_CONSTANT(FLAG_SAVE_BIG_ENDIAN);
BIND_CONSTANT(FLAG_COMPRESS);
BIND_ENUM_CONSTANT(FLAG_RELATIVE_PATHS);
BIND_ENUM_CONSTANT(FLAG_BUNDLE_RESOURCES);
BIND_ENUM_CONSTANT(FLAG_CHANGE_PATH);
BIND_ENUM_CONSTANT(FLAG_OMIT_EDITOR_PROPERTIES);
BIND_ENUM_CONSTANT(FLAG_SAVE_BIG_ENDIAN);
BIND_ENUM_CONSTANT(FLAG_COMPRESS);
}
_ResourceSaver::_ResourceSaver() {
@ -1104,49 +1104,49 @@ void _OS::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_power_seconds_left"), &_OS::get_power_seconds_left);
ClassDB::bind_method(D_METHOD("get_power_percent_left"), &_OS::get_power_percent_left);
BIND_CONSTANT(DAY_SUNDAY);
BIND_CONSTANT(DAY_MONDAY);
BIND_CONSTANT(DAY_TUESDAY);
BIND_CONSTANT(DAY_WEDNESDAY);
BIND_CONSTANT(DAY_THURSDAY);
BIND_CONSTANT(DAY_FRIDAY);
BIND_CONSTANT(DAY_SATURDAY);
BIND_ENUM_CONSTANT(DAY_SUNDAY);
BIND_ENUM_CONSTANT(DAY_MONDAY);
BIND_ENUM_CONSTANT(DAY_TUESDAY);
BIND_ENUM_CONSTANT(DAY_WEDNESDAY);
BIND_ENUM_CONSTANT(DAY_THURSDAY);
BIND_ENUM_CONSTANT(DAY_FRIDAY);
BIND_ENUM_CONSTANT(DAY_SATURDAY);
BIND_CONSTANT(MONTH_JANUARY);
BIND_CONSTANT(MONTH_FEBRUARY);
BIND_CONSTANT(MONTH_MARCH);
BIND_CONSTANT(MONTH_APRIL);
BIND_CONSTANT(MONTH_MAY);
BIND_CONSTANT(MONTH_JUNE);
BIND_CONSTANT(MONTH_JULY);
BIND_CONSTANT(MONTH_AUGUST);
BIND_CONSTANT(MONTH_SEPTEMBER);
BIND_CONSTANT(MONTH_OCTOBER);
BIND_CONSTANT(MONTH_NOVEMBER);
BIND_CONSTANT(MONTH_DECEMBER);
BIND_ENUM_CONSTANT(MONTH_JANUARY);
BIND_ENUM_CONSTANT(MONTH_FEBRUARY);
BIND_ENUM_CONSTANT(MONTH_MARCH);
BIND_ENUM_CONSTANT(MONTH_APRIL);
BIND_ENUM_CONSTANT(MONTH_MAY);
BIND_ENUM_CONSTANT(MONTH_JUNE);
BIND_ENUM_CONSTANT(MONTH_JULY);
BIND_ENUM_CONSTANT(MONTH_AUGUST);
BIND_ENUM_CONSTANT(MONTH_SEPTEMBER);
BIND_ENUM_CONSTANT(MONTH_OCTOBER);
BIND_ENUM_CONSTANT(MONTH_NOVEMBER);
BIND_ENUM_CONSTANT(MONTH_DECEMBER);
BIND_CONSTANT(SCREEN_ORIENTATION_LANDSCAPE);
BIND_CONSTANT(SCREEN_ORIENTATION_PORTRAIT);
BIND_CONSTANT(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
BIND_CONSTANT(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
BIND_CONSTANT(SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
BIND_CONSTANT(SCREEN_ORIENTATION_SENSOR_PORTRAIT);
BIND_CONSTANT(SCREEN_ORIENTATION_SENSOR);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_LANDSCAPE);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_PORTRAIT);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_REVERSE_PORTRAIT);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_SENSOR_PORTRAIT);
BIND_ENUM_CONSTANT(SCREEN_ORIENTATION_SENSOR);
BIND_CONSTANT(SYSTEM_DIR_DESKTOP);
BIND_CONSTANT(SYSTEM_DIR_DCIM);
BIND_CONSTANT(SYSTEM_DIR_DOCUMENTS);
BIND_CONSTANT(SYSTEM_DIR_DOWNLOADS);
BIND_CONSTANT(SYSTEM_DIR_MOVIES);
BIND_CONSTANT(SYSTEM_DIR_MUSIC);
BIND_CONSTANT(SYSTEM_DIR_PICTURES);
BIND_CONSTANT(SYSTEM_DIR_RINGTONES);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DESKTOP);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DCIM);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DOCUMENTS);
BIND_ENUM_CONSTANT(SYSTEM_DIR_DOWNLOADS);
BIND_ENUM_CONSTANT(SYSTEM_DIR_MOVIES);
BIND_ENUM_CONSTANT(SYSTEM_DIR_MUSIC);
BIND_ENUM_CONSTANT(SYSTEM_DIR_PICTURES);
BIND_ENUM_CONSTANT(SYSTEM_DIR_RINGTONES);
BIND_CONSTANT(POWERSTATE_UNKNOWN);
BIND_CONSTANT(POWERSTATE_ON_BATTERY);
BIND_CONSTANT(POWERSTATE_NO_BATTERY);
BIND_CONSTANT(POWERSTATE_CHARGING);
BIND_CONSTANT(POWERSTATE_CHARGED);
BIND_ENUM_CONSTANT(POWERSTATE_UNKNOWN);
BIND_ENUM_CONSTANT(POWERSTATE_ON_BATTERY);
BIND_ENUM_CONSTANT(POWERSTATE_NO_BATTERY);
BIND_ENUM_CONSTANT(POWERSTATE_CHARGING);
BIND_ENUM_CONSTANT(POWERSTATE_CHARGED);
}
_OS::_OS() {
@ -1772,15 +1772,15 @@ void _File::_bind_methods() {
ClassDB::bind_method(D_METHOD("file_exists", "path"), &_File::file_exists);
ClassDB::bind_method(D_METHOD("get_modified_time", "file"), &_File::get_modified_time);
BIND_CONSTANT(READ);
BIND_CONSTANT(WRITE);
BIND_CONSTANT(READ_WRITE);
BIND_CONSTANT(WRITE_READ);
BIND_ENUM_CONSTANT(READ);
BIND_ENUM_CONSTANT(WRITE);
BIND_ENUM_CONSTANT(READ_WRITE);
BIND_ENUM_CONSTANT(WRITE_READ);
BIND_CONSTANT(COMPRESSION_FASTLZ);
BIND_CONSTANT(COMPRESSION_DEFLATE);
BIND_CONSTANT(COMPRESSION_ZSTD);
BIND_CONSTANT(COMPRESSION_GZIP);
BIND_ENUM_CONSTANT(COMPRESSION_FASTLZ);
BIND_ENUM_CONSTANT(COMPRESSION_DEFLATE);
BIND_ENUM_CONSTANT(COMPRESSION_ZSTD);
BIND_ENUM_CONSTANT(COMPRESSION_GZIP);
}
_File::_File() {
@ -2285,9 +2285,9 @@ void _Thread::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_active"), &_Thread::is_active);
ClassDB::bind_method(D_METHOD("wait_to_finish"), &_Thread::wait_to_finish);
BIND_CONSTANT(PRIORITY_LOW);
BIND_CONSTANT(PRIORITY_NORMAL);
BIND_CONSTANT(PRIORITY_HIGH);
BIND_ENUM_CONSTANT(PRIORITY_LOW);
BIND_ENUM_CONSTANT(PRIORITY_NORMAL);
BIND_ENUM_CONSTANT(PRIORITY_HIGH);
}
_Thread::_Thread() {

View file

@ -85,6 +85,8 @@ public:
_ResourceSaver();
};
VARIANT_ENUM_CAST(_ResourceSaver::SaverFlags);
class MainLoop;
class _OS : public Object {
@ -310,6 +312,8 @@ public:
_OS();
};
VARIANT_ENUM_CAST(_OS::Weekday);
VARIANT_ENUM_CAST(_OS::Month);
VARIANT_ENUM_CAST(_OS::SystemDir);
VARIANT_ENUM_CAST(_OS::ScreenOrientation);
@ -447,6 +451,9 @@ public:
virtual ~_File();
};
VARIANT_ENUM_CAST(_File::ModeFlags);
VARIANT_ENUM_CAST(_File::CompressionMode);
class _Directory : public Reference {
GDCLASS(_Directory, Reference);
@ -578,6 +585,8 @@ public:
~_Thread();
};
VARIANT_ENUM_CAST(_Thread::Priority);
class _ClassDB : public Object {
GDCLASS(_ClassDB, Object)

View file

@ -583,7 +583,7 @@ MethodBind *ClassDB::get_method(StringName p_class, StringName p_name) {
return NULL;
}
void ClassDB::bind_integer_constant(const StringName &p_class, const StringName &p_name, int p_constant) {
void ClassDB::bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int p_constant) {
OBJTYPE_WLOCK;
@ -600,6 +600,16 @@ void ClassDB::bind_integer_constant(const StringName &p_class, const StringName
type->constant_map[p_name] = p_constant;
#ifdef DEBUG_METHODS_ENABLED
List<StringName> *constants_list = type->enum_map.getptr(p_enum);
if (constants_list) {
constants_list->push_back(p_name);
} else {
List<StringName> new_list;
new_list.push_back(p_name);
type->enum_map[p_enum] = new_list;
}
type->constant_order.push_back(p_name);
#endif
}
@ -655,6 +665,77 @@ int ClassDB::get_integer_constant(const StringName &p_class, const StringName &p
return 0;
}
#ifdef DEBUG_METHODS_ENABLED
StringName ClassDB::get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance) {
OBJTYPE_RLOCK;
ClassInfo *type = classes.getptr(p_class);
while (type) {
const StringName *k = NULL;
while ((k = type->enum_map.next(k))) {
List<StringName> &constants_list = type->enum_map.get(*k);
const List<StringName>::Element *found = constants_list.find(p_name);
if (found)
return found->get();
}
if (p_no_inheritance)
break;
type = type->inherits_ptr;
}
return StringName();
}
void ClassDB::get_enum_list(const StringName &p_class, List<StringName> *p_enums, bool p_no_inheritance) {
OBJTYPE_RLOCK;
ClassInfo *type = classes.getptr(p_class);
while (type) {
const StringName *k = NULL;
while ((k = type->enum_map.next(k))) {
p_enums->push_back(*k);
}
if (p_no_inheritance)
break;
type = type->inherits_ptr;
}
}
void ClassDB::get_enum_constants(const StringName &p_class, const StringName &p_enum, List<StringName> *p_constants, bool p_no_inheritance) {
OBJTYPE_RLOCK;
ClassInfo *type = classes.getptr(p_class);
while (type) {
const List<StringName> *constants = type->enum_map.getptr(p_enum);
if (constants) {
for (const List<StringName>::Element *E = constants->front(); E; E = E->next()) {
p_constants->push_back(E->get());
}
}
if (p_no_inheritance)
break;
type = type->inherits_ptr;
}
}
#endif
void ClassDB::add_signal(StringName p_class, const MethodInfo &p_signal) {
OBJTYPE_WLOCK;

View file

@ -138,6 +138,7 @@ public:
HashMap<StringName, MethodInfo, StringNameHasher> signal_map;
List<PropertyInfo> property_list;
#ifdef DEBUG_METHODS_ENABLED
HashMap<StringName, List<StringName> > enum_map;
List<StringName> constant_order;
List<StringName> method_order;
Set<StringName> methods_in_properties;
@ -488,9 +489,16 @@ public:
static void add_virtual_method(const StringName &p_class, const MethodInfo &p_method, bool p_virtual = true);
static void get_virtual_methods(const StringName &p_class, List<MethodInfo> *p_methods, bool p_no_inheritance = false);
static void bind_integer_constant(const StringName &p_class, const StringName &p_name, int p_constant);
static void bind_integer_constant(const StringName &p_class, const StringName &p_enum, const StringName &p_name, int p_constant);
static void get_integer_constant_list(const StringName &p_class, List<String> *p_constants, bool p_no_inheritance = false);
static int get_integer_constant(const StringName &p_class, const StringName &p_name, bool *p_success = NULL);
#ifdef DEBUG_METHODS_ENABLED
static StringName get_integer_constant_enum(const StringName &p_class, const StringName &p_name, bool p_no_inheritance = false);
static void get_enum_list(const StringName &p_class, List<StringName> *p_enums, bool p_no_inheritance = false);
static void get_enum_constants(const StringName &p_class, const StringName &p_enum, List<StringName> *p_constants, bool p_no_inheritance = false);
#endif
static StringName get_category(const StringName &p_node);
static bool get_setter_and_type_for_property(const StringName &p_class, const StringName &p_prop, StringName &r_class, StringName &r_setter);
@ -509,8 +517,23 @@ public:
static void cleanup();
};
#ifdef DEBUG_METHODS_ENABLED
#define BIND_CONSTANT(m_constant) \
ClassDB::bind_integer_constant(get_class_static(), #m_constant, m_constant);
ClassDB::bind_integer_constant(get_class_static(), StringName(), #m_constant, m_constant);
#define BIND_ENUM_CONSTANT(m_constant) \
ClassDB::bind_integer_constant(get_class_static(), __constant_get_enum_name(m_constant, #m_constant), #m_constant, m_constant);
#else
#define BIND_CONSTANT(m_constant) \
ClassDB::bind_integer_constant(get_class_static(), StringName(), #m_constant, m_constant);
#define BIND_ENUM_CONSTANT(m_constant) \
ClassDB::bind_integer_constant(get_class_static(), StringName(), #m_constant, m_constant);
#endif
#ifdef TOOLS_ENABLED

File diff suppressed because it is too large Load diff

View file

@ -30,9 +30,12 @@
#ifndef GLOBAL_CONSTANTS_H
#define GLOBAL_CONSTANTS_H
#include "string_db.h"
class GlobalConstants {
public:
static int get_global_constant_count();
static StringName get_global_constant_enum(int p_idx);
static const char *get_global_constant_name(int p_idx);
static int get_global_constant_value(int p_idx);
};

View file

@ -2275,62 +2275,62 @@ void Image::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE), "_set_data", "_get_data");
BIND_CONSTANT(FORMAT_L8); //luminance
BIND_CONSTANT(FORMAT_LA8); //luminance-alpha
BIND_CONSTANT(FORMAT_R8);
BIND_CONSTANT(FORMAT_RG8);
BIND_CONSTANT(FORMAT_RGB8);
BIND_CONSTANT(FORMAT_RGBA8);
BIND_CONSTANT(FORMAT_RGBA4444);
BIND_CONSTANT(FORMAT_RGBA5551);
BIND_CONSTANT(FORMAT_RF); //float
BIND_CONSTANT(FORMAT_RGF);
BIND_CONSTANT(FORMAT_RGBF);
BIND_CONSTANT(FORMAT_RGBAF);
BIND_CONSTANT(FORMAT_RH); //half float
BIND_CONSTANT(FORMAT_RGH);
BIND_CONSTANT(FORMAT_RGBH);
BIND_CONSTANT(FORMAT_RGBAH);
BIND_CONSTANT(FORMAT_RGBE9995);
BIND_CONSTANT(FORMAT_DXT1); //s3tc bc1
BIND_CONSTANT(FORMAT_DXT3); //bc2
BIND_CONSTANT(FORMAT_DXT5); //bc3
BIND_CONSTANT(FORMAT_RGTC_R);
BIND_CONSTANT(FORMAT_RGTC_RG);
BIND_CONSTANT(FORMAT_BPTC_RGBA); //btpc bc6h
BIND_CONSTANT(FORMAT_BPTC_RGBF); //float /
BIND_CONSTANT(FORMAT_BPTC_RGBFU); //unsigned float
BIND_CONSTANT(FORMAT_PVRTC2); //pvrtc
BIND_CONSTANT(FORMAT_PVRTC2A);
BIND_CONSTANT(FORMAT_PVRTC4);
BIND_CONSTANT(FORMAT_PVRTC4A);
BIND_CONSTANT(FORMAT_ETC); //etc1
BIND_CONSTANT(FORMAT_ETC2_R11); //etc2
BIND_CONSTANT(FORMAT_ETC2_R11S); //signed ); NOT srgb.
BIND_CONSTANT(FORMAT_ETC2_RG11);
BIND_CONSTANT(FORMAT_ETC2_RG11S);
BIND_CONSTANT(FORMAT_ETC2_RGB8);
BIND_CONSTANT(FORMAT_ETC2_RGBA8);
BIND_CONSTANT(FORMAT_ETC2_RGB8A1);
BIND_CONSTANT(FORMAT_MAX);
BIND_ENUM_CONSTANT(FORMAT_L8); //luminance
BIND_ENUM_CONSTANT(FORMAT_LA8); //luminance-alpha
BIND_ENUM_CONSTANT(FORMAT_R8);
BIND_ENUM_CONSTANT(FORMAT_RG8);
BIND_ENUM_CONSTANT(FORMAT_RGB8);
BIND_ENUM_CONSTANT(FORMAT_RGBA8);
BIND_ENUM_CONSTANT(FORMAT_RGBA4444);
BIND_ENUM_CONSTANT(FORMAT_RGBA5551);
BIND_ENUM_CONSTANT(FORMAT_RF); //float
BIND_ENUM_CONSTANT(FORMAT_RGF);
BIND_ENUM_CONSTANT(FORMAT_RGBF);
BIND_ENUM_CONSTANT(FORMAT_RGBAF);
BIND_ENUM_CONSTANT(FORMAT_RH); //half float
BIND_ENUM_CONSTANT(FORMAT_RGH);
BIND_ENUM_CONSTANT(FORMAT_RGBH);
BIND_ENUM_CONSTANT(FORMAT_RGBAH);
BIND_ENUM_CONSTANT(FORMAT_RGBE9995);
BIND_ENUM_CONSTANT(FORMAT_DXT1); //s3tc bc1
BIND_ENUM_CONSTANT(FORMAT_DXT3); //bc2
BIND_ENUM_CONSTANT(FORMAT_DXT5); //bc3
BIND_ENUM_CONSTANT(FORMAT_RGTC_R);
BIND_ENUM_CONSTANT(FORMAT_RGTC_RG);
BIND_ENUM_CONSTANT(FORMAT_BPTC_RGBA); //btpc bc6h
BIND_ENUM_CONSTANT(FORMAT_BPTC_RGBF); //float /
BIND_ENUM_CONSTANT(FORMAT_BPTC_RGBFU); //unsigned float
BIND_ENUM_CONSTANT(FORMAT_PVRTC2); //pvrtc
BIND_ENUM_CONSTANT(FORMAT_PVRTC2A);
BIND_ENUM_CONSTANT(FORMAT_PVRTC4);
BIND_ENUM_CONSTANT(FORMAT_PVRTC4A);
BIND_ENUM_CONSTANT(FORMAT_ETC); //etc1
BIND_ENUM_CONSTANT(FORMAT_ETC2_R11); //etc2
BIND_ENUM_CONSTANT(FORMAT_ETC2_R11S); //signed ); NOT srgb.
BIND_ENUM_CONSTANT(FORMAT_ETC2_RG11);
BIND_ENUM_CONSTANT(FORMAT_ETC2_RG11S);
BIND_ENUM_CONSTANT(FORMAT_ETC2_RGB8);
BIND_ENUM_CONSTANT(FORMAT_ETC2_RGBA8);
BIND_ENUM_CONSTANT(FORMAT_ETC2_RGB8A1);
BIND_ENUM_CONSTANT(FORMAT_MAX);
BIND_CONSTANT(INTERPOLATE_NEAREST);
BIND_CONSTANT(INTERPOLATE_BILINEAR);
BIND_CONSTANT(INTERPOLATE_CUBIC);
BIND_ENUM_CONSTANT(INTERPOLATE_NEAREST);
BIND_ENUM_CONSTANT(INTERPOLATE_BILINEAR);
BIND_ENUM_CONSTANT(INTERPOLATE_CUBIC);
BIND_CONSTANT(ALPHA_NONE);
BIND_CONSTANT(ALPHA_BIT);
BIND_CONSTANT(ALPHA_BLEND);
BIND_ENUM_CONSTANT(ALPHA_NONE);
BIND_ENUM_CONSTANT(ALPHA_BIT);
BIND_ENUM_CONSTANT(ALPHA_BLEND);
BIND_CONSTANT(COMPRESS_S3TC);
BIND_CONSTANT(COMPRESS_PVRTC2);
BIND_CONSTANT(COMPRESS_PVRTC4);
BIND_CONSTANT(COMPRESS_ETC);
BIND_CONSTANT(COMPRESS_ETC2);
BIND_ENUM_CONSTANT(COMPRESS_S3TC);
BIND_ENUM_CONSTANT(COMPRESS_PVRTC2);
BIND_ENUM_CONSTANT(COMPRESS_PVRTC4);
BIND_ENUM_CONSTANT(COMPRESS_ETC);
BIND_ENUM_CONSTANT(COMPRESS_ETC2);
BIND_CONSTANT(COMPRESS_SOURCE_GENERIC);
BIND_CONSTANT(COMPRESS_SOURCE_SRGB);
BIND_CONSTANT(COMPRESS_SOURCE_NORMAL);
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_GENERIC);
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_SRGB);
BIND_ENUM_CONSTANT(COMPRESS_SOURCE_NORMAL);
}
void Image::set_compress_bc_func(void (*p_compress_func)(Image *, CompressSource)) {

View file

@ -650,84 +650,84 @@ void HTTPClient::_bind_methods() {
ClassDB::bind_method(D_METHOD("query_string_from_dict", "fields"), &HTTPClient::query_string_from_dict);
BIND_CONSTANT(METHOD_GET);
BIND_CONSTANT(METHOD_HEAD);
BIND_CONSTANT(METHOD_POST);
BIND_CONSTANT(METHOD_PUT);
BIND_CONSTANT(METHOD_DELETE);
BIND_CONSTANT(METHOD_OPTIONS);
BIND_CONSTANT(METHOD_TRACE);
BIND_CONSTANT(METHOD_CONNECT);
BIND_CONSTANT(METHOD_MAX);
BIND_ENUM_CONSTANT(METHOD_GET);
BIND_ENUM_CONSTANT(METHOD_HEAD);
BIND_ENUM_CONSTANT(METHOD_POST);
BIND_ENUM_CONSTANT(METHOD_PUT);
BIND_ENUM_CONSTANT(METHOD_DELETE);
BIND_ENUM_CONSTANT(METHOD_OPTIONS);
BIND_ENUM_CONSTANT(METHOD_TRACE);
BIND_ENUM_CONSTANT(METHOD_CONNECT);
BIND_ENUM_CONSTANT(METHOD_MAX);
BIND_CONSTANT(STATUS_DISCONNECTED);
BIND_CONSTANT(STATUS_RESOLVING); //resolving hostname (if passed a hostname)
BIND_CONSTANT(STATUS_CANT_RESOLVE);
BIND_CONSTANT(STATUS_CONNECTING); //connecting to ip
BIND_CONSTANT(STATUS_CANT_CONNECT);
BIND_CONSTANT(STATUS_CONNECTED); //connected ); requests only accepted here
BIND_CONSTANT(STATUS_REQUESTING); // request in progress
BIND_CONSTANT(STATUS_BODY); // request resulted in body ); which must be read
BIND_CONSTANT(STATUS_CONNECTION_ERROR);
BIND_CONSTANT(STATUS_SSL_HANDSHAKE_ERROR);
BIND_ENUM_CONSTANT(STATUS_DISCONNECTED);
BIND_ENUM_CONSTANT(STATUS_RESOLVING); //resolving hostname (if passed a hostname)
BIND_ENUM_CONSTANT(STATUS_CANT_RESOLVE);
BIND_ENUM_CONSTANT(STATUS_CONNECTING); //connecting to ip
BIND_ENUM_CONSTANT(STATUS_CANT_CONNECT);
BIND_ENUM_CONSTANT(STATUS_CONNECTED); //connected ); requests only accepted here
BIND_ENUM_CONSTANT(STATUS_REQUESTING); // request in progress
BIND_ENUM_CONSTANT(STATUS_BODY); // request resulted in body ); which must be read
BIND_ENUM_CONSTANT(STATUS_CONNECTION_ERROR);
BIND_ENUM_CONSTANT(STATUS_SSL_HANDSHAKE_ERROR);
BIND_CONSTANT(RESPONSE_CONTINUE);
BIND_CONSTANT(RESPONSE_SWITCHING_PROTOCOLS);
BIND_CONSTANT(RESPONSE_PROCESSING);
BIND_ENUM_CONSTANT(RESPONSE_CONTINUE);
BIND_ENUM_CONSTANT(RESPONSE_SWITCHING_PROTOCOLS);
BIND_ENUM_CONSTANT(RESPONSE_PROCESSING);
// 2xx successful
BIND_CONSTANT(RESPONSE_OK);
BIND_CONSTANT(RESPONSE_CREATED);
BIND_CONSTANT(RESPONSE_ACCEPTED);
BIND_CONSTANT(RESPONSE_NON_AUTHORITATIVE_INFORMATION);
BIND_CONSTANT(RESPONSE_NO_CONTENT);
BIND_CONSTANT(RESPONSE_RESET_CONTENT);
BIND_CONSTANT(RESPONSE_PARTIAL_CONTENT);
BIND_CONSTANT(RESPONSE_MULTI_STATUS);
BIND_CONSTANT(RESPONSE_IM_USED);
BIND_ENUM_CONSTANT(RESPONSE_OK);
BIND_ENUM_CONSTANT(RESPONSE_CREATED);
BIND_ENUM_CONSTANT(RESPONSE_ACCEPTED);
BIND_ENUM_CONSTANT(RESPONSE_NON_AUTHORITATIVE_INFORMATION);
BIND_ENUM_CONSTANT(RESPONSE_NO_CONTENT);
BIND_ENUM_CONSTANT(RESPONSE_RESET_CONTENT);
BIND_ENUM_CONSTANT(RESPONSE_PARTIAL_CONTENT);
BIND_ENUM_CONSTANT(RESPONSE_MULTI_STATUS);
BIND_ENUM_CONSTANT(RESPONSE_IM_USED);
// 3xx redirection
BIND_CONSTANT(RESPONSE_MULTIPLE_CHOICES);
BIND_CONSTANT(RESPONSE_MOVED_PERMANENTLY);
BIND_CONSTANT(RESPONSE_FOUND);
BIND_CONSTANT(RESPONSE_SEE_OTHER);
BIND_CONSTANT(RESPONSE_NOT_MODIFIED);
BIND_CONSTANT(RESPONSE_USE_PROXY);
BIND_CONSTANT(RESPONSE_TEMPORARY_REDIRECT);
BIND_ENUM_CONSTANT(RESPONSE_MULTIPLE_CHOICES);
BIND_ENUM_CONSTANT(RESPONSE_MOVED_PERMANENTLY);
BIND_ENUM_CONSTANT(RESPONSE_FOUND);
BIND_ENUM_CONSTANT(RESPONSE_SEE_OTHER);
BIND_ENUM_CONSTANT(RESPONSE_NOT_MODIFIED);
BIND_ENUM_CONSTANT(RESPONSE_USE_PROXY);
BIND_ENUM_CONSTANT(RESPONSE_TEMPORARY_REDIRECT);
// 4xx client error
BIND_CONSTANT(RESPONSE_BAD_REQUEST);
BIND_CONSTANT(RESPONSE_UNAUTHORIZED);
BIND_CONSTANT(RESPONSE_PAYMENT_REQUIRED);
BIND_CONSTANT(RESPONSE_FORBIDDEN);
BIND_CONSTANT(RESPONSE_NOT_FOUND);
BIND_CONSTANT(RESPONSE_METHOD_NOT_ALLOWED);
BIND_CONSTANT(RESPONSE_NOT_ACCEPTABLE);
BIND_CONSTANT(RESPONSE_PROXY_AUTHENTICATION_REQUIRED);
BIND_CONSTANT(RESPONSE_REQUEST_TIMEOUT);
BIND_CONSTANT(RESPONSE_CONFLICT);
BIND_CONSTANT(RESPONSE_GONE);
BIND_CONSTANT(RESPONSE_LENGTH_REQUIRED);
BIND_CONSTANT(RESPONSE_PRECONDITION_FAILED);
BIND_CONSTANT(RESPONSE_REQUEST_ENTITY_TOO_LARGE);
BIND_CONSTANT(RESPONSE_REQUEST_URI_TOO_LONG);
BIND_CONSTANT(RESPONSE_UNSUPPORTED_MEDIA_TYPE);
BIND_CONSTANT(RESPONSE_REQUESTED_RANGE_NOT_SATISFIABLE);
BIND_CONSTANT(RESPONSE_EXPECTATION_FAILED);
BIND_CONSTANT(RESPONSE_UNPROCESSABLE_ENTITY);
BIND_CONSTANT(RESPONSE_LOCKED);
BIND_CONSTANT(RESPONSE_FAILED_DEPENDENCY);
BIND_CONSTANT(RESPONSE_UPGRADE_REQUIRED);
BIND_ENUM_CONSTANT(RESPONSE_BAD_REQUEST);
BIND_ENUM_CONSTANT(RESPONSE_UNAUTHORIZED);
BIND_ENUM_CONSTANT(RESPONSE_PAYMENT_REQUIRED);
BIND_ENUM_CONSTANT(RESPONSE_FORBIDDEN);
BIND_ENUM_CONSTANT(RESPONSE_NOT_FOUND);
BIND_ENUM_CONSTANT(RESPONSE_METHOD_NOT_ALLOWED);
BIND_ENUM_CONSTANT(RESPONSE_NOT_ACCEPTABLE);
BIND_ENUM_CONSTANT(RESPONSE_PROXY_AUTHENTICATION_REQUIRED);
BIND_ENUM_CONSTANT(RESPONSE_REQUEST_TIMEOUT);
BIND_ENUM_CONSTANT(RESPONSE_CONFLICT);
BIND_ENUM_CONSTANT(RESPONSE_GONE);
BIND_ENUM_CONSTANT(RESPONSE_LENGTH_REQUIRED);
BIND_ENUM_CONSTANT(RESPONSE_PRECONDITION_FAILED);
BIND_ENUM_CONSTANT(RESPONSE_REQUEST_ENTITY_TOO_LARGE);
BIND_ENUM_CONSTANT(RESPONSE_REQUEST_URI_TOO_LONG);
BIND_ENUM_CONSTANT(RESPONSE_UNSUPPORTED_MEDIA_TYPE);
BIND_ENUM_CONSTANT(RESPONSE_REQUESTED_RANGE_NOT_SATISFIABLE);
BIND_ENUM_CONSTANT(RESPONSE_EXPECTATION_FAILED);
BIND_ENUM_CONSTANT(RESPONSE_UNPROCESSABLE_ENTITY);
BIND_ENUM_CONSTANT(RESPONSE_LOCKED);
BIND_ENUM_CONSTANT(RESPONSE_FAILED_DEPENDENCY);
BIND_ENUM_CONSTANT(RESPONSE_UPGRADE_REQUIRED);
// 5xx server error
BIND_CONSTANT(RESPONSE_INTERNAL_SERVER_ERROR);
BIND_CONSTANT(RESPONSE_NOT_IMPLEMENTED);
BIND_CONSTANT(RESPONSE_BAD_GATEWAY);
BIND_CONSTANT(RESPONSE_SERVICE_UNAVAILABLE);
BIND_CONSTANT(RESPONSE_GATEWAY_TIMEOUT);
BIND_CONSTANT(RESPONSE_HTTP_VERSION_NOT_SUPPORTED);
BIND_CONSTANT(RESPONSE_INSUFFICIENT_STORAGE);
BIND_CONSTANT(RESPONSE_NOT_EXTENDED);
BIND_ENUM_CONSTANT(RESPONSE_INTERNAL_SERVER_ERROR);
BIND_ENUM_CONSTANT(RESPONSE_NOT_IMPLEMENTED);
BIND_ENUM_CONSTANT(RESPONSE_BAD_GATEWAY);
BIND_ENUM_CONSTANT(RESPONSE_SERVICE_UNAVAILABLE);
BIND_ENUM_CONSTANT(RESPONSE_GATEWAY_TIMEOUT);
BIND_ENUM_CONSTANT(RESPONSE_HTTP_VERSION_NOT_SUPPORTED);
BIND_ENUM_CONSTANT(RESPONSE_INSUFFICIENT_STORAGE);
BIND_ENUM_CONSTANT(RESPONSE_NOT_EXTENDED);
}
void HTTPClient::set_read_chunk_size(int p_size) {

View file

@ -197,6 +197,7 @@ public:
~HTTPClient();
};
VARIANT_ENUM_CAST(HTTPClient::ResponseCode)
VARIANT_ENUM_CAST(HTTPClient::Method);
VARIANT_ENUM_CAST(HTTPClient::Status);

View file

@ -242,18 +242,18 @@ void IP::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_local_addresses"), &IP::_get_local_addresses);
ClassDB::bind_method(D_METHOD("clear_cache", "hostname"), &IP::clear_cache, DEFVAL(""));
BIND_CONSTANT(RESOLVER_STATUS_NONE);
BIND_CONSTANT(RESOLVER_STATUS_WAITING);
BIND_CONSTANT(RESOLVER_STATUS_DONE);
BIND_CONSTANT(RESOLVER_STATUS_ERROR);
BIND_ENUM_CONSTANT(RESOLVER_STATUS_NONE);
BIND_ENUM_CONSTANT(RESOLVER_STATUS_WAITING);
BIND_ENUM_CONSTANT(RESOLVER_STATUS_DONE);
BIND_ENUM_CONSTANT(RESOLVER_STATUS_ERROR);
BIND_CONSTANT(RESOLVER_MAX_QUERIES);
BIND_CONSTANT(RESOLVER_INVALID_ID);
BIND_CONSTANT(TYPE_NONE);
BIND_CONSTANT(TYPE_IPV4);
BIND_CONSTANT(TYPE_IPV6);
BIND_CONSTANT(TYPE_ANY);
BIND_ENUM_CONSTANT(TYPE_NONE);
BIND_ENUM_CONSTANT(TYPE_IPV4);
BIND_ENUM_CONSTANT(TYPE_IPV6);
BIND_ENUM_CONSTANT(TYPE_ANY);
}
IP *IP::singleton = NULL;

View file

@ -44,13 +44,13 @@ void NetworkedMultiplayerPeer::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_refuse_new_connections", "enable"), &NetworkedMultiplayerPeer::set_refuse_new_connections);
ClassDB::bind_method(D_METHOD("is_refusing_new_connections"), &NetworkedMultiplayerPeer::is_refusing_new_connections);
BIND_CONSTANT(TRANSFER_MODE_UNRELIABLE);
BIND_CONSTANT(TRANSFER_MODE_UNRELIABLE_ORDERED);
BIND_CONSTANT(TRANSFER_MODE_RELIABLE);
BIND_ENUM_CONSTANT(TRANSFER_MODE_UNRELIABLE);
BIND_ENUM_CONSTANT(TRANSFER_MODE_UNRELIABLE_ORDERED);
BIND_ENUM_CONSTANT(TRANSFER_MODE_RELIABLE);
BIND_CONSTANT(CONNECTION_DISCONNECTED);
BIND_CONSTANT(CONNECTION_CONNECTING);
BIND_CONSTANT(CONNECTION_CONNECTED);
BIND_ENUM_CONSTANT(CONNECTION_DISCONNECTED);
BIND_ENUM_CONSTANT(CONNECTION_CONNECTING);
BIND_ENUM_CONSTANT(CONNECTION_CONNECTED);
BIND_CONSTANT(TARGET_PEER_BROADCAST);
BIND_CONSTANT(TARGET_PEER_SERVER);

View file

@ -55,10 +55,11 @@ void StreamPeerSSL::_bind_methods() {
ClassDB::bind_method(D_METHOD("connect_to_stream", "stream", "validate_certs", "for_hostname"), &StreamPeerSSL::connect_to_stream, DEFVAL(false), DEFVAL(String()));
ClassDB::bind_method(D_METHOD("get_status"), &StreamPeerSSL::get_status);
ClassDB::bind_method(D_METHOD("disconnect_from_stream"), &StreamPeerSSL::disconnect_from_stream);
BIND_CONSTANT(STATUS_DISCONNECTED);
BIND_CONSTANT(STATUS_CONNECTED);
BIND_CONSTANT(STATUS_ERROR_NO_CERTIFICATE);
BIND_CONSTANT(STATUS_ERROR_HOSTNAME_MISMATCH);
BIND_ENUM_CONSTANT(STATUS_DISCONNECTED);
BIND_ENUM_CONSTANT(STATUS_CONNECTED);
BIND_ENUM_CONSTANT(STATUS_ERROR_NO_CERTIFICATE);
BIND_ENUM_CONSTANT(STATUS_ERROR_HOSTNAME_MISMATCH);
}
StreamPeerSSL::StreamPeerSSL() {

View file

@ -55,10 +55,10 @@ void StreamPeerTCP::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_connected_port"), &StreamPeerTCP::get_connected_port);
ClassDB::bind_method(D_METHOD("disconnect_from_host"), &StreamPeerTCP::disconnect_from_host);
BIND_CONSTANT(STATUS_NONE);
BIND_CONSTANT(STATUS_CONNECTING);
BIND_CONSTANT(STATUS_CONNECTED);
BIND_CONSTANT(STATUS_ERROR);
BIND_ENUM_CONSTANT(STATUS_NONE);
BIND_ENUM_CONSTANT(STATUS_CONNECTING);
BIND_ENUM_CONSTANT(STATUS_CONNECTED);
BIND_ENUM_CONSTANT(STATUS_ERROR);
}
Ref<StreamPeerTCP> StreamPeerTCP::create_ref() {

View file

@ -373,13 +373,13 @@ void XMLParser::_bind_methods() {
ClassDB::bind_method(D_METHOD("open", "file"), &XMLParser::open);
ClassDB::bind_method(D_METHOD("open_buffer", "buffer"), &XMLParser::open_buffer);
BIND_CONSTANT(NODE_NONE);
BIND_CONSTANT(NODE_ELEMENT);
BIND_CONSTANT(NODE_ELEMENT_END);
BIND_CONSTANT(NODE_TEXT);
BIND_CONSTANT(NODE_COMMENT);
BIND_CONSTANT(NODE_CDATA);
BIND_CONSTANT(NODE_UNKNOWN);
BIND_ENUM_CONSTANT(NODE_NONE);
BIND_ENUM_CONSTANT(NODE_ELEMENT);
BIND_ENUM_CONSTANT(NODE_ELEMENT_END);
BIND_ENUM_CONSTANT(NODE_TEXT);
BIND_ENUM_CONSTANT(NODE_COMMENT);
BIND_ENUM_CONSTANT(NODE_CDATA);
BIND_ENUM_CONSTANT(NODE_UNKNOWN);
};
Error XMLParser::read() {

View file

@ -124,6 +124,9 @@ struct VariantCaster<const T &> {
#endif
// Object enum casts must go here
VARIANT_ENUM_CAST(Object::ConnectFlags);
#define CHECK_ARG(m_arg) \
if ((m_arg - 1) < p_arg_count) { \
Variant::Type argtype = get_argument_type(m_arg - 1); \
@ -148,14 +151,35 @@ struct VariantCaster<const T &> {
VARIANT_ENUM_CAST(Vector3::Axis);
VARIANT_ENUM_CAST(Error);
VARIANT_ENUM_CAST(wchar_t);
VARIANT_ENUM_CAST(Margin);
VARIANT_ENUM_CAST(Corner);
VARIANT_ENUM_CAST(Orientation);
VARIANT_ENUM_CAST(HAlign);
VARIANT_ENUM_CAST(VAlign);
VARIANT_ENUM_CAST(PropertyHint);
VARIANT_ENUM_CAST(PropertyUsageFlags);
VARIANT_ENUM_CAST(MethodFlags);
VARIANT_ENUM_CAST(Variant::Type);
VARIANT_ENUM_CAST(Variant::Operator);
template <>
struct VariantCaster<wchar_t> {
static _FORCE_INLINE_ wchar_t cast(const Variant &p_variant) {
return (wchar_t)p_variant.operator int();
}
};
#ifdef PTRCALL_ENABLED
template <>
struct PtrToArg<wchar_t> {
_FORCE_INLINE_ static wchar_t convert(const void *p_ptr) {
return wchar_t(*reinterpret_cast<const int *>(p_ptr));
}
_FORCE_INLINE_ static void encode(wchar_t p_val, const void *p_ptr) {
*(int *)p_ptr = p_val;
}
};
#endif
class MethodBind {
int method_id;

View file

@ -1737,9 +1737,9 @@ void Object::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_POSTINITIALIZE);
BIND_CONSTANT(NOTIFICATION_PREDELETE);
BIND_CONSTANT(CONNECT_DEFERRED);
BIND_CONSTANT(CONNECT_PERSIST);
BIND_CONSTANT(CONNECT_ONESHOT);
BIND_ENUM_CONSTANT(CONNECT_DEFERRED);
BIND_ENUM_CONSTANT(CONNECT_PERSIST);
BIND_ENUM_CONSTANT(CONNECT_ONESHOT);
}
void Object::call_deferred(const StringName &p_method, VARIANT_ARG_DECLARE) {

View file

@ -86,10 +86,10 @@ void Input::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_custom_mouse_cursor", "image", "hotspot"), &Input::set_custom_mouse_cursor, DEFVAL(Vector2()));
ClassDB::bind_method(D_METHOD("parse_input_event", "event"), &Input::parse_input_event);
BIND_CONSTANT(MOUSE_MODE_VISIBLE);
BIND_CONSTANT(MOUSE_MODE_HIDDEN);
BIND_CONSTANT(MOUSE_MODE_CAPTURED);
BIND_CONSTANT(MOUSE_MODE_CONFINED);
BIND_ENUM_CONSTANT(MOUSE_MODE_VISIBLE);
BIND_ENUM_CONSTANT(MOUSE_MODE_HIDDEN);
BIND_ENUM_CONSTANT(MOUSE_MODE_CAPTURED);
BIND_ENUM_CONSTANT(MOUSE_MODE_CONFINED);
ADD_SIGNAL(MethodInfo("joy_connection_changed", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::BOOL, "connected")));
}

View file

@ -75,6 +75,8 @@ static _Geometry *_geometry = NULL;
extern Mutex *_global_mutex;
extern void register_global_constants();
extern void unregister_global_constants();
extern void register_variant_methods();
extern void unregister_variant_methods();
@ -88,6 +90,7 @@ void register_core_types() {
StringName::setup();
register_global_constants();
register_variant_methods();
CoreStringNames::create();
@ -218,6 +221,7 @@ void unregister_core_types() {
ObjectDB::cleanup();
unregister_variant_methods();
unregister_global_constants();
ClassDB::cleanup();
ResourceCache::clear();

View file

@ -32,96 +32,22 @@
/* Batch of specializations to obtain the actual simple type */
template <class T>
struct GetSimpleType {
T type;
};
template <class T>
struct GetSimpleTypeT {
typedef T type_t;
};
template <class T>
struct GetSimpleType<T &> {
T type;
};
template <class T>
struct GetSimpleTypeT<T &> {
typedef T type_t;
};
template <class T>
struct GetSimpleType<T const> {
T type;
_FORCE_INLINE_ GetSimpleType() {}
};
template <class T>
struct GetSimpleTypeT<T const> {
typedef T type_t;
};
template <class T>
struct GetSimpleType<const T &> {
T type;
_FORCE_INLINE_ GetSimpleType() {}
};
template <class T>
struct GetSimpleType<T *> {
T *type;
_FORCE_INLINE_ GetSimpleType() { type = NULL; }
};
template <class T>
struct GetSimpleType<const T *> {
T *type;
_FORCE_INLINE_ GetSimpleType() { type = NULL; }
};
#define SIMPLE_NUMERIC_TYPE(m_type) \
template <> \
struct GetSimpleType<m_type> { \
m_type type; \
_FORCE_INLINE_ GetSimpleType() { type = (m_type)0; } \
}; \
template <> \
struct GetSimpleType<m_type const> { \
m_type type; \
_FORCE_INLINE_ GetSimpleType() { type = (m_type)0; } \
}; \
template <> \
struct GetSimpleType<m_type &> { \
m_type type; \
_FORCE_INLINE_ GetSimpleType() { type = (m_type)0; } \
}; \
template <> \
struct GetSimpleType<const m_type &> { \
m_type type; \
_FORCE_INLINE_ GetSimpleType() { type = (m_type)0; } \
};
SIMPLE_NUMERIC_TYPE(bool);
SIMPLE_NUMERIC_TYPE(uint8_t);
SIMPLE_NUMERIC_TYPE(int8_t);
SIMPLE_NUMERIC_TYPE(uint16_t);
SIMPLE_NUMERIC_TYPE(int16_t);
SIMPLE_NUMERIC_TYPE(uint32_t);
SIMPLE_NUMERIC_TYPE(int32_t);
SIMPLE_NUMERIC_TYPE(int64_t);
SIMPLE_NUMERIC_TYPE(uint64_t);
SIMPLE_NUMERIC_TYPE(float);
SIMPLE_NUMERIC_TYPE(double);
#endif

View file

@ -1,6 +1,8 @@
#ifndef GET_TYPE_INFO_H
#define GET_TYPE_INFO_H
#ifdef DEBUG_METHODS_ENABLED
template <bool C, typename T = void>
struct EnableIf {
@ -40,8 +42,8 @@ struct GetTypeInfo {
enum { VARIANT_TYPE = Variant::NIL };
static inline StringName get_class_name() {
ERR_PRINT("Fallback type info. Bug!");
return ""; // Not "Nil", this is an error
ERR_PRINT("GetTypeInfo fallback. Bug!");
return StringName(); // Not "Nil", this is an error
}
};
@ -70,6 +72,7 @@ MAKE_TYPE_INFO(uint32_t, Variant::INT)
MAKE_TYPE_INFO(int32_t, Variant::INT)
MAKE_TYPE_INFO(int64_t, Variant::INT)
MAKE_TYPE_INFO(uint64_t, Variant::INT)
MAKE_TYPE_INFO(wchar_t, Variant::INT)
MAKE_TYPE_INFO(float, Variant::REAL)
MAKE_TYPE_INFO(double, Variant::REAL)
@ -152,36 +155,6 @@ MAKE_TEMPLATE_TYPE_INFO(Vector, Plane, Variant::ARRAY)
MAKE_TEMPLATE_TYPE_INFO(PoolVector, Plane, Variant::ARRAY)
MAKE_TEMPLATE_TYPE_INFO(PoolVector, Face3, Variant::POOL_VECTOR3_ARRAY)
#define MAKE_ENUM_TYPE_INFO(m_enum) \
template <> \
struct GetTypeInfo<m_enum> { \
enum { VARIANT_TYPE = Variant::INT }; \
static inline StringName get_class_name() { \
return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
} \
}; \
template <> \
struct GetTypeInfo<m_enum const> { \
enum { VARIANT_TYPE = Variant::INT }; \
static inline StringName get_class_name() { \
return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
} \
}; \
template <> \
struct GetTypeInfo<m_enum &> { \
enum { VARIANT_TYPE = Variant::INT }; \
static inline StringName get_class_name() { \
return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
} \
}; \
template <> \
struct GetTypeInfo<const m_enum &> { \
enum { VARIANT_TYPE = Variant::INT }; \
static inline StringName get_class_name() { \
return Variant::get_type_name((Variant::Type)VARIANT_TYPE); \
} \
};
template <typename T>
struct GetTypeInfo<T *, typename EnableIf<TypeInherits<Object, T>::value>::type> {
enum { VARIANT_TYPE = Variant::OBJECT };
@ -200,4 +173,30 @@ struct GetTypeInfo<const T *, typename EnableIf<TypeInherits<Object, T>::value>:
}
};
#define TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_impl) \
template <> \
struct GetTypeInfo<m_impl> { \
enum { VARIANT_TYPE = Variant::INT }; \
static inline StringName get_class_name() { return "enum." #m_enum; } \
};
#define MAKE_ENUM_TYPE_INFO(m_enum) \
TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum) \
TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum const) \
TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, m_enum &) \
TEMPL_MAKE_ENUM_TYPE_INFO(m_enum, const m_enum &)
template <typename T>
inline StringName __constant_get_enum_name(T param, const String &p_constant) {
if (GetTypeInfo<T>::VARIANT_TYPE == Variant::NIL)
ERR_PRINTS("Missing VARIANT_ENUM_CAST for constant's enum: " + p_constant);
return GetTypeInfo<T>::get_class_name();
}
#else
#define MAKE_ENUM_TYPE_INFO(m_enum)
#endif // DEBUG_METHODS_ENABLED
#endif // GET_TYPE_INFO_H

View file

@ -504,7 +504,7 @@ void UndoRedo::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_current_action_name"), &UndoRedo::get_current_action_name);
ClassDB::bind_method(D_METHOD("get_version"), &UndoRedo::get_version);
BIND_CONSTANT(MERGE_DISABLE);
BIND_CONSTANT(MERGE_ENDS);
BIND_CONSTANT(MERGE_ALL);
BIND_ENUM_CONSTANT(MERGE_DISABLE);
BIND_ENUM_CONSTANT(MERGE_ENDS);
BIND_ENUM_CONSTANT(MERGE_ALL);
}