/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * Copyright 2011 Danny Robson <danny@nerdcruft.net>
 */

#ifndef __UTIL_TYPES_BITS_HPP
#define __UTIL_TYPES_BITS_HPP

#include <cstdint>
#include <cstddef>

namespace cruft {
    template <size_t BITS>
    struct bits_type;


    template <> struct bits_type< 8u> {
        static const bool has_floating = false;

        typedef    uint8_t uint;
        typedef     int8_t sint;
        typedef    uint8_t floating;
    };


    template <> struct bits_type<16u> {
        static const bool has_floating = false;

        typedef   uint16_t uint;
        typedef    int16_t sint;
        typedef   uint16_t floating;
    };


    template <> struct bits_type<32u> {
        static const bool has_floating = true;

        typedef uint32_t uint;
        typedef  int32_t sint;
        typedef    float floating;
    };


    template <> struct bits_type<64u> {
        static const bool has_floating = true;

        typedef uint64_t uint;
        typedef  int64_t sint;
        typedef   double floating;
    };


    template <size_t BYTES>
    struct bytes_type : public bits_type<BYTES * 8u>
    { };


    template <typename T>
    struct sized_type : public bits_type<sizeof(T) * 8u>
    { };


    template <std::size_t Size>
    using bits_uint_t = typename bits_type<Size>::uint;

    template <std::size_t Size>
    using bytes_uint_t = typename bytes_type<Size>::uint;
}
#endif