xref: /freebsd/stand/ficl/softwords/classes.fr (revision 26a58599a09a6181e0f5abe624021865a0c23186)
1*ca987d46SWarner Losh\ #if (FICL_WANT_OOP)
2*ca987d46SWarner Losh\ ** ficl/softwords/classes.fr
3*ca987d46SWarner Losh\ ** F I C L   2 . 0   C L A S S E S
4*ca987d46SWarner Losh\ john sadler  1 sep 98
5*ca987d46SWarner Losh\ Needs oop.fr
6*ca987d46SWarner Losh\
7*ca987d46SWarner Losh
8*ca987d46SWarner Loshalso oop definitions
9*ca987d46SWarner Losh
10*ca987d46SWarner Losh\ REF subclass holds a pointer to an object. It's
11*ca987d46SWarner Losh\ mainly for aggregation to help in making data structures.
12*ca987d46SWarner Losh\
13*ca987d46SWarner Loshobject subclass c-ref
14*ca987d46SWarner Losh    cell: .class
15*ca987d46SWarner Losh    cell: .instance
16*ca987d46SWarner Losh
17*ca987d46SWarner Losh	: get   ( inst class -- refinst refclass )
18*ca987d46SWarner Losh		drop 2@ ;
19*ca987d46SWarner Losh	: set   ( refinst refclass inst class -- )
20*ca987d46SWarner Losh		drop 2! ;
21*ca987d46SWarner Loshend-class
22*ca987d46SWarner Losh
23*ca987d46SWarner Loshobject subclass c-byte
24*ca987d46SWarner Losh	char: .payload
25*ca987d46SWarner Losh
26*ca987d46SWarner Losh	: get  drop c@ ;
27*ca987d46SWarner Losh	: set  drop c! ;
28*ca987d46SWarner Loshend-class
29*ca987d46SWarner Losh
30*ca987d46SWarner Loshobject subclass c-2byte
31*ca987d46SWarner Losh	2 chars: .payload
32*ca987d46SWarner Losh
33*ca987d46SWarner Losh	: get  drop w@ ;
34*ca987d46SWarner Losh	: set  drop w! ;
35*ca987d46SWarner Loshend-class
36*ca987d46SWarner Losh
37*ca987d46SWarner Loshobject subclass c-4byte
38*ca987d46SWarner Losh	4 chars: .payload
39*ca987d46SWarner Losh
40*ca987d46SWarner Losh	: get  drop q@ ;
41*ca987d46SWarner Losh	: set  drop q! ;
42*ca987d46SWarner Loshend-class
43*ca987d46SWarner Losh
44*ca987d46SWarner Losh
45*ca987d46SWarner Loshobject subclass c-cell
46*ca987d46SWarner Losh	cell: .payload
47*ca987d46SWarner Losh
48*ca987d46SWarner Losh	: get  drop @ ;
49*ca987d46SWarner Losh	: set  drop ! ;
50*ca987d46SWarner Loshend-class
51*ca987d46SWarner Losh
52*ca987d46SWarner Losh
53*ca987d46SWarner Losh\ ** C - P T R
54*ca987d46SWarner Losh\ Base class for pointers to scalars (not objects).
55*ca987d46SWarner Losh\ Note: use c-ref to make references to objects. C-ptr
56*ca987d46SWarner Losh\ subclasses refer to untyped quantities of various sizes.
57*ca987d46SWarner Losh
58*ca987d46SWarner Losh\ Derived classes must specify the size of the thing
59*ca987d46SWarner Losh\ they point to, and supply get and set methods.
60*ca987d46SWarner Losh
61*ca987d46SWarner Losh\ All derived classes must define the @size method:
62*ca987d46SWarner Losh\ @size ( inst class -- addr-units )
63*ca987d46SWarner Losh\ Returns the size in address units of the thing the pointer
64*ca987d46SWarner Losh\ refers to.
65*ca987d46SWarner Loshobject subclass c-ptr
66*ca987d46SWarner Losh    c-cell obj: .addr
67*ca987d46SWarner Losh
68*ca987d46SWarner Losh    \ get the value of the pointer
69*ca987d46SWarner Losh    : get-ptr   ( inst class -- addr )
70*ca987d46SWarner Losh        c-ptr  => .addr
71*ca987d46SWarner Losh        c-cell => get
72*ca987d46SWarner Losh    ;
73*ca987d46SWarner Losh
74*ca987d46SWarner Losh    \ set the pointer to address supplied
75*ca987d46SWarner Losh    : set-ptr   ( addr inst class -- )
76*ca987d46SWarner Losh        c-ptr  => .addr
77*ca987d46SWarner Losh        c-cell => set
78*ca987d46SWarner Losh    ;
79*ca987d46SWarner Losh
80*ca987d46SWarner Losh    \ force the pointer to be null
81*ca987d46SWarner Losh	: clr-ptr
82*ca987d46SWarner Losh	    0 -rot  c-ptr => .addr  c-cell => set
83*ca987d46SWarner Losh	;
84*ca987d46SWarner Losh
85*ca987d46SWarner Losh    \ return flag indicating null-ness
86*ca987d46SWarner Losh	: ?null     ( inst class -- flag )
87*ca987d46SWarner Losh	    c-ptr => get-ptr 0=
88*ca987d46SWarner Losh	;
89*ca987d46SWarner Losh
90*ca987d46SWarner Losh    \ increment the pointer in place
91*ca987d46SWarner Losh    : inc-ptr   ( inst class -- )
92*ca987d46SWarner Losh        2dup 2dup                   ( i c i c i c )
93*ca987d46SWarner Losh        c-ptr => get-ptr  -rot      ( i c addr i c )
94*ca987d46SWarner Losh        --> @size  +  -rot          ( addr' i c )
95*ca987d46SWarner Losh        c-ptr => set-ptr
96*ca987d46SWarner Losh    ;
97*ca987d46SWarner Losh
98*ca987d46SWarner Losh    \ decrement the pointer in place
99*ca987d46SWarner Losh    : dec-ptr    ( inst class -- )
100*ca987d46SWarner Losh        2dup 2dup                   ( i c i c i c )
101*ca987d46SWarner Losh        c-ptr => get-ptr  -rot      ( i c addr i c )
102*ca987d46SWarner Losh        --> @size  -  -rot          ( addr' i c )
103*ca987d46SWarner Losh        c-ptr => set-ptr
104*ca987d46SWarner Losh    ;
105*ca987d46SWarner Losh
106*ca987d46SWarner Losh    \ index the pointer in place
107*ca987d46SWarner Losh    : index-ptr   { index 2:this -- }
108*ca987d46SWarner Losh        this --> get-ptr              ( addr )
109*ca987d46SWarner Losh        this --> @size  index *  +    ( addr' )
110*ca987d46SWarner Losh        this --> set-ptr
111*ca987d46SWarner Losh    ;
112*ca987d46SWarner Losh
113*ca987d46SWarner Loshend-class
114*ca987d46SWarner Losh
115*ca987d46SWarner Losh
116*ca987d46SWarner Losh\ ** C - C E L L P T R
117*ca987d46SWarner Losh\ Models a pointer to cell (a 32 or 64 bit scalar).
118*ca987d46SWarner Loshc-ptr subclass c-cellPtr
119*ca987d46SWarner Losh    : @size   2drop  1 cells ;
120*ca987d46SWarner Losh    \ fetch and store through the pointer
121*ca987d46SWarner Losh	: get   ( inst class -- cell )
122*ca987d46SWarner Losh        c-ptr => get-ptr @
123*ca987d46SWarner Losh    ;
124*ca987d46SWarner Losh	: set   ( value inst class -- )
125*ca987d46SWarner Losh        c-ptr => get-ptr !
126*ca987d46SWarner Losh    ;
127*ca987d46SWarner Loshend-class
128*ca987d46SWarner Losh
129*ca987d46SWarner Losh
130*ca987d46SWarner Losh\ ** C - 4 B Y T E P T R
131*ca987d46SWarner Losh\ Models a pointer to a quadbyte scalar
132*ca987d46SWarner Loshc-ptr subclass c-4bytePtr
133*ca987d46SWarner Losh    : @size   2drop  4  ;
134*ca987d46SWarner Losh    \ fetch and store through the pointer
135*ca987d46SWarner Losh	: get   ( inst class -- value )
136*ca987d46SWarner Losh        c-ptr => get-ptr q@
137*ca987d46SWarner Losh    ;
138*ca987d46SWarner Losh	: set   ( value inst class -- )
139*ca987d46SWarner Losh        c-ptr => get-ptr q!
140*ca987d46SWarner Losh    ;
141*ca987d46SWarner Losh end-class
142*ca987d46SWarner Losh
143*ca987d46SWarner Losh\ ** C - 2 B Y T E P T R
144*ca987d46SWarner Losh\ Models a pointer to a 16 bit scalar
145*ca987d46SWarner Loshc-ptr subclass c-2bytePtr
146*ca987d46SWarner Losh    : @size   2drop  2  ;
147*ca987d46SWarner Losh    \ fetch and store through the pointer
148*ca987d46SWarner Losh	: get   ( inst class -- value )
149*ca987d46SWarner Losh        c-ptr => get-ptr w@
150*ca987d46SWarner Losh    ;
151*ca987d46SWarner Losh	: set   ( value inst class -- )
152*ca987d46SWarner Losh        c-ptr => get-ptr w!
153*ca987d46SWarner Losh    ;
154*ca987d46SWarner Loshend-class
155*ca987d46SWarner Losh
156*ca987d46SWarner Losh
157*ca987d46SWarner Losh\ ** C - B Y T E P T R
158*ca987d46SWarner Losh\ Models a pointer to an 8 bit scalar
159*ca987d46SWarner Loshc-ptr subclass c-bytePtr
160*ca987d46SWarner Losh    : @size   2drop  1  ;
161*ca987d46SWarner Losh    \ fetch and store through the pointer
162*ca987d46SWarner Losh	: get   ( inst class -- value )
163*ca987d46SWarner Losh        c-ptr => get-ptr c@
164*ca987d46SWarner Losh    ;
165*ca987d46SWarner Losh	: set   ( value inst class -- )
166*ca987d46SWarner Losh        c-ptr => get-ptr c!
167*ca987d46SWarner Losh    ;
168*ca987d46SWarner Loshend-class
169*ca987d46SWarner Losh
170*ca987d46SWarner Losh
171*ca987d46SWarner Loshprevious definitions
172*ca987d46SWarner Losh\ #endif
173