#ifndef _LIBRARY_CFG_HPP_
#define _LIBRARY_CFG_HPP_

// ------------------------------------------------------------------------------------------------
#include "Common.hpp"

// ------------------------------------------------------------------------------------------------
namespace SqMod {

/* ------------------------------------------------------------------------------------------------
 * ...
*/
template < class T > class HashWrapper
{
public:

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    HashWrapper() = default;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    HashWrapper(const HashWrapper & o) = default;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    HashWrapper(HashWrapper && o) = default;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    ~HashWrapper() = default;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    HashWrapper & operator = (const HashWrapper & o) = default;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    HashWrapper & operator = (HashWrapper && o) = default;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    String ToString() noexcept
    {
        return m_Encoder.getHash();
    }

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    void Reset() noexcept
    {
        m_Encoder.reset();
    }

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    String Compute(const String & str) noexcept
    {
        return m_Encoder(str);
    }

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    String GetHash() noexcept
    {
        return m_Encoder.getHash();
    }

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    void AddStr(const String & str) noexcept
    {
        m_Encoder.add(str.data(), str.length() * sizeof(String::value_type));
    }

private:

    // --------------------------------------------------------------------------------------------
    T   m_Encoder;
};

} // Namespace:: SqMod

#endif // _LIBRARY_CFG_HPP_