16#ifndef CXXUTILS_VEC_FB_H
17#define CXXUTILS_VEC_FB_H
19#include <initializer_list>
28template<
typename T,
size_t N>
31 static_assert(std::is_arithmetic_v<T>,
"Element type is not arithmetic");
32 static_assert(N > 0 && (N & (N - 1)) == 0,
"Size not a power or 2");
37 vec_fb(std::initializer_list<T> init)
39 std::copy(init.begin(), init.end(),
m_arr);
40 std::fill(
m_arr + init.size(),
m_arr + N, T());
51template <
typename T,
size_t N>
63 template<typename T, size_t N> \
64 inline vec_fb<T, N> operator op(const vec_fb<T, N>& a, \
65 const vec_fb<T, N>& b) \
68 for (size_t i = 0; i < N; ++i) \
69 c.m_arr[i] = a.m_arr[i] op b.m_arr[i]; \
72 template<typename T, size_t N, typename U> \
73 inline vec_fb<T, N> operator op(const vec_fb<T, N>& a, U b) \
76 for (size_t i = 0; i < N; ++i) \
77 c.m_arr[i] = a.m_arr[i] op b; \
80 template<typename T, size_t N, typename U> \
81 inline vec_fb<T, N> operator op(U a, const vec_fb<T, N>& b) \
84 for (size_t i = 0; i < N; ++i) \
85 c.m_arr[i] = a op b.m_arr[i]; \
88 template<typename T, size_t N> \
89 inline vec_fb<T, N>& operator op##=(vec_fb<T, N>& a, const vec_fb<T, N>& b) \
91 for (size_t i = 0; i < N; ++i) \
92 a.m_arr[i] op## = b.m_arr[i]; \
95 template<typename T, size_t N, typename U> \
96 inline vec_fb<T, N>& operator op##=(vec_fb<T, N>& a, U b) \
98 for (size_t i = 0; i < N; ++i) \
99 a.m_arr[i] op## = b; \
119 template<typename T, size_t N> \
120 inline vec_fb<T, N> operator op(const vec_fb<T, N>& a) \
123 for (size_t i = 0; i < N; ++i) \
124 c.m_arr[i] = op a.m_arr[i]; \
136 template<typename T, size_t N> \
137 inline ivec<T, N> operator op(const vec_fb<T, N>& a, const vec_fb<T, N>& b) \
140 for (size_t i = 0; i < N; ++i) \
141 c.m_arr[i] = a.m_arr[i] op b.m_arr[i]; \
155template<
typename T,
size_t N>
160 for (
size_t i = 0; i < N; ++i)
161 c.m_arr[i] =
a.m_arr[i] == 0;
166template<
typename T,
size_t N>
171 for (
size_t i = 0; i < N; ++i)
172 c.m_arr[i] = (
a.m_arr[i] != 0) & (b.m_arr[i] != 0);
177template<
typename T,
size_t N,
class U>
182 for (
size_t i = 0; i < N; ++i)
183 c.m_arr[i] =
a ? b.m_arr[i] != 0 : 0;
188template<
typename T,
size_t N,
class U>
193 for (
size_t i = 0; i < N; ++i)
194 c.m_arr[i] = (
a.m_arr[i] != 0) & (b ? -1 : 0);
199template<
typename T,
size_t N>
204 for (
size_t i = 0; i < N; ++i)
205 c.m_arr[i] = (
a.m_arr[i] != 0) | (b.m_arr[i] != 0);
bool operator!() const
Test to see if the link can not be dereferenced.
Ispired by std::bit_int is proposed for a future C++ standard (P3666R2).
typename bit_int< Bits >::type bit_int_t
vec_fb< CxxUtils::bit_int_t< sizeof(T) *8 >, N > ivec
ivec< T, N > operator||(const vec_fb< T, N > &a, const vec_fb< T, N > &b)
V1 || V2.
ivec< T, N > operator&&(const vec_fb< T, N > &a, const vec_fb< T, N > &b)
V1 && V2.
vec_fb & operator=(const vec_fb &)=default
T operator[](size_t n) const
vec_fb(std::initializer_list< T > init)
vec_fb(const vec_fb &)=default