cgen: optimize generated array.index(elem)
parent
4af4f2b5a5
commit
63638fd271
|
@ -568,6 +568,7 @@ pub fn (mut a []int) sort() {
|
||||||
|
|
||||||
// index returns the first index at which a given element can be found in the array
|
// index returns the first index at which a given element can be found in the array
|
||||||
// or -1 if the value is not found.
|
// or -1 if the value is not found.
|
||||||
|
[direct_array_access]
|
||||||
pub fn (a []string) index(v string) int {
|
pub fn (a []string) index(v string) int {
|
||||||
for i in 0 .. a.len {
|
for i in 0 .. a.len {
|
||||||
if a[i] == v {
|
if a[i] == v {
|
||||||
|
|
|
@ -536,22 +536,23 @@ fn (mut g Gen) gen_array_index_method(left_type ast.Type) string {
|
||||||
g.type_definitions.writeln('static int ${fn_name}($left_type_str a, $elem_type_str v); // auto')
|
g.type_definitions.writeln('static int ${fn_name}($left_type_str a, $elem_type_str v); // auto')
|
||||||
mut fn_builder := strings.new_builder(512)
|
mut fn_builder := strings.new_builder(512)
|
||||||
fn_builder.writeln('static int ${fn_name}($left_type_str a, $elem_type_str v) {')
|
fn_builder.writeln('static int ${fn_name}($left_type_str a, $elem_type_str v) {')
|
||||||
fn_builder.writeln('\tfor (int i = 0; i < a.len; ++i) {')
|
fn_builder.writeln('\t$elem_type_str* pelem = a.data;')
|
||||||
|
fn_builder.writeln('\tfor (int i = 0; i < a.len; ++i, ++pelem) {')
|
||||||
if elem_sym.kind == .string {
|
if elem_sym.kind == .string {
|
||||||
fn_builder.writeln('\t\tif (fast_string_eq(((string*)a.data)[i], v)) {')
|
fn_builder.writeln('\t\tif (fast_string_eq(( *pelem, v))) {')
|
||||||
} else if elem_sym.kind == .array && !info.elem_type.is_ptr() {
|
} else if elem_sym.kind == .array && !info.elem_type.is_ptr() {
|
||||||
ptr_typ := g.gen_array_equality_fn(info.elem_type)
|
ptr_typ := g.gen_array_equality_fn(info.elem_type)
|
||||||
fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq((($elem_type_str*)a.data)[i], v)) {')
|
fn_builder.writeln('\t\tif (${ptr_typ}_arr_eq( *pelem, v)) {')
|
||||||
} else if elem_sym.kind == .function && !info.elem_type.is_ptr() {
|
} else if elem_sym.kind == .function && !info.elem_type.is_ptr() {
|
||||||
fn_builder.writeln('\t\tif (((voidptr*)a.data)[i] == v) {')
|
fn_builder.writeln('\t\tif ( pelem == v) {')
|
||||||
} else if elem_sym.kind == .map && !info.elem_type.is_ptr() {
|
} else if elem_sym.kind == .map && !info.elem_type.is_ptr() {
|
||||||
ptr_typ := g.gen_map_equality_fn(info.elem_type)
|
ptr_typ := g.gen_map_equality_fn(info.elem_type)
|
||||||
fn_builder.writeln('\t\tif (${ptr_typ}_map_eq((($elem_type_str*)a.data)[i], v)) {')
|
fn_builder.writeln('\t\tif (${ptr_typ}_map_eq(( *pelem, v))) {')
|
||||||
} else if elem_sym.kind == .struct_ && !info.elem_type.is_ptr() {
|
} else if elem_sym.kind == .struct_ && !info.elem_type.is_ptr() {
|
||||||
ptr_typ := g.gen_struct_equality_fn(info.elem_type)
|
ptr_typ := g.gen_struct_equality_fn(info.elem_type)
|
||||||
fn_builder.writeln('\t\tif (${ptr_typ}_struct_eq((($elem_type_str*)a.data)[i], v)) {')
|
fn_builder.writeln('\t\tif (${ptr_typ}_struct_eq( *pelem, v)) {')
|
||||||
} else {
|
} else {
|
||||||
fn_builder.writeln('\t\tif ((($elem_type_str*)a.data)[i] == v) {')
|
fn_builder.writeln('\t\tif (*pelem == v) {')
|
||||||
}
|
}
|
||||||
fn_builder.writeln('\t\t\treturn i;')
|
fn_builder.writeln('\t\t\treturn i;')
|
||||||
fn_builder.writeln('\t\t}')
|
fn_builder.writeln('\t\t}')
|
||||||
|
|
Loading…
Reference in New Issue