Corrected default alignment on temp alloc. Added str_index_of. Added simple getline. Added a simple calculator. Allow [1..] to create a zero length slice. Added some initial macro contracts. Fix accessing enum functions. Support for @checked. Bump to 0.3.4

This commit is contained in:
Christoffer Lerno
2022-08-05 00:42:22 +02:00
parent 046469843c
commit 398e19d727
15 changed files with 129 additions and 35 deletions

View File

@@ -4,7 +4,7 @@
module std::core::builtin;
/**
* @require is_comparable_value(a) && is_comparable_value(b)
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
**/
macro less(a, b) @builtin
{
@@ -18,7 +18,7 @@ macro less(a, b) @builtin
}
/**
* @require is_comparable_value(a) && is_comparable_value(b)
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
**/
macro less_eq(a, b) @builtin
{
@@ -32,7 +32,7 @@ macro less_eq(a, b) @builtin
}
/**
* @require is_comparable_value(a) && is_comparable_value(b)
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
**/
macro greater(a, b) @builtin
{
@@ -46,7 +46,7 @@ macro greater(a, b) @builtin
}
/**
* @require is_comparable_value(a) && is_comparable_value(b)
* @require types::is_comparable_value(a) && types::is_comparable_value(b)
**/
macro greater_eq(a, b) @builtin
{
@@ -60,7 +60,7 @@ macro greater_eq(a, b) @builtin
}
/**
* @require is_equatable_value(a) && is_equatable_value(b) `values must be equatable`
* @require types::is_equatable_value(a) && types::is_equatable_value(b) `values must be equatable`
**/
macro bool equals(a, b) @builtin
{

View File

@@ -166,17 +166,17 @@ macro talloc($Type) @builtin
return temp_allocator().alloc_aligned($Type.sizeof, $alignof($Type))!!;
}
fn void* tmalloc(usize size, usize alignment = 0) @builtin @inline
fn void* tmalloc(usize size, usize alignment = allocator::DEFAULT_MEM_ALIGNMENT) @builtin @inline
{
return temp_allocator().alloc_aligned(size, alignment)!!;
}
fn void* tcalloc(usize size, usize alignment = 0) @builtin @inline
fn void* tcalloc(usize size, usize alignment = allocator::DEFAULT_MEM_ALIGNMENT) @builtin @inline
{
return temp_allocator().calloc_aligned(size, alignment)!!;
}
fn void* trealloc(void* ptr, usize size, usize alignment = 0) @builtin @inline
fn void* trealloc(void* ptr, usize size, usize alignment = allocator::DEFAULT_MEM_ALIGNMENT) @builtin @inline
{
return temp_allocator().realloc_aligned(ptr, size, alignment)!!;
}

View File

@@ -29,6 +29,32 @@ fn String join(char[][] s, char[] joiner)
return res;
}
fn usize! str_index_of(char[] s, char[] needle)
{
usize match = 0;
usize needed = needle.len;
if (!needed) return SearchResult.MISSING!;
usize index_start = 0;
char search = needle[0];
foreach (usize i, char c : s)
{
if (c == search)
{
if (!match) index_start = i;
match++;
if (match == needed) return i;
search = needle[match];
continue;
}
if (match)
{
match = 0;
search = needle[0];
}
}
return SearchResult.MISSING!;
}
fn ZString copy_zstring(char[] s)
{
usize len = s.len;

View File

@@ -8,7 +8,7 @@ fault ConversionResult
VALUE_OUT_OF_UNSIGNED_RANGE,
}
/**
* @require type.kind == SIGNED_INT || type.kind == UNSIGNED_INT || type.kind == ENUM, "Argument was not an integer"
* @require $Type.kind.is_int() || $Type.kind == TypeKind.ENUM "Argument was not an integer"
**/
macro variant_to_int(variant v, $Type)
{

View File

@@ -169,6 +169,22 @@ fn usize! File.println(File* file, char[] string)
return len + 1;
}
/**
* @param [&in] file
* @require file.file `File must be initialized`
*/
fn String File.getline(File* file, Allocator* allocator = mem::current_allocator())
{
String s = string::new_with_capacity(120, allocator);
while (!file.eof())
{
int c = libc::fgetc(file.file);
if (c == '\n') break;
s.append_char((char)c);
}
return s;
}
/**
* @param [&in] file
* @require file.file `File must be initialized`

View File

@@ -186,6 +186,7 @@ extern fn int putchar(int c);
extern fn int puts(char* str);
extern fn int ungetc(int c, CFile stream);
extern fn void perror(char* str);
extern fn isize getline(char** linep, usize* linecapp, CFile stream);
// vsprintf vprintf not supported