// Copyright (c) 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef NET_TOOLS_HUFFMAN_TRIE_BIT_WRITER_H_
#define NET_TOOLS_HUFFMAN_TRIE_BIT_WRITER_H_

#include <stdint.h>

#include <vector>

#include "base/macros.h"

namespace net {

namespace huffman_trie {

// BitWriter acts as a buffer to which bits can be written. The bits are stored
// as bytes in a vector. BitWriter will buffer bits until it contains 8 bits at
// which point they will be appended to the vector automatically.
class BitWriter {
 public:
  BitWriter();
  ~BitWriter();

  // Appends |bit| to the end of the buffer.
  void WriteBit(uint8_t bit);

  // Appends the |number_of_bits| least-significant bits of |bits| to the end of
  // the buffer.
  void WriteBits(uint32_t bits, uint8_t number_of_bits);

  // Appends the buffered bits in |current_byte_| to the |bytes_| vector. When
  // there are less than 8 bits in the buffer, the empty bits will be filled
  // with zero's.
  void Flush();
  uint32_t position() const { return position_; }

  // Returns a reference to |bytes_|. Make sure to call Flush() first so that
  // the buffered bits are written to |bytes_| as well.
  const std::vector<uint8_t>& bytes() const { return bytes_; }

 private:
  // Buffers bits until they fill a whole byte.
  uint8_t current_byte_ = 0;

  // The number of bits currently in |current_byte_|.
  uint8_t used_ = 0;

  // Total number of bits written to this BitWriter.
  uint32_t position_ = 0;

  std::vector<uint8_t> bytes_;

  DISALLOW_COPY_AND_ASSIGN(BitWriter);
};

}  // namespace huffman_trie

}  // namespace net

#endif  // NET_TOOLS_HUFFMAN_TRIE_BIT_WRITER_H_
