ZealOS/src/Demo/ClassMeta.CC

85 lines
2.1 KiB
HolyC
Raw Normal View History

2020-02-15 20:01:48 +00:00
/*Demonstrates class meta data.
Basically, we make use of the compiler's
2020-03-01 01:59:50 +00:00
data about a class. We can add to the
2020-02-15 20:01:48 +00:00
compilers data arbitrary items, either string or
or int or F64 (if you typecast).
This stuff is not high performance.
Don't get carried away -- it might be slow.
*/
U0 RankOut(I64 i)
{
" %z", i, "Cadet\0Ensign\0Captain\0Admiral\0President\0";
2020-02-15 20:01:48 +00:00
}
class Test1Struct
{
I64 age print_str "%2d" default_val 38;
I64 color default_val RED; //Accepts expressions
I64 rank print_str "%1d" default_val 6/2 output_fun &RankOut;
2020-02-15 20:01:48 +00:00
};
class Test2Struct
{
I64 age print_str "%2d" default_val 38 percentile 54.20;
I64 rank print_str "%1d" default_val 5;
I64 serial_num print_str "%6d" default_val 123456;
2020-02-15 20:01:48 +00:00
};
U0 DumpStruct(U8 *_d, U8 *class_name=lastclass)
{//lastclass is keyword. See $LK,"::/Demo/LastClass.CC"$.
CHashClass *tmpc = HashFind(class_name, Fs->hash_table, HTT_CLASS);
U8 *print_str;
I64 *q, default_val;
U0 (*fp_output_fun)(I64 i);
F64 percentile;
if (!tmpc)
return;
CMemberList *ml;
ml = tmpc->member_list_and_root;
while (ml)
{
"%s:", ml->str;
2020-02-15 20:01:48 +00:00
//All our items are I64's. If you want, you can check
//the data type of the member variable. See $LK,"ClassRep",A="MN:ClassRep"$().
q = _d + ml->offset;
2020-02-15 20:01:48 +00:00
if (print_str = MemberMetaData("print_str", ml))
"" print_str, *q;
2020-02-15 20:01:48 +00:00
//This is slightly ambiguous -- if no meta is present it will return zero.
if (default_val = MemberMetaData("default_val", ml))
" default:%d", default_val;
2020-02-15 20:01:48 +00:00
//This corrects for the ambiguity, allowing zero percentile.
if (MemberMetaFind("percentile", ml))
{//check if it exists
//We could use the $LK,"CMemberListMeta",A="MN:CMemberListMeta"$ structure returned by
//$LK,"MemberMetaFind",A="MN:MemberMetaFind"$() and save a search.
percentile = MemberMetaData("percentile", ml)(F64);
" percentile: %5.2f", percentile;
}
2020-02-15 20:01:48 +00:00
if (fp_output_fun = MemberMetaData("output_fun", ml))
(*fp_output_fun)(*q);
'\n';
ml = ml->next;
}
2020-02-15 20:01:48 +00:00
}
Test1Struct t1;
t1.age = 44;
t1.rank = 3;
2020-02-15 20:01:48 +00:00
DumpStruct(&t1);
Test2Struct t2;
t2.age = 22;
t2.rank = 2;
t2.serial_num = 55555;
2020-02-15 20:01:48 +00:00
DumpStruct(&t2);