00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef TranslateCore_hpp
00025 #define TranslateCore_hpp 1
00026
00027 #include "UAP/UAPNode.hpp"
00028 #include "AML/Twig.hpp"
00029 #include "AML/AMLUtilities.hpp"
00030
00031
00032
00033
00034
00035
00036
00037
00038 struct attribute_convert_struct {
00039
00040 Str x_parent;
00041 Str x_name;
00042 Twig aml_twig;
00043 Str x_to_aml_template;
00044 Str aml_to_x_template;
00045 bool ignore_x_to_aml;
00046 bool ignore_aml_to_x;
00047 };
00048
00049 struct constants_struct {
00050 Str x_const;
00051 Str aml_const;
00052 Str x_to_aml_template;
00053 Str aml_to_x_template;
00054 bool ignore_x_to_aml;
00055 bool ignore_aml_to_x;
00056 };
00057
00058
00059
00060
00061
00062 struct bend_struct {
00063 Str l;
00064 Str g;
00065 Str rho;
00066 Str angle;
00067 Str e1;
00068 Str e2;
00069 bool complete;
00070
00071 bend_struct() : complete(false) {};
00072
00073 };
00074
00075 typedef std::vector<attribute_convert_struct> AttributeConvertVec;
00076 typedef std::vector<attribute_convert_struct>::iterator AttributeConvertVecIter;
00077
00078 typedef std::vector<constants_struct> ConstantsVec;
00079 typedef std::vector<constants_struct>::iterator ConstantsVecIter;
00080
00081 typedef std::map<Str, bend_struct> BendMap;
00082
00083
00084
00085 struct param_value_struct {
00086 Str x_value;
00087 Str aml_value;
00088 };
00089
00090 typedef std::vector<param_value_struct> ParamValueStructVec;
00091 typedef std::vector<param_value_struct>::iterator ParamValueStructVecIter ;
00092
00093
00094
00099 class TranslateCore {
00100
00101 public:
00102
00105 TranslateCore();
00106
00114 bool ModifyIncludedFileNames (UAPNode* root, const Str& replacement_suffix);
00115
00116
00125 virtual UAPNode* XFileToAMLRep (const Str& file_name, UAPNode* uap_root = NULL);
00126
00134 virtual UAPNode* XFileToXRep (const Str& file_name, UAPNode* uap_root = NULL);
00135
00148 virtual UAPNode* XRepToAMLRep (UAPNode* x_root, UAPNode* aml_root = NULL);
00149
00167 virtual UAPNode* AMLRepToXFile (UAPNode* aml_root,
00168 const Str& file_name = "", const Str& out_suffix = "", bool one_file = false);
00169
00184 virtual UAPNode* AMLRepToXRep (UAPNode* aml_root, UAPNode* x_root = NULL);
00185
00202 virtual UAPNode* XRepToXFile (UAPNode* x_root,
00203 const Str& file_name = "", const Str& out_suffix = "", bool one_file = false);
00204
00205 protected:
00206
00214 virtual bool custom_x_statement_to_x (StrList word_list, Str comment,
00215 UAPNode* x_rep_root);
00216
00217 virtual bool custom_x_add_attributes (StrList& word_list, Str ele_class,
00218 Str& attrib_name, UAPNode* x_ele_root);
00219
00220 virtual bool custom_x_node_to_aml (UAPNode* x_node, UAPNode* aml_root, UAPNode* aml_node);
00221
00222 virtual void custom2_x_element_attribute_to_aml (UAPNode* x_node, UAPNode* aml_node);
00223
00224 virtual void custom_aml_rep_to_x (UAPNode* lab, UAPNode* x_node);
00225
00226 virtual bool custom_aml_node_to_x (UAPNode* aml_ele, UAPNode* x_rep);
00227
00228 virtual bool custom_aml_element_attribute_to_x(UAPNode* aml_root, UAPNode* aml_ele,
00229 UAPNode* aml_attrib, UAPNode* x_ele);
00230
00231 virtual void custom2_aml_element_attribute_to_x (UAPNode* aml_ele, UAPNode* x_ele);
00232
00233 virtual bool custom_x_element_to_x_file (UAPNode* x_node, Str& comment,
00234 StreamStruct& x_out);
00235
00236 virtual void custom_x_ele_attributes_to_x_file (UAPNode* x_node,
00237 const Str& ele_class, StreamStruct& x_out);
00238
00239 virtual bool custom_x_element_attribute_to_aml (UAPNode* x_node, Str x_class,
00240 UAPAttribute ia, UAPNode* aml_node);
00241
00242 virtual bool custom_aml_sector_or_element_to_x (UAPNode* aml_sector,
00243 UAPNode* x_root);
00244
00245 virtual void custom_x_attrib_to_x_file_translate (Str& attrib_name, Str& attrib_value);
00246
00247 Str continuation_char;
00248 Str language;
00249 bool c_style_format;
00250 bool abbreviations_permitted;
00251 bool knl_tn_style_multipoles;
00252
00253 static const int N_MULTIPOLE = 21;
00254
00255 enum CaseConvert {TO_LOWER, NO_CONVERT, TO_UPPER};
00256
00257 StrMap x_class_to_aml_map;
00258
00259
00260
00261 StrMap name_to_x_class_map;
00262
00263
00264
00265
00266 StrMap name_to_x_type_map;
00267
00268
00269
00270
00271 StrMap name_to_aml_type_map;
00272
00273
00274
00275 StrMap aml_k_map, aml_ks_map, aml_tilt_map;
00276
00277
00278
00279 StrVecMap aml_multi_kl_map, aml_multi_ksl_map, aml_multi_tilt_map;
00280
00281
00282
00283 BendMap bend_map;
00284
00285
00286
00287 StrVec aml_ignore_these_attribs;
00288 StrVec aml_class_names;
00289 StrVec x_param_names;
00290 StrVec aml_param_names;
00291 StrVec line_or_list_names;
00292 StrVec x_attribs_that_can_have_default;
00293 StrVec x_attributes_needing_quote_marks;
00294 StrVec x_attributes_to_upper_case;
00295 StrVec x_attributes_no_case_change;
00296 Str use_line;
00297
00298 NodeMap name_to_aml_node_map;
00299 NodeMap name_to_x_node_map;
00300
00301 NodeVec aml_set_nodes;
00302 NodeVec x_set_nodes;
00303
00304 UAPNode* use_parent;
00305 UAPNode* aml_lab_root;
00306
00307 PrintInfoStruct info_out;
00308
00309 EndStruct fini;
00310 bool in_sequence;
00311 UAPNode* seq_node;
00312
00313 AttributeConvertVec attribute_list;
00314 ParamValueStructVec param_values_list;
00315 ConstantsVec constants_list;
00316
00317 StrVecMap map_element_to_attribs;
00318
00319 Str include_file_string;
00320
00321
00322
00323 void x_file_to_x (UAPNode* input_node, Str file_name,
00324 FileStackList this_file_stack);
00325 void add_word_to_list (Str& word, StrList& word_list);
00326 void x_statement_to_x (StrList& word_list, Str comment,
00327 UAPNode* x_rep_root, char& string_delim,
00328 bool& close_file, int ix_line, FileStackList this_file_stack);
00329 Str next_word (StrList& word_list, CaseConvert this_case = TO_LOWER);
00330 bool valid_attribute (const Str& ele_class, Str& name);
00331 bool valid_variable (const Str& var);
00332
00333 bool parse_this_line_or_list (StrList& word_list, UAPNode* seq_root);
00334 bool parse_this_line_or_list_element (StrList& word_list, UAPNode* seq_root);
00335 bool get_args (StrList& word_list, Str& args);
00336 void x_add_attributes (StrList& word_list, Str ele_class, UAPNode* x_ele_root);
00337 bool x_attribute_can_have_default (Str attrib_name);
00338 Str named_x_class (const Str& name);
00339 Str ele_name_to_x_class (const Str& name, bool include_param_names = false);
00340 Str concat_value_expression (StrList& word_list, CaseConvert this_case, Str& value);
00341 CaseConvert x_attribute_case(const Str& attrib_name);
00342
00343
00344
00345 void x_rep_to_aml_init (UAPNode* x_rep);
00346 void x_rep_make_name_lists (UAPNode* x_rep);
00347 void x_rep_to_aml (UAPNode* x_rep_root, UAPNode* lab);
00348 void x_node_to_aml (UAPNode* x_ele, UAPNode* aml_root, UAPNode* aml_node,
00349 const Str& ignore_this1 = "", const Str& ignore_this2 = "");
00350 bool x_to_aml_sector (UAPNode* x_line, UAPNode* aml_sector, StrList& arg_list);
00351 Str x_expression_to_aml (const Str& x_expression,
00352 attribute_convert_struct attrib_info = attribute_convert_struct(), const Str& ele_name = "");
00353 void x_param_to_aml (UAPNode* x_param_node, UAPNode* aml_root);
00354 void x_element_attributes_to_aml (UAPNode* x_node, UAPNode* aml_root, UAPNode* aml_node,
00355 const Str& ignore_this1 = "", const Str& ignore_this2 = "");
00356 bool found_x_attrib (const Str& x_class, const Str& x_attrib,
00357 attribute_convert_struct& at);
00358 Str x_node_to_x_class (UAPNode* x_ele);
00359
00360
00361
00362 void aml_rep_to_x_init (UAPNode* x_rep);
00363 void aml_rep_make_name_lists (UAPNode* aml_rep);
00364 void aml_rep_to_x (UAPNode* lab, UAPNode* x_node);
00365 void aml_node_to_x (UAPNode* aml_ele, UAPNode* x_root, const Str& ignore_this_attribute = "");
00366 void aml_sector_or_element_to_x (UAPNode* aml_sector, UAPNode* x_root);
00367 void aml_element_attributes_to_x (UAPNode* aml_root, UAPNode* aml_ele, UAPNode* x_ele,
00368 const Str& ignore_this_attribute = "");
00369 void aml_param_to_x (UAPNode* aml_root, UAPNode* aml_param, UAPNode* x_rep);
00370 Str aml_expression_to_x (const Str& expression,
00371 attribute_convert_struct attrib_info = attribute_convert_struct(), const Str& ele_name = "");
00372 bool found_aml_attrib (const Str& x_class, UAPNode* aml_root,
00373 UAPNode* aml_attrib_node, const Str& design_name, attribute_convert_struct& at);
00374 bool found_aml_attrib (const Str& x_class, const Str& aml_attrib, attribute_convert_struct& attrib_info);
00375
00376
00377
00378 bool x_rep_to_x_file (UAPNode* x_rep, const Str& file_name,
00379 bool one_file, StreamStruct& x_out, FileStackList file_stack);
00380 void write_line_or_list_to_x_file(UAPNode* line_node, Str separator_str, StreamStruct& x_out);
00381 void x_add_quote_marks (const Str& name, Str& value);
00382 Str add_comment_token (const Str& str);
00383 void include_filename_replace_suffix (UAPNode* node,
00384 const Str& out_suffix, const Twig& info);
00385
00386
00387
00388 void register_attribute (Str x, Str aml, Str x_to_aml_template = "", Str aml_to_x_template = "",
00389 bool ignore_x_to_aml = false, bool ignore_aml_to_x = false);
00390 void register_constant (const Str& x, const Str& aml,
00391 const Str& x_to_aml_template = "", const Str& aml_to_x_template = "",
00392 bool ignore_x_to_aml = false, bool ignore_aml_to_x = false);
00393 void register_param_value_conversion (const Str& x, const Str& aml);
00394
00395
00396
00397 bool modify_file_names (const Str& node_name,
00398 const Str& attrib_name, UAPNode* root, const Str& replace_str);
00399 bool transfer_attribute(UAPNode* ele_in, const Str& attrib_in,
00400 UAPNode* ele_out, const Str& attrib_out);
00401 Str convert_single_attribute (Str expression, Str forward_template = "",
00402 Str back_template = "", Str ele_name = "");
00403 Str next_token_in_expression (Str expression, bool c_style, size_t& i0, size_t& n);
00404 void init_lists_core();
00405 void init_lists_mad();
00406
00412 virtual bool aml_ele_to_x_class (UAPNode* aml_ele, Str& x_class);
00413
00424 void multipole_to_k_tilt (Str k_in, Str ks_in, Str tilt_in,
00425 Str n, Str& k, Str& tilt);
00426
00437 void multipole_to_k_ks (Str k_in, Str ks_in, Str tilt_in,
00438 Str n, Str& k, Str& ks);
00439
00440
00508 void required_multipole_transfer (const Str& odd_man_out, const Str& k_base,
00509 const Str& ks_base, const Str& tilt_base, Str& k_ele, Str& ks_ele, Str& tilt_ele);
00510
00511 private:
00512
00513 AMLUtilities AU;
00514
00515
00516 };
00517
00518 #endif