// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Block split point selection utilities.

#ifndef BROTLI_ENC_BLOCK_SPLITTER_H_
#define BROTLI_ENC_BLOCK_SPLITTER_H_

#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <vector>
#include <utility>

#include "./command.h"

namespace brotli {

struct BlockSplit {
  int num_types_;
  std::vector<uint8_t> types_;
  std::vector<uint8_t> type_codes_;
  std::vector<int> lengths_;
};

struct BlockSplitIterator {
  explicit BlockSplitIterator(const BlockSplit& split)
      : split_(split), idx_(0), type_(0), length_(0) {
    if (!split.lengths_.empty()) {
      length_ = split.lengths_[0];
    }
  }

  void Next() {
    if (length_ == 0) {
      ++idx_;
      type_ = split_.types_[idx_];
      length_ = split_.lengths_[idx_];
    }
    --length_;
  }

  const BlockSplit& split_;
  int idx_;
  int type_;
  int length_;
};

void CopyLiteralsToByteArray(const std::vector<Command>& cmds,
                             const uint8_t* data,
                             std::vector<uint8_t>* literals);

void SplitBlock(const std::vector<Command>& cmds,
                const uint8_t* data,
                BlockSplit* literal_split,
                BlockSplit* insert_and_copy_split,
                BlockSplit* dist_split);

void SplitBlockByTotalLength(const std::vector<Command>& all_commands,
                             int input_size,
                             int target_length,
                             std::vector<std::vector<Command> >* blocks);

}  // namespace brotli

#endif  // BROTLI_ENC_BLOCK_SPLITTER_H_
