From cbfbff7240d7ce649137cede82ccf07b78888179 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 23 May 2020 14:02:21 +0100 Subject: [PATCH] Add intrinsics.type_is_comparable; Add sort.linear_search --- core/intrinsics/intrinsics.odin | 1 + core/sort/sort.odin | 12 +++++++++++- src/check_expr.cpp | 2 ++ src/checker_builtin_procs.hpp | 2 ++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/intrinsics/intrinsics.odin b/core/intrinsics/intrinsics.odin index 06b0908b0..cb3df0c16 100644 --- a/core/intrinsics/intrinsics.odin +++ b/core/intrinsics/intrinsics.odin @@ -103,6 +103,7 @@ type_is_ordered :: proc($T: typeid) -> bool --- type_is_ordered_numeric :: proc($T: typeid) -> bool --- type_is_indexable :: proc($T: typeid) -> bool --- type_is_sliceable :: proc($T: typeid) -> bool --- +type_is_comparable :: proc($T: typeid) -> bool --- type_is_simple_compare :: proc($T: typeid) -> bool --- // easily compared using memcmp type_is_dereferenceable :: proc($T: typeid) -> bool --- type_is_valid_map_key :: proc($T: typeid) -> bool --- diff --git a/core/sort/sort.odin b/core/sort/sort.odin index a992fe04c..6bcbb1771 100644 --- a/core/sort/sort.odin +++ b/core/sort/sort.odin @@ -291,7 +291,6 @@ compare_strings :: proc(a, b: string) -> int { binary_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) where intrinsics.type_is_ordered(T) #no_bounds_check { - n := len(array); switch n { case 0: @@ -327,3 +326,14 @@ binary_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) } return -1, false; } + + +linear_search :: proc(array: $A/[]$T, key: T) -> (index: int, found: bool) + where intrinsics.type_is_comparable(T) #no_bounds_check { + for x, i in array { + if x == key { + return i, true; + } + } + return -1, false; +} diff --git a/src/check_expr.cpp b/src/check_expr.cpp index d2190d8cd..baedca6e5 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3755,6 +3755,7 @@ BuiltinTypeIsProc *builtin_type_is_procs[BuiltinProc__type_simple_boolean_end - is_type_ordered_numeric, is_type_indexable, is_type_sliceable, + is_type_comparable, is_type_simple_compare, is_type_dereferenceable, is_type_valid_for_keys, @@ -5568,6 +5569,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 case BuiltinProc_type_is_ordered_numeric: case BuiltinProc_type_is_indexable: case BuiltinProc_type_is_sliceable: + case BuiltinProc_type_is_comparable: case BuiltinProc_type_is_simple_compare: case BuiltinProc_type_is_dereferenceable: case BuiltinProc_type_is_valid_map_key: diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index 7ef1be8b8..074e287d1 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -138,6 +138,7 @@ BuiltinProc__type_simple_boolean_begin, BuiltinProc_type_is_ordered_numeric, BuiltinProc_type_is_indexable, BuiltinProc_type_is_sliceable, + BuiltinProc_type_is_comparable, BuiltinProc_type_is_simple_compare, // easily compared using memcmp BuiltinProc_type_is_dereferenceable, BuiltinProc_type_is_valid_map_key, @@ -315,6 +316,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("type_is_ordered_numeric"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_indexable"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_sliceable"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("type_is_comparable"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_simple_compare"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_dereferenceable"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT("type_is_valid_map_key"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},