comparison string.rhope @ 104:2d2da148d844

Performance improvement for string comparisons
author Mike Pavone <pavone@retrodev.com>
date Wed, 25 Aug 2010 03:19:57 +0000
parents f51c4c17457c
children 439db471f595 a7add4db4a25
comparison
equal deleted inserted replaced
103:7428aa5d6ade 104:2d2da148d844
458 458
459 _=String[left,right,index:out] 459 _=String[left,right,index:out]
460 { 460 {
461 [left]Byte[index] 461 [left]Byte[index]
462 { 462 {
463 rbyte <- [right]Byte[index] {} 463 rbyte <- [right]Byte[index]
464 { 464 ,out <- If[[~]=[rbyte]]
465 Print[["Could not fetch byte from right string at offset:"]Append[String[index]]] 465 {
466 { Print[["Right string has type ID: "]Append[ String[ID[Blueprint Of[right]]] ]] 466 out <- _=String[left,right,[index]+[1]]
467 { Print[[right]Byte Length] 467 }
468 { Print[[right]Length] 468 }{
469 { Print[["Left string has type ID: "]Append[ String[ID[Blueprint Of[left]]] ]] 469 out <- Yes
470 { Print[[left]Byte Length] 470 }
471 { Print[[left]Length] }}}}}} 471 }
472
473 Eq String[left,right:out]
474 {
475 ,out <- If[[[left]Length] = [[right]Length]]
476 {
477 out <- _=String[left,right,0]
478 }
479 }
480
481 Foreign C:libc
482 {
483 memcmp[a(Array,Raw Pointer),b(Array,Raw Pointer),len(Int64,Naked):out(Int32,Naked)]
484 }
485
486 Foreign C:runtime
487 {
488 _internal_memcmp_offset[left(Array,Raw Pointer),loffset(Int32,Naked),right(Array,Raw Pointer),roffset(Int32,Naked),len(Int32,Naked):out(Int32,Naked)]
489 }
490
491 _Flat=@String[left,right:out]
492 {
493 ,out <- If[[[left]Byte Length] = [[right]Byte Length]]
494 {
495 If[memcmp[[left]Buffer >>, [right]Buffer >>, Int64[[left]Byte Length]]]
496 {
472 out <- No 497 out <- No
473 } 498 }{
474 ,out <- If[[~]=[rbyte]] 499 out <- Yes
475 { 500 }
476 out <- _=String[left,right,[index]+[1]] 501 }
477 } 502 }
478 }{ 503
479 out <- Yes 504 _Flat=@String Slice[left,right:out]
480 } 505 {
481 } 506 ,out <- If[[[left]Byte Length] = [[right]Byte Length]]
482 507 {
483 Eq String[left,right:out] 508 If[_internal_memcmp_offset[[[left]Source >>]Buffer >>, [left]Offset >>, [right]Buffer >>, 0i32, [left]Byte Length]]
484 { 509 {
485 ,out <- If[[[left]Length] = [[right]Length]] 510 out <- No
486 { 511 }{
487 out <- _=String[left,right,0] 512 out <- Yes
488 } 513 }
514 }
515 }
516
517 _Flat=@String Cat[left,right:out]
518 {
519 out <- Eq String[left,right]
489 } 520 }
490 521
491 =@String[left,right:out] 522 =@String[left,right:out]
492 { 523 {
493 out <- Eq String[left,right] 524 out <- [right]_Flat=[left]
494 } 525 }
495 526
496 Byte Length@String[string:out] 527 Byte Length@String[string:out]
497 { 528 {
498 out <- [[string]Buffer >>]Length 529 out <- [[string]Buffer >>]Length
532 Length@String Slice[string:out] 563 Length@String Slice[string:out]
533 { 564 {
534 out <- [string]Length >> 565 out <- [string]Length >>
535 } 566 }
536 567
568 _Slice=@String Slice[left,right:out]
569 {
570 ,out <- If[[[left]Byte Length]=[[right]Byte Length]]
571 {
572 If[_internal_memcmp_offset[[[left]Source >>]Buffer >>, [left]Offset >>, [[right]Source >>]Buffer >>, [right]Offset >>, [left]Byte Length]]
573 { out <- No }
574 { out <- Yes }
575 }
576 }
577
578 _Slice=@String[left,right:out]
579 {
580 out <- [right]_Flat=[left]
581 }
582
583 _Slice=@String Cat[left,right:out]
584 {
585 out <- Eq String[left,right]
586 }
587
537 =@String Slice[left,right:out] 588 =@String Slice[left,right:out]
538 { 589 {
539 out <- Eq String[left,right] 590 out <- [right]_Slice=[left]
540 } 591 }
541 592
542 _Flatten@String[string,dest,offset,count:out] 593 _Flatten@String[string,dest,offset,count:out]
543 { 594 {
544 If[count] 595 If[count]