1#ifndef _BBM_VECTOR_UTIL_H_
2#define _BBM_VECTOR_UTIL_H_
36 using pointer =
typename base_type::pointer;
43 using base_type::base_type;
44 using base_type::operator=;
45 using base_type::operator[];
48 template<
typename... D>
55 base_type::reserve(std::size(src));
56 for(
auto& s : src) base_type::push_back(s);
64 std::swap(*
this, temp);
81 template<
typename T>
requires std::is_reference_v<T>
82 class vector<T> :
public std::vector< bbm::reference<T> >
92 using pointer =
typename base_type::pointer;
99 using base_type::base_type;
100 using base_type::operator=;
101 using base_type::size;
108 std::copy(std::begin(src), std::end(src),
begin());
149 size_t idx = std::distance(
cbegin(), pos);
152 base_type::reserve(base_type::size() + count);
155 auto epos = std::next(base_type::begin(), idx);
158 for(
size_t c=0; c != count; ++c)
159 base_type::emplace(epos, std::forward<
decltype(val)>(val));
162 return std::prev(
end(), count);
165 template<
typename Itr>
168 size_t idx = std::distance(
cbegin(), pos);
171 base_type::reserve(base_type::size() + std::distance(inputBegin, inputEnd));
174 auto epos = std::next(base_type::begin(), idx);
177 for(
auto itr = inputBegin; itr != inputEnd; ++itr)
180 if constexpr (is_bbm_reference_v<std::iter_value_t<underlying_itr_t<Itr>>>)
181 base_type::emplace(epos, itr.raw_dereference());
184 else base_type::emplace(epos, *itr);
188 return std::prev(
end(), std::distance(inputBegin, inputEnd));
200 struct is_bbm_vector_impl : std::false_type {};
203 struct is_bbm_vector_impl<
bbm::vector<T>> : std::true_type {};
220 template<
typename OP,
typename T,
typename U>
requires ((is_vector_v<T> || is_bbm_vector_v<T>) && !(is_vector_v<U> || is_bbm_vector_v<U>))
221 inline auto vector_mathop(
const T& vec,
const U& u,
const OP& op)
223 vector<
decltype(vec[0] + u) > result; result.reserve( vec.size() );
225 result.push_back( op(val, u) );
229 template<
typename OP,
typename T,
typename U>
requires ((is_vector_v<T> || is_bbm_vector_v<T>) && (is_vector_v<U> || is_bbm_vector_v<U>))
230 inline auto vector_mathop(
const T& t,
const U& u,
const OP& op)
232 vector<
decltype(t[0] + u[0]) > result; result.reserve( t.size() );
233 multirange_for([&](
auto& t,
auto& u) { result.push_back( op(t, u) ); }, t, u);
237 template<
typename OP,
typename T,
typename U>
requires ((is_vector_v<T> || is_bbm_vector_v<T>) && !(is_vector_v<U> || is_bbm_vector_v<U>) && !is_const_v<T>)
238 inline auto& vector_mathop_inplace(T& vec,
const U& u,
const OP& op)
240 for(
auto& val : vec) op(val, u);
244 template<
typename OP,
typename T,
typename U>
requires ((is_vector_v<T> || is_bbm_vector_v<T>) && (is_vector_v<U> || is_bbm_vector_v<U>) && !is_const_v<T>)
245 inline auto& vector_mathop_inplace(T& t,
const U& u,
const OP& op)
258 template<
typename T,
typename U>
inline auto&
operator+=(
vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop_inplace(v, u, [](
auto& v,
auto& u) { v += u; } ); }
259 template<
typename T,
typename U>
inline auto operator+(
const vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop(v, u, [](
auto& v,
auto& u) {
return (v + u); } ); }
260 template<
typename T,
typename U>
requires (!is_vector_v<T> && !is_bbm_vector_v<T>)
inline auto operator+(
const T& v,
const vector<U>& u) {
return (u + v); }
263 template<
typename T,
typename U>
inline auto&
operator-=(
vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop_inplace(v, u, [](
auto& v,
auto& u) { v -= u; } ); }
264 template<
typename T,
typename U>
inline auto operator-(
const vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop(v, u, [](
auto& v,
auto& u) {
return (v - u); } ); }
267 template<
typename T,
typename U>
inline auto&
operator*=(
vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop_inplace(v, u, [](
auto& v,
auto& u) { v *= u; } ); }
268 template<
typename T,
typename U>
inline auto operator*(
const vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop(v, u, [](
auto& v,
auto& u) {
return (v * u); } ); }
269 template<
typename T,
typename U>
requires (!is_vector_v<T> && !is_bbm_vector_v<T>)
inline auto operator*(
const T& v,
const vector<U>& u) {
return (u * v); }
272 template<
typename T,
typename U>
inline auto&
operator/=(
vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop_inplace(v, u, [](
auto& v,
auto& u) { v /= u; } ); }
273 template<
typename T,
typename U>
inline auto operator/(
const vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop(v, u, [](
auto& v,
auto& u) {
return (v / u); } ); }
276 template<
typename T,
typename U>
inline auto&
operator%=(
vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop_inplace(v, u, [](
auto& v,
auto& u) { v %= u; } ); }
277 template<
typename T,
typename U>
inline auto operator%(
const vector<T>& v,
const U& u) {
return bbm::detail::vector_mathop(v, u, [](
auto& v,
auto& u) {
return (v % u); } ); }
283 std::ostream&
operator<<(std::ostream& s,
const std::vector<T>& vec)
Cast iterator; cast the result after deferencing.
Definition: iterator_util.h:69
const_iterator cend(void) const
Definition: vector_util.h:137
typename base_type::pointer pointer
Definition: vector_util.h:92
const_iterator end(void) const
Definition: vector_util.h:134
constexpr iterator insert(const_iterator pos, size_t count, value_type &&val)
Definition: vector_util.h:147
iterator begin(void)
Definition: vector_util.h:127
bbm::add_const_t< T > const_reference
Definition: vector_util.h:91
std::vector< bbm::reference< T > > base_type
Definition: vector_util.h:84
iterator rbegin(void)
Definition: vector_util.h:129
const_reference back(void) const
Definition: vector_util.h:123
reference at(size_type idx)
Definition: vector_util.h:113
typename base_type::difference_type difference_type
Definition: vector_util.h:89
constexpr iterator insert(const_iterator pos, Itr inputBegin, Itr inputEnd)
Definition: vector_util.h:166
const_reference front(void) const
Definition: vector_util.h:120
reference operator[](size_type idx)
Definition: vector_util.h:116
const_iterator rend(void) const
Definition: vector_util.h:136
constexpr iterator insert(const_iterator pos, value_type &&val)
Definition: vector_util.h:145
iterator rend(void)
Definition: vector_util.h:135
const_reference operator[](size_type idx) const
Definition: vector_util.h:117
typename base_type::size_type size_type
Definition: vector_util.h:88
void push_back(R &&a)
push_back reference encapsulation
Definition: vector_util.h:142
const_iterator cbegin(void) const
Definition: vector_util.h:131
const_iterator begin(void) const
Definition: vector_util.h:128
const_iterator rbegin(void) const
Definition: vector_util.h:130
reference front(void)
Definition: vector_util.h:119
T reference
Definition: vector_util.h:90
reference back(void)
Definition: vector_util.h:122
iterator end(void)
Definition: vector_util.h:133
const_reference at(size_type idx) const
Definition: vector_util.h:114
typename base_type::const_pointer const_pointer
Definition: vector_util.h:93
typename base_type::value_type value_type
Definition: vector_util.h:86
bbm::vector< T > & operator=(const bbm::vector< U > &src)
Casting Assignemnt.
Definition: vector_util.h:105
typename base_type::allocator_type allocator_type
Definition: vector_util.h:87
Definition: vector_util.h:27
typename base_type::pointer pointer
Definition: vector_util.h:36
typename base_type::difference_type difference_type
Definition: vector_util.h:33
typename base_type::iterator iterator
Definition: vector_util.h:38
typename base_type::const_iterator const_iterator
Definition: vector_util.h:39
bbm::vector< T > & operator=(const bbm::vector< U > &src)
Casting Assignemnt.
Definition: vector_util.h:61
typename base_type::size_type size_type
Definition: vector_util.h:32
typename base_type::const_reference const_reference
Definition: vector_util.h:35
typename base_type::const_reverse_iterator const_reverse_iterator
Definition: vector_util.h:41
typename base_type::reverse_iterator reverse_iterator
Definition: vector_util.h:40
std::vector< T > base_type
Definition: vector_util.h:28
typename base_type::reference reference
Definition: vector_util.h:34
vector(const std::vector< D... > &v)
Std vector Casting Constructor.
Definition: vector_util.h:49
typename base_type::const_pointer const_pointer
Definition: vector_util.h:37
typename base_type::value_type value_type
Definition: vector_util.h:30
typename base_type::allocator_type allocator_type
Definition: vector_util.h:31
vector(const bbm::vector< U > &src)
Casting Constructor.
Definition: vector_util.h:53
assignable_to: reverse of std::assignable_from
Definition: util.h:43
#define bbm_size_error
Definition: error.h:45
concept to check if a type has a valid string_converter.
Extensions for STL iterators/ranges.
ranged for loop over multiple containers at once
Definition: aggregatebsdf.h:29
auto operator/(const vector< T > &v, const U &u)
Definition: vector_util.h:273
constexpr FLAGNAME operator+(FLAGNAME a, FLAGNAME b)
Conact two flags.
Definition: flags.h:40
constexpr FLAGNAME & operator+=(FLAGNAME &a, FLAGNAME b)
Update 'a' with a+b.
Definition: flags.h:84
auto & operator*=(vector< T > &v, const U &u)
Definition: vector_util.h:267
auto operator*(const vector< T > &v, const U &u)
Definition: vector_util.h:268
auto & operator/=(vector< T > &v, const U &u)
Definition: vector_util.h:272
void multirange_for(FUNC &&func, Ts &&... containers)
ranged for loop over multiple containers at once
Definition: multirange_for.h:43
auto & operator%=(vector< T > &v, const U &u)
Definition: vector_util.h:276
std::ostream & operator<<(std::ostream &s, const BSDF &bsdf)
Definition: bsdf_base.h:138
auto end(T &&t)
Definition: iterator_util.h:43
size_t size(T &&t)
Definition: iterator_util.h:22
bbm::detail::is_bbm_vector_impl< std::decay_t< T > > is_bbm_vector
Definition: vector_util.h:210
std::string toString(const T &)
toString alias
Definition: stringconvert.h:594
typename add_const< T >::type add_const_t
Definition: type_traits.h:42
constexpr bool is_bbm_vector_v
Definition: vector_util.h:213
auto operator%(const vector< T > &v, const U &u)
Definition: vector_util.h:277
auto begin(T &&t)
Definition: iterator_util.h:29
auto & operator-=(vector< T > &v, const U &u)
Definition: vector_util.h:263
auto operator-(const vector< T > &v, const U &u)
Definition: vector_util.h:264
auto cbegin(T &&t)
Definition: iterator_util.h:36
Assignable reference with wrapper support for rvalues.
Non-persistent reference (i.e., cannot take rvalues)
Definition: reference.h:86