{ getter callable }
{ setter callable }
{ size integer }
+{ signed boolean }
{ align integer }
{ align-first integer } ;
M: c-type c-type-setter setter>> ;
+GENERIC: c-type-signed ( name -- boolean ) foldable
+
+M: abstract-c-type c-type-signed signed>> ;
+
GENERIC: c-type-align ( name -- n ) foldable
M: abstract-c-type c-type-align align>> ;
c-type-getter
c-type-copier
c-type-setter
+ c-type-signed
c-type-align
c-type-align-first
base-type
[ alien-signed-2 ] >>getter
[ set-alien-signed-2 ] >>setter
2 >>size
+ t >>signed
2 >>align
2 >>align-first
"from_signed_2" >>boxer
[ alien-signed-1 ] >>getter
[ set-alien-signed-1 ] >>setter
1 >>size
+ t >>signed
1 >>align
1 >>align-first
"from_signed_1" >>boxer
[ alien-signed-4 ] >>getter
[ set-alien-signed-4 ] >>setter
4 >>size
+ t >>signed
4 >>align
4 >>align-first
"from_signed_4" >>boxer
[ alien-signed-cell ] >>getter
[ set-alien-signed-cell ] >>setter
8 >>size
+ t >>signed
8 >>align
8 >>align-first
"from_signed_cell" >>boxer
[ alien-signed-cell ] >>getter
[ set-alien-signed-cell ] >>setter
4 >>size
+ t >>signed
4 >>align
4 >>align-first
"from_signed_cell" >>boxer
[ alien-signed-8 ] >>getter
[ set-alien-signed-8 ] >>setter
8 >>size
+ t >>signed
8-byte-alignment
"from_signed_8" >>boxer
"to_signed_8" >>unboxer
: c-type-interval ( c-type -- from to )
{
{ [ dup { float double } member-eq? ] [ drop -1/0. 1/0. ] }
- { [ dup { char short int long longlong } member-eq? ] [ signed-interval ] }
- { [ dup { uchar ushort uint ulong ulonglong } member-eq? ] [ unsigned-interval ] }
+ { [ dup c-type-signed ] [ signed-interval ] }
+ { [ dup c-type-signed not ] [ unsigned-interval ] }
} cond ; foldable
: c-type-clamp ( value c-type -- value' )