| summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/sequence/sequence.c')
| -rw-r--r-- | src/sequence/sequence.c | 138 |
1 files changed, 9 insertions, 129 deletions
diff --git a/src/sequence/sequence.c b/src/sequence/sequence.c index f3c3b46..78a5aad 100644 --- a/src/sequence/sequence.c +++ b/src/sequence/sequence.c @@ -5,74 +5,6 @@ #include "sequence.h" -/* - * Bypass rendundant ZoO_START_OF_SEQUENCE_ID at the start of a sequence. - */ -/*@ - requires - ( - \valid(sequence+ (0 .. sequence_length)) - || (sequence_length == 0) - ); - requires \separated(sequence, sequence_offset); - - assigns (*sequence_offset); - - ensures (*sequence_offset < sequence_length); - - ensures - ( - (*sequence_offset == 0) - || (sequence[0 .. *sequence_offset] == ZoO_START_OF_SEQUENCE_ID) - ); - - ensures - ( - (*sequence_offset == sequence_length) - || (sequence[*sequence_offset + 1] != ZoO_START_OF_SEQUENCE_ID) - ); - -@*/ -static void bypass_redundant_sos -( - const ZoO_index sequence [const restrict], - const size_t sequence_length, - size_t sequence_offset [const restrict static 1] -) -{ - ZoO_index i; - - *sequence_offset = 0; - - /*@ - loop invariant 0 <= i <= sequence_length; - loop invariant (*sequence_offset <= i); - loop invariant - ( - (*sequence_offset == 0) - || (sequence[*sequence_offset] == ZoO_START_OF_SEQUENCE_ID) - ); - loop invariant - ( - (i == 0) || (sequence[0 .. (i - 1)] == ZoO_START_OF_SEQUENCE_ID) - ); - loop assigns i, *sequence_offset; - loop variant (sequence_length - i); - @*/ - for (i = 0; i < sequence_length; ++i) - { - if (sequence[i] != ZoO_START_OF_SEQUENCE_ID) - { - return; - } - else if (sequence[i] == ZoO_START_OF_SEQUENCE_ID) - { - *sequence_offset = i; - } - } -} - - /* See "sequence.h" */ /*@ requires @@ -91,80 +23,28 @@ static void bypass_redundant_sos @*/ int ZoO_sequence_cmp ( - const ZoO_index sequence_a [const], - size_t sequence_a_length, - const ZoO_index sequence_b [const], - size_t sequence_b_length + const ZoO_index sequence_a [const restrict static 1], + const ZoO_index sequence_b [const restrict static 1], + const ZoO_index length ) { - size_t min_length, a, b; - size_t a_offset, b_offset; - size_t i; - /*@ ghost size_t actual_a_length, actual_b_length; @*/ - - bypass_redundant_sos(sequence_a, sequence_a_length, &a_offset); - bypass_redundant_sos(sequence_b, sequence_b_length, &b_offset); + ZoO_index i, a, b; - /*@ ghost actual_a_length = sequence_a_length; @*/ - /*@ ghost actual_b_length = sequence_b_length; @*/ - - /*@ assert (a_offset <= sequence_a_length); @*/ - sequence_a_length -= a_offset; - /*@ assert (b_offset <= sequence_b_length); @*/ - sequence_b_length -= b_offset; - - if (sequence_a_length < sequence_b_length) - { - min_length = sequence_a_length; - } - else + for (i = 0; i < length; ++i) { - min_length = sequence_b_length; - } - - /*@ assert (min_length <= sequence_a_length); @*/ - /*@ assert (min_length <= sequence_b_length); @*/ - - /*@ assert (min_length + a_offset <= actual_a_length); @*/ - /*@ assert (min_length + b_offset <= actual_b_length); @*/ - - /*@ - loop invariant 0 <= i <= min_length; - loop assigns i; - loop variant (min_length - i); - @*/ - for (i = 0; i < min_length; ++i) - { - /*@ assert ((i + a_offset) < actual_a_length); @*/ - a = sequence_a[i + a_offset]; - /*@ assert ((i + b_offset) < actual_b_length); @*/ - b = sequence_b[i + b_offset]; + a = sequence_a[i]; + b = sequence_b[i]; if (a < b) { return -1; } - else if (b > a) + else if (a > b) { return 1; } - else if ((a == ZoO_END_OF_SEQUENCE_ID) && (b == ZoO_END_OF_SEQUENCE_ID)) - { - return 0; - } } - if (sequence_a_length > sequence_b_length) - { - return 1; - } - else if (sequence_a_length < sequence_b_length) - { - return -1; - } - else - { - return 0; - } + return 0; } |


