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