00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef lestes__md__types__tm_data_type_base_g_hh__included
00010 #define lestes__md__types__tm_data_type_base_g_hh__included
00011
00012 #include <lestes/std/map.hh>
00013 #include <lestes/md/common.hh>
00014
00015 #include <lestes/std/objectize_macros.hh>
00016 package(lestes);
00017 package(std);
00018 class object;
00019 end_package(std);
00020 end_package(lestes);
00021
00022 package(lestes);
00023 package(lang);
00024 package(cplus);
00025 package(sem);
00026 class ss_declaration;
00027 end_package(sem);
00028 end_package(cplus);
00029 end_package(lang);
00030 end_package(lestes);
00031
00032 package(lestes);
00033 package(md);
00034 package(registers);
00035 class tm_register_base;
00036 end_package(registers);
00037 end_package(md);
00038 end_package(lestes);
00039
00040 package(lestes);
00041 package(md);
00042 package(types);
00043
00044
00045 class tm_data_type_base;
00046 class tm_dt_simple_base;
00047 class tm_dt_bitfield_base;
00048 class tm_dt_array_base;
00049 class tm_dt_union_base;
00050 class tm_dt_struct_base;
00051 class tm_dt_struct_member_base;
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 class tm_data_type_base : public ::lestes::std::object {
00066 public:
00067 typedef ulint id_type;
00068
00069
00070 enum kind_type {
00071 SIMPLE,
00072 BITFIELD,
00073 STRUCT,
00074 UNION,
00075 ARRAY
00076 };
00077
00078 enum format_type {
00079 FORMAT_PLAIN,
00080 FORMAT_C1,
00081 FORMAT_C2,
00082 FORMAT_OFF,
00083 FORMAT_SM,
00084 FORMAT_BCD,
00085 FORMAT_PBCD,
00086 FORMAT_IEEE
00087 };
00088
00089
00090 tm_data_type_base::id_type id_get() const;
00091
00092
00093 void id_set(tm_data_type_base::id_type);
00094
00095
00096 format_type format_get() const;
00097
00098
00099 void format_set(format_type);
00100
00101
00102 ulint bitwidth_get() const;
00103
00104
00105 void bitwidth_set(ulint);
00106
00107
00108 ulint alignment_get() const;
00109
00110
00111 void alignment_set(ulint);
00112
00113
00114 ptr< ::lestes::md::registers::tm_register_base > return_reg_get() const;
00115
00116
00117 void return_reg_set(const ptr< ::lestes::md::registers::tm_register_base > &);
00118
00119
00120 lstring asm_output_get() const;
00121
00122
00123 void asm_output_set(lstring);
00124
00125
00126 lstring asm_decl_get() const;
00127
00128
00129 void asm_decl_set(lstring);
00130
00131
00132 virtual tm_data_type_base::kind_type kind_get() abstract;
00133
00134
00135
00136
00137 virtual ptr<reflection_list> reflection_get() const;
00138
00139 virtual ptr<field_list_list> field_values_get() const;
00140
00141 protected:
00142
00143 tm_data_type_base (
00144 tm_data_type_base::id_type a__tm_data_type_base__id,
00145 format_type a__tm_data_type_base__format,
00146 ulint a__tm_data_type_base__bitwidth,
00147 ulint a__tm_data_type_base__alignment,
00148 ptr< ::lestes::md::registers::tm_register_base > a__tm_data_type_base__return_reg,
00149 lstring a__tm_data_type_base__asm_output,
00150 lstring a__tm_data_type_base__asm_decl);
00151
00152
00153 virtual void gc_mark();
00154
00155 private:
00156
00157
00158
00159
00160 tm_data_type_base::id_type id;
00161
00162 format_type format;
00163
00164 ulint bitwidth;
00165
00166 ulint alignment;
00167
00168 srp< ::lestes::md::registers::tm_register_base > return_reg;
00169
00170 lstring asm_output;
00171
00172 lstring asm_decl;
00173 static ptr<reflection_list> reflection;
00174
00175 };
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 class tm_dt_simple_base : public tm_data_type_base {
00186 public:
00187
00188 virtual tm_data_type_base::kind_type kind_get();
00189
00190
00191
00192
00193 virtual ptr<reflection_list> reflection_get() const;
00194
00195 virtual ptr<field_list_list> field_values_get() const;
00196
00197 protected:
00198
00199 tm_dt_simple_base (
00200 tm_data_type_base::id_type a__tm_data_type_base__id,
00201 format_type a__tm_data_type_base__format,
00202 ulint a__tm_data_type_base__bitwidth,
00203 ulint a__tm_data_type_base__alignment,
00204 ptr< ::lestes::md::registers::tm_register_base > a__tm_data_type_base__return_reg,
00205 lstring a__tm_data_type_base__asm_output,
00206 lstring a__tm_data_type_base__asm_decl);
00207
00208
00209 virtual void gc_mark();
00210
00211 private:
00212 static ptr<reflection_list> reflection;
00213
00214 };
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 class tm_dt_bitfield_base : public tm_dt_simple_base {
00228 public:
00229
00230 ulint bitfield_width_get() const;
00231
00232
00233 void bitfield_width_set(ulint);
00234
00235
00236 virtual tm_data_type_base::kind_type kind_get();
00237
00238
00239
00240
00241 virtual ptr<reflection_list> reflection_get() const;
00242
00243 virtual ptr<field_list_list> field_values_get() const;
00244
00245 protected:
00246
00247 tm_dt_bitfield_base (
00248 tm_data_type_base::id_type a__tm_data_type_base__id,
00249 format_type a__tm_data_type_base__format,
00250 ulint a__tm_data_type_base__bitwidth,
00251 ulint a__tm_data_type_base__alignment,
00252 ptr< ::lestes::md::registers::tm_register_base > a__tm_data_type_base__return_reg,
00253 lstring a__tm_data_type_base__asm_output,
00254 lstring a__tm_data_type_base__asm_decl,
00255 ulint a__tm_dt_bitfield_base__bitfield_width);
00256
00257
00258 virtual void gc_mark();
00259
00260 private:
00261
00262 ulint bitfield_width;
00263 static ptr<reflection_list> reflection;
00264
00265 };
00266
00267
00268
00269
00270
00271
00272 class tm_dt_array_base : public tm_data_type_base {
00273 public:
00274
00275 t_size bound_get() const;
00276
00277
00278 void bound_set(t_size);
00279
00280
00281 virtual tm_data_type_base::kind_type kind_get();
00282
00283
00284
00285
00286 virtual ptr<reflection_list> reflection_get() const;
00287
00288 virtual ptr<field_list_list> field_values_get() const;
00289
00290 protected:
00291
00292 tm_dt_array_base (
00293 tm_data_type_base::id_type a__tm_data_type_base__id,
00294 format_type a__tm_data_type_base__format,
00295 ulint a__tm_data_type_base__bitwidth,
00296 ulint a__tm_data_type_base__alignment,
00297 ptr< ::lestes::md::registers::tm_register_base > a__tm_data_type_base__return_reg,
00298 lstring a__tm_data_type_base__asm_output,
00299 lstring a__tm_data_type_base__asm_decl,
00300 t_size a__tm_dt_array_base__bound);
00301
00302
00303 virtual void gc_mark();
00304
00305 private:
00306
00307 t_size bound;
00308 static ptr<reflection_list> reflection;
00309
00310 };
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321 class tm_dt_union_base : public tm_data_type_base {
00322 public:
00323
00324 ptr< ::lestes::std::list< srp< tm_data_type_base > > > types_get() const;
00325
00326
00327 void types_set(const ptr< ::lestes::std::list< srp< tm_data_type_base > > > & );
00328
00329
00330 virtual tm_data_type_base::kind_type kind_get();
00331
00332
00333
00334
00335 virtual ptr<reflection_list> reflection_get() const;
00336
00337 virtual ptr<field_list_list> field_values_get() const;
00338
00339 protected:
00340
00341 tm_dt_union_base (
00342 tm_data_type_base::id_type a__tm_data_type_base__id,
00343 format_type a__tm_data_type_base__format,
00344 ulint a__tm_data_type_base__bitwidth,
00345 ulint a__tm_data_type_base__alignment,
00346 ptr< ::lestes::md::registers::tm_register_base > a__tm_data_type_base__return_reg,
00347 lstring a__tm_data_type_base__asm_output,
00348 lstring a__tm_data_type_base__asm_decl,
00349 ptr< ::lestes::std::list< srp< tm_data_type_base > > > a__tm_dt_union_base__types);
00350
00351
00352 virtual void gc_mark();
00353
00354 private:
00355
00356 srp< ::lestes::std::list< srp< tm_data_type_base > > > types;
00357 static ptr<reflection_list> reflection;
00358
00359 };
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 class tm_dt_struct_base : public tm_data_type_base {
00371 public:
00372
00373 ptr< ::lestes::std::list< srp< tm_dt_struct_member_base > > > members_get() const;
00374
00375
00376 void members_set(const ptr< ::lestes::std::list< srp< tm_dt_struct_member_base > > > & );
00377
00378
00379 virtual tm_data_type_base::kind_type kind_get();
00380
00381
00382
00383
00384 virtual ptr<reflection_list> reflection_get() const;
00385
00386 virtual ptr<field_list_list> field_values_get() const;
00387
00388 protected:
00389
00390 tm_dt_struct_base (
00391 tm_data_type_base::id_type a__tm_data_type_base__id,
00392 format_type a__tm_data_type_base__format,
00393 ulint a__tm_data_type_base__bitwidth,
00394 ulint a__tm_data_type_base__alignment,
00395 ptr< ::lestes::md::registers::tm_register_base > a__tm_data_type_base__return_reg,
00396 lstring a__tm_data_type_base__asm_output,
00397 lstring a__tm_data_type_base__asm_decl,
00398 ptr< ::lestes::std::list< srp< tm_dt_struct_member_base > > > a__tm_dt_struct_base__members);
00399
00400
00401 virtual void gc_mark();
00402
00403 private:
00404
00405 srp< ::lestes::std::list< srp< tm_dt_struct_member_base > > > members;
00406 static ptr<reflection_list> reflection;
00407
00408 };
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 class tm_dt_struct_member_base : public ::lestes::std::object {
00419 public:
00420
00421 ulint offset_get() const;
00422
00423
00424 void offset_set(ulint);
00425
00426
00427 ulint bitwidth_get() const;
00428
00429
00430 void bitwidth_set(ulint);
00431
00432
00433 ptr< tm_data_type_base > type_get() const;
00434
00435
00436 void type_set(const ptr< tm_data_type_base > &);
00437
00438
00439 ptr< ::lestes::lang::cplus::sem::ss_declaration > ss_decl_get() const;
00440
00441
00442 void ss_decl_set(const ptr< ::lestes::lang::cplus::sem::ss_declaration > &);
00443
00444
00445
00446
00447 virtual ptr<reflection_list> reflection_get() const;
00448
00449 virtual ptr<field_list_list> field_values_get() const;
00450
00451 protected:
00452
00453 tm_dt_struct_member_base (
00454 ulint a__tm_dt_struct_member_base__offset,
00455 ulint a__tm_dt_struct_member_base__bitwidth,
00456 ptr< tm_data_type_base > a__tm_dt_struct_member_base__type,
00457 ptr< ::lestes::lang::cplus::sem::ss_declaration > a__tm_dt_struct_member_base__ss_decl);
00458
00459
00460 virtual void gc_mark();
00461
00462 private:
00463
00464 ulint offset;
00465
00466 ulint bitwidth;
00467
00468 srp< tm_data_type_base > type;
00469
00470
00471
00472
00473 srp< ::lestes::lang::cplus::sem::ss_declaration > ss_decl;
00474 static ptr<reflection_list> reflection;
00475
00476 };
00477
00478
00479 end_package(types);
00480 end_package(md);
00481 end_package(lestes);
00482
00483 package(lestes);
00484 package(std);
00485 specialize_objectize_for_enum( ::lestes::md::types::tm_data_type_base::kind_type );
00486 specialize_objectize_for_enum( ::lestes::md::types::tm_data_type_base::format_type );
00487 end_package(std);
00488 end_package(lestes);
00489
00490 #endif // lestes__md__types__tm_data_type_base_g_hh__included