33#include <NDEVR/BaseValues.h>
34#include <NDEVR/LibAssert.h>
35#include <NDEVR/Vector.h>
36#include <NDEVR/BitReference.h>
43 template<u
int01 t_dims>
44 class Vector<t_dims, bool>
47 constexpr Vector() =
default;
48 constexpr Vector(
const Vector<t_dims, bool>& vector)
50 for (
uint01 dim = 0; dim <
sizeof(Vector<t_dims, bool>); ++dim)
63 template<
class t_vec_type>
64 constexpr Vector(
const Vector<t_dims, t_vec_type>& vector)
66 for (
uint01 dim = 0; dim < t_dims; ++dim)
81 constexpr explicit Vector(
const bool& value)
83 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
88 Vector(std::initializer_list<bool> active_list)
91 for (
auto val : active_list)
95 template<
class t_type>
96 Vector(std::initializer_list<t_type> active_list)
98 for (
auto i : active_list)
102 constexpr void operator()(
const uint01 dim,
bool value)
119 constexpr Vector(
const bool& x,
const bool& y)
121 static_assert(t_dims == 2,
"Unexpected Number of Dimensions. Vector Size Required: 2");
133 constexpr Vector(
const bool& x,
const bool& y,
const bool& z)
135 static_assert(t_dims == 3,
"Unexpected Number of Dimensions. Vector Size Required: 3");
149 constexpr Vector(
const bool& x,
const bool& y,
const bool& z,
const bool& w)
151 static_assert(t_dims == 4,
"Unexpected Number of Dimensions. Vector Size Required: 4");
162 constexpr explicit Vector(
const bool(&vector)[t_dims])
164 for (
uint01 dim = 0; dim < t_dims; dim++)
165 m_values[dim / 8](dim % 8, vector[dim]);
173 constexpr Vector(
const Vector<t_dims - 1, bool>& vector,
const bool& suffix)
175 static_assert(t_dims >= 2,
"Unexpected Number of Dimensions. Vector Size Required: >= 2");
176 for (
uint01 dim = 0; dim < t_dims - 1; ++dim)
177 m_values[dim / 8](dim % 8, vector[dim]);
178 m_values[(t_dims - 1) / 8]((t_dims - 1) % 8, suffix);
187 constexpr Vector(
const Vector<
getMax(t_dims - 2, 0),
bool>& vector,
const bool& suffix_a,
const bool& suffix_b)
189 static_assert(t_dims >= 3,
"Unexpected Number of Dimensions. Vector Size Required: >= 3");
190 for (
uint01 dim = 0; dim < t_dims - 2; ++dim)
191 m_values[dim / 8](dim % 8, vector[dim]);
192 m_values[(t_dims - 2) / 8]((t_dims - 2) % 8, suffix_a);
193 m_values[(t_dims - 1) / 8]((t_dims - 1) % 8, suffix_b);
201 constexpr Vector(
const bool& prefix,
const Vector<t_dims - 1, bool>& vector)
203 static_assert(t_dims >= 2,
"Unexpected Number of Dimensions. Vector Size Required: >= 2");
205 for (
uint01 dim = 1; dim < t_dims; ++dim)
206 m_values[dim / 8](dim % 8, vector[dim - 1]);
214 constexpr Vector(
const bool& prefix_a,
const bool& prefix_b,
const Vector<t_dims - 1, bool>& vector)
216 static_assert(t_dims >= 2,
"Unexpected Number of Dimensions. Vector Size Required: of at least 1");
219 for (
uint01 dim = Z; dim < t_dims; ++dim)
229 template<u
int01 t_new_dim,
class t_new_type>
230 constexpr Vector<t_new_dim, t_new_type>
as(t_new_type extra_fill_value = 0)
const
232 Vector<t_new_dim, t_new_type> vec;
235 for (; dim < min; dim++)
237 for (; dim < t_new_dim; dim++)
238 vec[dim] = extra_fill_value;
249 constexpr operator bool()
const
251 static_assert(t_dims == 1,
"Cannot auto-convert from vector to scaler unless dimension of vector is 1.");
265 lib_assert(dimension_index < t_dims,
"Dimension requested Exceeded maximum vector dimension");
273 lib_assert(dimension_index < t_dims,
"Dimension requested Exceeded maximum vector dimension");
274 return m_values[dimension_index / 8][dimension_index % 8];
284 constexpr Vector<t_dims, bool>&
operator=(
const Vector<t_dims, bool>& vector)
286 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
296 constexpr Vector<t_dims, bool>&
operator=(
const bool& scaler)
299 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
306 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
311 constexpr Vector<t_dims, bool>& operator|=(
const Vector<t_dims, bool>& vector)
313 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
314 m_values[dim] |= vector.m_values[dim];
318 constexpr Vector<t_dims, bool> operator&(
const Vector<t_dims, bool>& vector)
const
320 Vector<t_dims, bool> output(0);
321 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
322 output[dim] =
m_values[dim] & vector.m_values[dim];
326 constexpr Vector<t_dims, bool>
operator|(
const Vector<t_dims, bool>& vector)
const
328 Vector<t_dims, bool> output(0);
329 for (
uint01 dim = 0; dim < ByteCount(); ++dim)
330 output[dim] =
m_values[dim] | vector.m_values[dim];
346 constexpr static bool Type() {
return bool(); }
348 static constexpr uint04 ByteCount()
350 return (t_dims / 8) + (t_dims % 8 == 0 ? 0 : 1);
A bitset that stores 8 bits (elements with only two possible values: 0 or 1, true or false,...
A convenience class used with Buffers or Vectors of bools for referencing or acting on a single bit.
constexpr Vector(const Vector< t_dims - 1, bool > &vector, const bool &suffix)
Vectors.
constexpr Vector(const bool &x, const bool &y)
Sets values in each dimension to the respective value in the passed in scaler.
constexpr Vector(const bool(&vector)[t_dims])
Given a container of statically determined array, transforms it to a vector.
constexpr Vector(const bool &prefix, const Vector< t_dims - 1, bool > &vector)
Creates a vector where the prefix scaler is combined with the suffix vector.
static constexpr uint01 NumberOfDimensions()
Number of dimensions in this vector class.
constexpr Vector(const bool &value)
Sets values in each dimension to the value in the passed in scaler.
constexpr Vector(const Vector< getMax(t_dims - 2, 0), bool > &vector, const bool &suffix_a, const bool &suffix_b)
Creates a vector where the prefix vector is combined with the suffix scalers.
constexpr Vector(const bool &x, const bool &y, const bool &z, const bool &w)
Sets values in each dimension to the respective value in the passed in scaler.
constexpr Vector(const Vector< t_dims, t_vec_type > &vector)
Copy constructor.
constexpr Vector(const bool &x, const bool &y, const bool &z)
Sets values in each dimension to the respective value in the passed in scaler.
static constexpr bool Type()
Returns the type of this class.
constexpr Vector< t_dims, bool > & operator=(const Vector< t_dims, bool > &vector)
Assignment operator.
constexpr Vector(const bool &prefix_a, const bool &prefix_b, const Vector< t_dims - 1, bool > &vector)
Vectors.
constexpr BitReference operator[](uint01 dimension_index)
Accesses the value of a certain dimension.
constexpr Vector< t_new_dim, t_new_type > as(t_new_type extra_fill_value=0) const
As the given extra fill value.
BitFlag m_values[(t_dims/8)+(t_dims % 8==0 ? 0 :1)]
The values[t dims].
constexpr Vector< t_dims, bool > & operator=(const bool &scaler)
Assignment operator.
A fixed-size array with N dimensions used as the basis for geometric and mathematical types.
t_type m_values[t_dims]
The values[t dims].
constexpr t_type & operator[](uint01 dimension_index)
Accesses the value of a certain dimension.
The primary namespace for the NDEVR SDK.
@ BitFlag
Per-vertex bit flags (selected, hidden, etc.).
constexpr t_type getMin(const t_type &left, const t_type &right)
Finds the minimum of the given arguments based on the < operator Author: Tyler Parke Date: 2017-11-05...
constexpr t_type getMax(const t_type &left, const t_type &right)
Finds the max of the given arguments using the > operator The only requirement is that t_type have > ...
uint32_t uint04
-Defines an alias representing a 4 byte, unsigned integer -Can represent exact integer values 0 throu...
uint8_t uint01
-Defines an alias representing a 1 byte, unsigned integer -Can represent exact integer values 0 throu...
uint01 operator|(const TextAlignment &a, const TextAlignment &b)
Bitwise OR operator for combining TextAlignment flags.
constexpr t_to cast(const Angle< t_from > &value)
Casts an Angle from one backing type to another.