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