package core.io
+use package core
+
BinaryWriter :: struct {
stream: ^Stream;
}
stream_write_byte(stream, byte);
}
-binary_write_i16 :: (use bw: ^BinaryWriter, i: u16) {
- v := i;
- bytes := *cast(^[2] u8) ^v;
-
- stream_write(stream, ~~ bytes);
-}
-
-binary_write_i32 :: (use bw: ^BinaryWriter, i: u32) {
- v := i;
- bytes := *cast(^[4] u8) ^v;
-
- stream_write(stream, ~~ bytes);
-}
-
-binary_write_i64 :: (use bw: ^BinaryWriter, i: u64) {
- v := i;
- bytes := *cast(^[8] u8) ^v;
-
- stream_write(stream, ~~ bytes);
-}
-
-binary_write_f32 :: (use bw: ^BinaryWriter, f: f32) {
- v := f;
- bytes := *cast(^[4] u8) ^v;
-
- stream_write(stream, ~~ bytes);
-}
-
-binary_write_f64 :: (use bw: ^BinaryWriter, f: f64) {
- v := f;
- bytes := *cast(^[8] u8) ^v;
-
- stream_write(stream, ~~ bytes);
+binary_write :: (use bw: ^BinaryWriter, $T: type_expr, v: T) {
+ tmp_for_data := v;
+ stream_write(stream, <[] u8>.{ ~~ ^tmp_for_data, sizeof T });
}
binary_write_slice :: (use bw: ^BinaryWriter, sl: [] $T, output_size := false) {
- if output_size do binary_write_i32(bw, sl.count);
+ if output_size do binary_write(bw, i32, sl.count);
bytes := <[] u8>.{
data = cast(^u8) ^sl.data[0],
return byte;
}
-binary_read_i16 :: (use br: ^BinaryReader) -> u16 {
- buf: [2] u8;
+binary_read :: (use br: ^BinaryReader, $T: type_expr) -> T {
+ buf: [sizeof T] u8;
_, bytes_read := stream_read(stream, ~~ buf);
- return *(cast(^u16) buf);
-}
-
-binary_read_i32 :: (use br: ^BinaryReader) -> u32 {
- buf: [4] u8;
- _, bytes_read := stream_read(stream, ~~ buf);
-
- return *(cast(^u32) buf);
-}
-
-binary_read_i64 :: (use br: ^BinaryReader) -> u64 {
- buf: [8] u8;
- _, bytes_read := stream_read(stream, ~~ buf);
-
- return *(cast(^u64) buf);
-}
-
-binary_read_f32 :: (use br: ^BinaryReader) -> f32 {
- buf: [4] u8;
- _, bytes_read := stream_read(stream, ~~ buf);
-
- return *(cast(^f32) buf);
-}
-
-binary_read_f64 :: (use br: ^BinaryReader) -> f64 {
- buf: [8] u8;
- _, bytes_read := stream_read(stream, ~~ buf);
-
- return *(cast(^f64) buf);
+ return *(cast(^T) buf);
}
binary_read_slice :: (use br: ^BinaryReader,
size := 0, read_size := false,
allocator := context.allocator) -> [] T {
if size == 0 && read_size {
- size = binary_read_i32(br);
+ size = binary_read(br, i32);
}
- sl := memory.make_slice(u8, size * sizeof T);
+ sl := memory.make_slice(u8, size * sizeof T, allocator = allocator);
_, bytes_read := stream_read(stream, sl);
return <[] T>.{ data = cast(^T) sl.data, count = size };
}
-
-// This should be possible
-// binary_read :: (use br: ^BinaryReader, $T: type_expr) -> T {
-// buf: [sizeof T] u8;
-// _, bytes_read := stream_read(stream, ~~ buf);
-//
-// return *(cast(^T) buf);
-// }
\ No newline at end of file
if (types_are_compatible(node->type, type)) return 1;
if (node_is_auto_cast((AstNode *) node)) {
char* dummy;
- if (!cast_is_legal(((AstUnaryOp *) node)->expr->type, type, &dummy)) {
+ Type* from_type = ((AstUnaryOp *) node)->expr->type;
+ if (!from_type || !cast_is_legal(from_type, type, &dummy)) {
return 0;
} else {
return node->type;
}
+i64 get_expression_integer_value(AstTyped* node) {
+ resolve_expression_type(node);
+
+ if (node->kind == Ast_Kind_NumLit && type_is_integer(node->type)) {
+ return ((AstNumLit *) node)->value.l;
+ }
+
+ if (node->kind == Ast_Kind_Argument) {
+ return get_expression_integer_value(((AstArgument *) node)->value);
+ }
+
+ if (node->kind == Ast_Kind_Size_Of) {
+ return ((AstSizeOf *) node)->size;
+ }
+
+ if (node->kind == Ast_Kind_Align_Of) {
+ return ((AstAlignOf *) node)->alignment;
+ }
+
+ return 0;
+}
+
static const b32 cast_legality[][11] = {
/* I8 */ { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
/* U8 */ { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },