blob: d19ef0aa150af04e20434cd6c181df14623fbf71 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#pragma once
#include <cstddef>
#include <cstdint>
namespace ffl {
static_assert(-1 == ~0, "FFL requires a two's complement architecture!");
// Type tag used to disambiguate single-argument template constructors.
struct Init {};
// Type representing a zero-based bit ordinal.
template <size_t Ordinal>
struct Bit {};
// Type representing resolution in terms of fractional bits.
template <size_t FractionalBits>
struct Resolution {};
// Typed constant representing the bit position around which to round.
template <size_t Place>
constexpr auto ToPlace = Bit<Place>{};
// Type trait to determine the size of the intermediate result of integer arithmetic.
template <typename T>
struct IntermediateType;
template <>
struct IntermediateType<uint8_t> {
using Type = uint16_t;
};
template <>
struct IntermediateType<uint16_t> {
using Type = uint32_t;
};
template <>
struct IntermediateType<uint32_t> {
using Type = uint64_t;
};
template <>
struct IntermediateType<uint64_t> {
using Type = uint64_t;
};
template <>
struct IntermediateType<int8_t> {
using Type = int16_t;
};
template <>
struct IntermediateType<int16_t> {
using Type = int32_t;
};
template <>
struct IntermediateType<int32_t> {
using Type = int64_t;
};
template <>
struct IntermediateType<int64_t> {
using Type = int64_t;
};
} // namespace ffl