Ignore:
Timestamp:
Nov 15, 2011, 1:19:24 AM (8 years ago)
Author:
vla24
Message:

SymbolTable?: updated templates implementation to use BitBlockForwardIterator?. Fixed block boundary case handling for div2 grouping strategy.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/SymbolTable/dictionary_hash_template.cpp

    r1666 r1684  
    2020char * source;
    2121LineColTracker tracker;
    22 TagMatcher matcher;
    23 ErrorTracker error_tracker;
    2422BitBlock EOF_mask = simd<1>::constant<1>();
    2523
     
    3836static inline void s2p_do_final_block(BytePack U8[], Basis_bits & basis_bits, BitBlock EOF_mask);
    3937static inline void postprocess_do_block(Dictionary& dictionary);
     38static inline void validate_block(BitBlockForwardIterator & start, int block_base, int is_valid(int));
     39static inline void validate_block(BitBlockForwardIterator & start, int block_base, int is_valid(int,int));
     40
    4041static inline void do_symbol_table_lookup();
    4142
     
    104105}
    105106
    106 
    107 /* StreamScan & Post Process Definitions */
    108 static inline int StreamScan(ScanBlock * stream, int blk_count, int ProcessPos(int), int * error_pos_in_block) {
    109 
    110         int blk;
    111         int block_pos = 0;
    112         int pos;
    113 
    114         for (blk = 0; blk < blk_count; blk++) {
    115                 ScanBlock s = stream[blk];
    116                 while(s) {
    117                         pos = (cfzl(s) + block_pos);
    118                         int code = (ProcessPos(pos));
    119                         if (code) {
    120                                 *error_pos_in_block = pos;
    121                                 return code; // error code
    122                         }
    123                         s = s & (s-1);  // clear rightmost bit.
    124                 }
    125                 block_pos += 8 * sizeof(ScanBlock);
    126         }
     107static inline int ElemStrt_check(int pos) {
     108        elem_starts_buf.push(buffer_base + pos);
    127109        return 0;
    128110}
    129111
    130 static inline int ElemStrt_check(int pos) {
    131         int block_pos = block_base + pos;
    132         elem_starts_buf.push(buffer_base + block_pos);
    133         return 0;
    134 }
    135 
    136112static inline int ElemEnd_check(int pos) {
    137         int block_pos = block_base + pos;
    138         elem_ends_buf.push(buffer_base + block_pos);
    139         return 0;
     113        elem_ends_buf.push(buffer_base + pos);
     114        return 0;
    140115}
    141116
     
    165140}
    166141
     142static inline void validate_block(BitBlockForwardIterator & start, int block_base, int is_valid(int)) {
     143
     144        BitBlockForwardIterator end;
     145        int pos, block_pos;
     146
     147        while(start != end) {
     148
     149                block_pos = block_base + *start;
     150                int rv = is_valid(block_pos);
     151
     152                if (rv) {
     153                        int error_line, error_column;
     154                        tracker.get_Line_and_Column(block_pos, error_line, error_column);
     155                        ReportError(XMLTestSuiteError::get_msg(rv), error_line, error_column);
     156                        exit(-1);
     157                }
     158                start++;
     159        }
     160}
     161
     162static inline void validate_block(BitBlockForwardIterator & start, int block_base, int buffer_base, int is_valid(int,int)) {
     163
     164        BitBlockForwardIterator end;
     165        int pos, block_pos, file_pos;
     166
     167        while(start != end) {
     168
     169                block_pos = block_base + *start;
     170                file_pos = block_pos+buffer_base;
     171
     172
     173                int rv = is_valid(block_pos, file_pos);
     174
     175                if (rv) {
     176                        int error_line, error_column;
     177                        tracker.get_Line_and_Column(block_pos, error_line, error_column);
     178                        ReportError(XMLTestSuiteError::get_msg(rv), error_line, error_column);
     179                        exit(-1);
     180                }
     181                start++;
     182        }
     183}
     184
    167185static inline void postprocess_do_block(Dictionary& dictionary){
    168 
    169     int error_pos_in_block;
    170186
    171187    if ( bitblock_has_bit(dictionary.Word_starts))
    172188    {
    173         StreamScan((ScanBlock *) &dictionary.Word_starts, sizeof(BitBlock)/sizeof(ScanBlock), ElemStrt_check, &error_pos_in_block);
     189        BitBlockForwardIterator iter_length_grouping_starts(&dictionary.Word_starts);
     190        validate_block(iter_length_grouping_starts, block_base, ElemStrt_check);
    174191    }
    175192
    176193    if ( bitblock_has_bit(dictionary.Word_ends) )
    177194    {
    178         StreamScan((ScanBlock *) &dictionary.Word_ends, sizeof(BitBlock)/sizeof(ScanBlock), ElemEnd_check, &error_pos_in_block);
    179     }
    180 
     195        BitBlockForwardIterator iter_length_grouping_ends(&dictionary.Word_ends);
     196        validate_block(iter_length_grouping_ends, block_base, ElemEnd_check);
     197    }
    181198    do_symbol_table_lookup();
    182199}
Note: See TracChangeset for help on using the changeset viewer.