Mercurial > repos > rhope
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] |