Hi List.

first of all, congratulations to Savant!

i'm working on the once mentioned set_param_by_name patch, and if it's
useful for the gsoc plugin, i'll try to complete it soon.

i've figured out a way to avoid linear search (mostly for adms models, as
they have much more parameters), and i'd like to do the bm*-parameters
the same way. what it looks like is this:

- add a static std::map< > param_dict to the EVAL_BM_* classes
- add PARA_BASE, a base class for the PARAMETER<T> classes.
- have boost installed
- do some class-member-pointer mess

finally, for example bm_pulse.cc reads something like this:
/*--------------------------------------------------------------------------*/
map<string, PARA_BASE EVAL_BM_PULSE::*> EVAL_BM_PULSE::param_dict =
  boost::assign::map_list_of
    ("iv",    (PARA_BASE EVAL_BM_PULSE::*) &EVAL_BM_PULSE::_iv)
    [..]
    ("period",(PARA_BASE EVAL_BM_PULSE::*) &EVAL_BM_PULSE::_period);
/*--------------------------------------------------------------------------*/
void EVAL_BM_PULSE::set_param_by_name(string Name, string Value)
{
  if( PARA_BASE EVAL_BM_PULSE::* x = (param_dict[Name]) ) {
    PARA_BASE* p = &(this->*x);
    *p = Value;
  } else {
    throw Exception_No_Match(Name);
  }
}
/*--------------------------------------------------------------------------*/

so, PARA_BASE EVAL_BM_PULSE::* is somewhat the C++ type specifying an
offset to a member in a struct. these should imho be stored in a stack
allocated map.

do you agree, that this is better than linear search? any clues on how
to avoid the extra casts in the map initialization?

regards
felix

_______________________________________________
Gnucap-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnucap-devel

Reply via email to