Home | History | Annotate | Download | only in enc
      1 // Copyright 2013 Google Inc. All Rights Reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 // http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 //
     15 // Block split point selection utilities.
     16 
     17 #ifndef BROTLI_ENC_BLOCK_SPLITTER_H_
     18 #define BROTLI_ENC_BLOCK_SPLITTER_H_
     19 
     20 #include <stddef.h>
     21 #include <stdint.h>
     22 #include <string.h>
     23 #include <vector>
     24 #include <utility>
     25 
     26 #include "./command.h"
     27 
     28 namespace brotli {
     29 
     30 struct BlockSplit {
     31   int num_types_;
     32   std::vector<uint8_t> types_;
     33   std::vector<int> type_codes_;
     34   std::vector<int> lengths_;
     35 };
     36 
     37 struct BlockSplitIterator {
     38   explicit BlockSplitIterator(const BlockSplit& split)
     39       : split_(split), idx_(0), type_(0), length_(0) {
     40     if (!split.lengths_.empty()) {
     41       length_ = split.lengths_[0];
     42     }
     43   }
     44 
     45   void Next() {
     46     if (length_ == 0) {
     47       ++idx_;
     48       type_ = split_.types_[idx_];
     49       length_ = split_.lengths_[idx_];
     50     }
     51     --length_;
     52   }
     53 
     54   const BlockSplit& split_;
     55   int idx_;
     56   int type_;
     57   int length_;
     58 };
     59 
     60 void CopyLiteralsToByteArray(const std::vector<Command>& cmds,
     61                              const uint8_t* data,
     62                              std::vector<uint8_t>* literals);
     63 
     64 void SplitBlock(const std::vector<Command>& cmds,
     65                 const uint8_t* data,
     66                 BlockSplit* literal_split,
     67                 BlockSplit* insert_and_copy_split,
     68                 BlockSplit* dist_split);
     69 
     70 void SplitBlockByTotalLength(const std::vector<Command>& all_commands,
     71                              int input_size,
     72                              int target_length,
     73                              std::vector<std::vector<Command> >* blocks);
     74 
     75 }  // namespace brotli
     76 
     77 #endif  // BROTLI_ENC_BLOCK_SPLITTER_H_
     78