diff --git a/include/bit_op.h b/include/bit_op.h deleted file mode 100644 index 6f70f09..0000000 --- a/include/bit_op.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/include/operator.h b/include/operator.h new file mode 100644 index 0000000..3014e80 --- /dev/null +++ b/include/operator.h @@ -0,0 +1,75 @@ +#pragma once +#include "bit.h" + +namespace dark { + +using dark::concepts::bit_type; +using dark::concepts::int_type; +using dark::concepts::bit_match; + +template +constexpr auto cast(const _Tp& value) { + return static_cast (value); +} + +template +consteval auto get_common_length() -> std::size_t { + static_assert(bit_match <_Tp, _Up>); + if constexpr (bit_type <_Tp>) { + return _Tp::_Bit_Len; + } else { + static_assert(bit_type <_Up>, "Invalid common length"); + return _Up::_Bit_Len; + } +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator + (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator - (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator * (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator / (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator & (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator | (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +template +requires bit_match <_Tp, _Up> +constexpr auto operator ^ (const _Tp &lhs, const _Up &rhs) { + constexpr auto _Len = get_common_length <_Tp, _Up>(); + return Bit <_Len> (cast(lhs) + cast(rhs)); +} + +} // namespace dark