mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 09:17:52 -06:00
Optimization of the configuration layer:
The values of StaticPrintConfig derived objects were searched by a name walking through a huge chained if. Now they are being mapped with a std::map. Also initialization of StaticPrintConfig classes from their ConfigOptionDef defaults is done by maintaining a single global definition of each StaticPrintConfig derived class, and a new instance is initialized from this static copy. Also the ConfigOption instances are casted using static_cast wherever possible, and their types are verified by a virtual type() method. This approach avoids insiginificant performance penalty of a dynamic_cast. Also the compare and clone methods were added to ConfigOption, and the cloning & compare work on binary values, not by serialization.
This commit is contained in:
parent
a91d7cb2f7
commit
3731820c48
14 changed files with 1475 additions and 934 deletions
|
@ -77,7 +77,7 @@ ConfigBase__get(ConfigBase* THIS, const t_config_option_key &opt_key) {
|
|||
ConfigOption* opt = THIS->option(opt_key);
|
||||
if (opt == NULL) return &PL_sv_undef;
|
||||
|
||||
const ConfigOptionDef* def = THIS->def->get(opt_key);
|
||||
const ConfigOptionDef* def = THIS->def()->get(opt_key);
|
||||
return ConfigOption_to_SV(*opt, *def);
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ ConfigBase__get_at(ConfigBase* THIS, const t_config_option_key &opt_key, size_t
|
|||
ConfigOption* opt = THIS->option(opt_key);
|
||||
if (opt == NULL) return &PL_sv_undef;
|
||||
|
||||
const ConfigOptionDef* def = THIS->def->get(opt_key);
|
||||
const ConfigOptionDef* def = THIS->def()->get(opt_key);
|
||||
if (def->type == coFloats || def->type == coPercents) {
|
||||
ConfigOptionFloats* optv = dynamic_cast<ConfigOptionFloats*>(opt);
|
||||
return newSVnv(optv->get_at(i));
|
||||
|
@ -183,7 +183,7 @@ ConfigBase__set(ConfigBase* THIS, const t_config_option_key &opt_key, SV* value)
|
|||
ConfigOption* opt = THIS->option(opt_key, true);
|
||||
if (opt == NULL) CONFESS("Trying to set non-existing option");
|
||||
|
||||
const ConfigOptionDef* def = THIS->def->get(opt_key);
|
||||
const ConfigOptionDef* def = THIS->def()->get(opt_key);
|
||||
if (def->type == coFloat) {
|
||||
if (!looks_like_number(value)) return false;
|
||||
ConfigOptionFloat* optv = dynamic_cast<ConfigOptionFloat*>(opt);
|
||||
|
@ -297,7 +297,7 @@ ConfigBase__set_ifndef(ConfigBase* THIS, const t_config_option_key &opt_key, SV*
|
|||
|
||||
bool
|
||||
StaticConfig__set(StaticConfig* THIS, const t_config_option_key &opt_key, SV* value) {
|
||||
const ConfigOptionDef* optdef = THIS->def->get(opt_key);
|
||||
const ConfigOptionDef* optdef = THIS->def()->get(opt_key);
|
||||
if (!optdef->shortcut.empty()) {
|
||||
for (std::vector<t_config_option_key>::const_iterator it = optdef->shortcut.begin(); it != optdef->shortcut.end(); ++it) {
|
||||
if (!StaticConfig__set(THIS, *it, value)) return false;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue