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_stl_template.cpp

    r1666 r1684  
    2020char * source;
    2121BitBlock EOF_mask = simd<1>::constant<1>();
     22LineColTracker tracker;
    2223
    2324queue <size_t> elem_starts_buf;
     
    2526vector <int> gids;
    2627SymbolTable symbol_table;
    27 
    28 /* StreamScan & Post Process Declarations */
    29 //      static inline int StreamScanToFirst(ScanBlock * stream, int blk_count, int ProcessPos(int), int * error_pos_in_block)
    30 static inline int StreamScan(ScanBlock * stream, int blk_count, int ProcessPos(int), int * error_pos_in_block);
    3128
    3229@global
     
    10198}
    10299
    103 
    104 /* StreamScan & Post Process Definitions */
    105 static inline int StreamScan(ScanBlock * stream, int blk_count, int ProcessPos(int), int * error_pos_in_block) {
    106 
    107         int blk;
    108         int block_pos = 0;
    109         int pos;
    110 
    111         for (blk = 0; blk < blk_count; blk++) {
    112                 ScanBlock s = stream[blk];
    113                 while(s) {
    114                         pos = (cfzl(s) + block_pos);
    115                         int code = (ProcessPos(pos));
    116                         if (code) {
    117                                 *error_pos_in_block = pos;
    118                                 return code; // error code
    119                         }
    120                         s = s & (s-1);  // clear rightmost bit.
    121                 }
    122                 block_pos += 8 * sizeof(ScanBlock);
    123         }
    124         return 0;
    125 }
    126 
    127100static inline int ElemStrt_check(int pos) {
    128         int block_pos = block_base + pos;
    129         elem_starts_buf.push(buffer_base + block_pos);
     101        elem_starts_buf.push(buffer_base + pos);
    130102        return 0;
    131103}
    132104
    133105static inline int ElemEnd_check(int pos) {
    134         int block_pos = block_base + pos;
    135         elem_ends_buf.push(buffer_base + block_pos);
     106        elem_ends_buf.push(buffer_base + pos);
    136107        return 0;
    137108}
     
    162133}
    163134
     135static inline void validate_block(BitBlockForwardIterator & start, int block_base, int is_valid(int)) {
     136
     137        BitBlockForwardIterator end;
     138        int pos, block_pos;
     139
     140        while(start != end) {
     141
     142                block_pos = block_base + *start;
     143                int rv = is_valid(block_pos);
     144
     145                if (rv) {
     146                        int error_line, error_column;
     147                        tracker.get_Line_and_Column(block_pos, error_line, error_column);
     148                        ReportError(XMLTestSuiteError::get_msg(rv), error_line, error_column);
     149                        exit(-1);
     150                }
     151                start++;
     152        }
     153}
     154
     155static inline void validate_block(BitBlockForwardIterator & start, int block_base, int buffer_base, int is_valid(int,int)) {
     156
     157        BitBlockForwardIterator end;
     158        int pos, block_pos, file_pos;
     159
     160        while(start != end) {
     161
     162                block_pos = block_base + *start;
     163                file_pos = block_pos+buffer_base;
     164
     165
     166                int rv = is_valid(block_pos, file_pos);
     167
     168                if (rv) {
     169                        int error_line, error_column;
     170                        tracker.get_Line_and_Column(block_pos, error_line, error_column);
     171                        ReportError(XMLTestSuiteError::get_msg(rv), error_line, error_column);
     172                        exit(-1);
     173                }
     174                start++;
     175        }
     176}
     177
    164178static inline void postprocess_do_block(Dictionary& dictionary){
    165 
    166     int error_pos_in_block;
    167179
    168180    if ( bitblock_has_bit(dictionary.Word_starts))
    169181    {
    170         StreamScan((ScanBlock *) &dictionary.Word_starts, sizeof(BitBlock)/sizeof(ScanBlock), ElemStrt_check, &error_pos_in_block);
     182        BitBlockForwardIterator iter_length_grouping_starts(&dictionary.Word_starts);
     183        validate_block(iter_length_grouping_starts, block_base, ElemStrt_check);
    171184    }
    172185
    173186    if ( bitblock_has_bit(dictionary.Word_ends) )
    174187    {
    175         StreamScan((ScanBlock *) &dictionary.Word_ends, sizeof(BitBlock)/sizeof(ScanBlock), ElemEnd_check, &error_pos_in_block);
     188        BitBlockForwardIterator iter_length_grouping_ends(&dictionary.Word_ends);
     189        validate_block(iter_length_grouping_ends, block_base, ElemEnd_check);
    176190    }
    177191
Note: See TracChangeset for help on using the changeset viewer.