Move repetitive code to macros
In preparation for the following "allow negative indexing" commit, replace the repetitive array "set index" and "get index" code with macros. no functional changes were made, the resulting machine code is unchanged.
This commit is contained in:
parent
56348cbbfe
commit
842057e56f
1 changed files with 38 additions and 243 deletions
|
@ -969,6 +969,28 @@ Variant Variant::get_named(const StringName& p_index, bool *r_valid) const {
|
||||||
return get(p_index.operator String(),r_valid);
|
return get(p_index.operator String(),r_valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define DEFAULT_OP_ARRAY_CMD(m_name, m_type, skip_test, cmd)\
|
||||||
|
case m_name: {\
|
||||||
|
skip_test;\
|
||||||
|
\
|
||||||
|
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {\
|
||||||
|
int index = p_index;\
|
||||||
|
m_type *arr=reinterpret_cast<m_type* >(_data._mem);\
|
||||||
|
\
|
||||||
|
if (index>=0 && index<arr->size()) {\
|
||||||
|
valid=true;\
|
||||||
|
cmd;\
|
||||||
|
}\
|
||||||
|
}\
|
||||||
|
} break;
|
||||||
|
|
||||||
|
#define DEFAULT_OP_DVECTOR_SET(m_name, dv_type, skip_cond)\
|
||||||
|
DEFAULT_OP_ARRAY_CMD(m_name, DVector<dv_type>, if(skip_cond) return;, arr->set(index, p_value);return)
|
||||||
|
|
||||||
|
#define DEFAULT_OP_DVECTOR_GET(m_name, dv_type)\
|
||||||
|
DEFAULT_OP_ARRAY_CMD(m_name, const DVector<dv_type>, 0, return arr->get(index))
|
||||||
|
|
||||||
void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) {
|
void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid) {
|
||||||
|
|
||||||
static bool _dummy=false;
|
static bool _dummy=false;
|
||||||
|
@ -1786,145 +1808,14 @@ void Variant::set(const Variant& p_index, const Variant& p_value, bool *r_valid)
|
||||||
valid=true; //always valid, i guess? should this really be ok?
|
valid=true; //always valid, i guess? should this really be ok?
|
||||||
return;
|
return;
|
||||||
} break; // 20
|
} break; // 20
|
||||||
case ARRAY: {
|
DEFAULT_OP_ARRAY_CMD(ARRAY, Array, ;, (*arr)[index]=p_value;return)
|
||||||
|
DEFAULT_OP_DVECTOR_SET(RAW_ARRAY, uint8_t, p_value.type != Variant::REAL && p_value.type != Variant::INT)
|
||||||
|
DEFAULT_OP_DVECTOR_SET(INT_ARRAY, int, p_value.type != Variant::REAL && p_value.type != Variant::INT)
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
DEFAULT_OP_DVECTOR_SET(REAL_ARRAY, real_t, p_value.type != Variant::REAL && p_value.type != Variant::INT)
|
||||||
|
DEFAULT_OP_DVECTOR_SET(STRING_ARRAY, String, p_value.type != Variant::STRING) // 25
|
||||||
int index = p_index;
|
DEFAULT_OP_DVECTOR_SET(VECTOR2_ARRAY, Vector2, p_value.type != Variant::VECTOR2)
|
||||||
Array *arr=reinterpret_cast<Array* >(_data._mem);
|
DEFAULT_OP_DVECTOR_SET(VECTOR3_ARRAY, Vector3, p_value.type != Variant::VECTOR3)
|
||||||
|
DEFAULT_OP_DVECTOR_SET(COLOR_ARRAY, Color, p_value.type != Variant::COLOR)
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
(*arr)[index]=p_value;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case RAW_ARRAY: {
|
|
||||||
|
|
||||||
if (p_value.type!=Variant::REAL && p_value.type!=Variant::INT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<uint8_t> *arr=reinterpret_cast<DVector<uint8_t>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case INT_ARRAY: {
|
|
||||||
if (p_value.type!=Variant::REAL && p_value.type!=Variant::INT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<int> *arr=reinterpret_cast<DVector<int>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case REAL_ARRAY: {
|
|
||||||
|
|
||||||
if (p_value.type!=Variant::REAL && p_value.type!=Variant::INT)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<real_t> *arr=reinterpret_cast<DVector<real_t>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case STRING_ARRAY: {
|
|
||||||
|
|
||||||
if (p_value.type!=Variant::STRING)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<String> *arr=reinterpret_cast<DVector<String>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break; //25
|
|
||||||
case VECTOR2_ARRAY: {
|
|
||||||
|
|
||||||
if (p_value.type!=Variant::VECTOR2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<Vector2> *arr=reinterpret_cast<DVector<Vector2>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case VECTOR3_ARRAY: {
|
|
||||||
|
|
||||||
if (p_value.type!=Variant::VECTOR3)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<Vector3> *arr=reinterpret_cast<DVector<Vector3>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case COLOR_ARRAY: {
|
|
||||||
|
|
||||||
if (p_value.type!=Variant::COLOR)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
DVector<Color> *arr=reinterpret_cast<DVector<Color>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
arr->set(index,p_value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2489,110 +2380,14 @@ Variant Variant::get(const Variant& p_index, bool *r_valid) const {
|
||||||
return *res;
|
return *res;
|
||||||
}
|
}
|
||||||
} break; // 20
|
} break; // 20
|
||||||
case ARRAY: {
|
DEFAULT_OP_ARRAY_CMD(ARRAY, const Array, 0, return (*arr)[index])
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
DEFAULT_OP_DVECTOR_GET(RAW_ARRAY, uint8_t)
|
||||||
|
DEFAULT_OP_DVECTOR_GET(INT_ARRAY, int)
|
||||||
int index = p_index;
|
DEFAULT_OP_DVECTOR_GET(REAL_ARRAY, real_t)
|
||||||
const Array *arr=reinterpret_cast<const Array* >(_data._mem);
|
DEFAULT_OP_DVECTOR_GET(STRING_ARRAY, String)
|
||||||
|
DEFAULT_OP_DVECTOR_GET(VECTOR2_ARRAY, Vector2)
|
||||||
if (index >=0 && index <arr->size()) {
|
DEFAULT_OP_DVECTOR_GET(VECTOR3_ARRAY, Vector3)
|
||||||
valid=true;
|
DEFAULT_OP_DVECTOR_GET(COLOR_ARRAY, Color)
|
||||||
return (*arr)[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case RAW_ARRAY: {
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<uint8_t> *arr=reinterpret_cast<const DVector<uint8_t>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case INT_ARRAY: {
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<int> *arr=reinterpret_cast<const DVector<int>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
case REAL_ARRAY: {
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<real_t> *arr=reinterpret_cast<const DVector<real_t>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case STRING_ARRAY: {
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<String> *arr=reinterpret_cast<const DVector<String>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break; //25
|
|
||||||
case VECTOR2_ARRAY: {
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<Vector2> *arr=reinterpret_cast<const DVector<Vector2>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case VECTOR3_ARRAY: {
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<Vector3> *arr=reinterpret_cast<const DVector<Vector3>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} break;
|
|
||||||
case COLOR_ARRAY: {
|
|
||||||
|
|
||||||
if (p_index.get_type()==Variant::INT || p_index.get_type()==Variant::REAL) {
|
|
||||||
|
|
||||||
int index = p_index;
|
|
||||||
const DVector<Color> *arr=reinterpret_cast<const DVector<Color>* >(_data._mem);
|
|
||||||
|
|
||||||
if (index >=0 && index <arr->size()) {
|
|
||||||
valid=true;
|
|
||||||
return arr->get(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} break;
|
|
||||||
default: return Variant();
|
default: return Variant();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue