/// \file DS_HuffmanEncodingTreeFactory.h
/// \internal
/// \brief Creates instances of the class HuffmanEncodingTree
///
/// This file is part of RakNet Copyright 2003 Jenkins Software LLC
///
/// Raknet is available under the terms of the GPLv3 license, see /usr/local/share/licenses/raknet-3.9.2,1/GPLv3.

 
#ifndef __HUFFMAN_ENCODING_TREE_FACTORY
#define __HUFFMAN_ENCODING_TREE_FACTORY

#include "RakMemoryOverride.h"
class HuffmanEncodingTree;

/// \brief Creates instances of the class HuffmanEncodingTree
/// \details This class takes a frequency table and given that frequence table, will generate an instance of HuffmanEncodingTree
class HuffmanEncodingTreeFactory
{
public:
	/// Default constructor
	HuffmanEncodingTreeFactory();
	
	/// \brief Reset the frequency table. 
	/// \details You don't need to call this unless you want to reuse the class for a new tree
	void Reset( void );
	
	/// \brief Pass an array of bytes to this to add those elements to the frequency table.
	/// \param[in] array the data to insert into the frequency table 
	/// \param[in] size the size of the data to insert 
	void AddToFrequencyTable( unsigned char *array, int size );
	
	/// \brief Copies the frequency table to the array passed. Retrieve the frequency table.
	/// \param[in] _frequency The frequency table used currently
	void GetFrequencyTable( unsigned int _frequency[ 256 ] );
	
	/// \brief Returns the frequency table as a pointer.
	/// \return the address of the frenquency table 
	unsigned int * GetFrequencyTable( void );
	
	/// \brief Generate a HuffmanEncodingTree.
	/// \details You can also use GetFrequencyTable and GenerateFromFrequencyTable in the tree itself
	/// \return The generated instance of HuffmanEncodingTree
	HuffmanEncodingTree * GenerateTree( void );
	
private:

	/// Frequency table
	unsigned int frequency[ 256 ];
};

#endif
