blob: ea4bdf91c138f4a59ef39892c5c477f4c4e85b91 [file] [edit]
// Copyright 2017-2020 The Khronos Group. This work is licensed under a
// Creative Commons Attribution 4.0 International License; see
// http://creativecommons.org/licenses/by/4.0/
[[vector-wrapper-library]]
=== Vector Wrapper Library
The OpenCL {cpp} programming language implements a vector wrapper type that works efficiently on the OpenCL devices.
The vector class supports methods that allow construction of a new vector from a swizzled set of component elements or from a built-in vector type.
The vector class can be converted to a corresponding built-in vector type.
The `Size` parameter can be one of: 2, 3, 4, 8 or 16.
Any other value should produce a compilation failure.
The element type parameter `T`, must be one of the basic scalar types defined in <<device_builtin_scalar_data_types,Device built-in scalar data types>> table except void type.
[[header-opencl_vec-synopsis]]
==== Header <opencl_vec> Synopsis
[source]
----
namespace cl {
static constexpr size_t undef_channel = static_cast<size_t>(-1);
enum class channel : size_t { r = 0, g = 1, b = 2, a = 3, x = 0, y = 1, z = 2, w = 3, undef = undef_channel };
template<class T, size_t Size>
struct vec
{
using element_type = T;
using vector_type = make_vector_t<T, Size>;
static constexpr size_t size = Size;
vec( ) = default;
vec(const vec &) = default;
vec(vec &&) = default;
vec(const vector_type &r) noexcept;
vec(vector_type &&r) noexcept;
template <class... Params>
vec(Params... params) noexcept;
vec& operator=(const vec &) = default;
vec& operator=(vec &&) = default;
vec& operator=(const vector_type &r) noexcept;
vec& operator=(vector_type &&r) noexcept;
operator vector_type() const noexcept;
vec& operator++() noexcept;
vec& operator++(int) noexcept;
vec& operator--() noexcept;
vec& operator--(int) noexcept;
vec& operator+=(const vec &r) noexcept;
vec& operator+=(const element_type &r) noexcept;
vec& operator-=(const vec &r) noexcept;
vec& operator-=(const element_type &r) noexcept;
vec& operator*=(const vec &r) noexcept;
vec& operator*=(const element_type &r) noexcept;
vec& operator/=(const vec &r) noexcept;
vec& operator/=(const element_type &r) noexcept;
vec& operator%=(const vec &r) noexcept;
vec& operator%=(const element_type &r) noexcept;
template <size_t... Sizes>
auto swizzle() noexcept;
template <size_t... Sizes>
auto swizzle() const noexcept;
#ifdef SIMPLE_SWIZZLES
auto x() noexcept;
...
auto xyzw() noexcept;
...
auto zzzz() noexcept;
#endif
};
template <size_t... Swizzle, class Vec>
auto swizzle(Vec& v);
template <channel... Swizzle, class Vec>
auto swizzle(Vec& v);
template<class T, size_t Size>
make_vector_t<bool, Size> operator==(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
make_vector_t<bool, Size> operator!=(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
make_vector_t<bool, Size> operator<(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
make_vector_t<bool, Size> operator>(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
make_vector_t<bool, Size> operator<=(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
make_vector_t<bool, Size> operator>=(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator+(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator+(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator+(const T &lhs, const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator-(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator-(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator-(const T &lhs, const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator*(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator*(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator*(const T &lhs, const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator/(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator/(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator/(const T &lhs, const vec<T, Size> &rhs) noexcept;
}
----
[[constructors-2]]
==== Constructors
[source]
----
vec(const vector_type &r) noexcept;
----
Copy constructor.
Constructs an object with the corresponding built-in vector type.
[source]
----
vec(vector_type &&r) noexcept;
----
Move constructor.
Constructs an object with the corresponding built-in vector type.
[source]
----
template <class... Params>
vec(Params... params) noexcept;
----
Constructs a vector object from a swizzled set of component elements.
[[assignment-operators-2]]
==== Assignment operators
[source]
----
vec& operator=(const vector_type &r) noexcept;
----
Copy assignment operator.
The operator assigns a corresponding built-in vector type.
[source]
----
vec& operator=(vector_type &&r) noexcept;
----
Move assignment operator.
The operator assigns a corresponding built-in vector type.
[[conversion-operators-1]]
==== Conversion operators
[source]
----
operator vector_type() const noexcept;
----
Conversion operator.
The operator converts from the vector wrapper class to a corresponding built-in vector type.
[[arithmetic-operations-1]]
==== Arithmetic operations
[source]
----
vec& operator++() noexcept;
----
Pre-increment operator.
[source]
----
vec& operator++(int) noexcept;
----
Post-increment operator.
[source]
----
vec& operator--() noexcept;
----
Pre-decrement operator.
[source]
----
vec& operator--(int) noexcept;
----
Post-decrement operator.
[source]
----
vec& operator+=(const vec &r) noexcept;
vec& operator+=(const element_type &r) noexcept;
----
Add each element of `r` to the respective element of the current vector in-place.
[source]
----
vec& operator-=(const vec &r) noexcept;
vec& operator-=(const element_type &r) noexcept;
----
Subtract each element of `r` from the respective element of the current vector in-place.
[source]
----
vec& operator*=(const vec &r) noexcept;
vec& operator*=(const element_type &r) noexcept;
----
Multiply each element of `r` by the respective element of the current vector in-place.
[source]
----
vec& operator/=(const vec &r) noexcept;
vec& operator/=(const element_type &r) noexcept;
----
Divide each element of the current vector in-place by the respective element of `r`.
[source]
----
vec& operator%=(const vec &r) noexcept;
vec& operator%=(const element_type &r) noexcept;
----
Remainder of each element of the current vector in-place by the respective element of `r`.
[[swizzle-methods]]
==== Swizzle methods
All swizzle methods return a temporary object representing a swizzled set of the original vector's member elements.
The swizzled vector may be used as a source (rvalue) and destination (lvalue).
In order to enable the r-value and lvalue swizzling to work, this returns an intermediate swizzled-vector class, which can be implicitly converted to a vector (rvalue evaluation) or assigned to.
[source]
----
template <size_t... Sizes>
auto swizzle() noexcept;
template <size_t... Sizes>
auto swizzle() const noexcept;
----
Returns a vector swizzle.
The number of template parameters specified in `Sizes` must be from `1` to `Size`.
`Sizes` parameters must be channel values: `channel::r`, `channel::b`, `...`.
Swizzle letters may be repeated or re-ordered.
[source]
----
auto x() noexcept;
...
auto xyzw() noexcept;
...
auto zzzz() noexcept;
----
Returns a swizzle.
These swizzle methods are only generated if the user defined the `SIMPLE_SWIZZLES` macro before including _opencl_vec_ header.
[[non-member-functions-2]]
==== Non-member functions
[source]
----
template <size_t... Swizzle, class Vec>
auto swizzle(Vec& v);
template <channel... Swizzle, class Vec>
auto swizzle(Vec& v);
----
Returns a vector swizzle.
The number of template parameters specified in `Sizes` must be from `1` to `Size`.
`Sizes` parameters must be channel values: `channel::r`, `channel::b`, `...` .
Swizzle letters may be repeated or re-ordered.
[source]
----
template<class T, size_t Size>
make_vector_t<bool, Size> operator==(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
----
Return `true` if all elements of `rhs` compare equal to the respective element of `lhs`.
[source]
----
template<class T, size_t Size>
make_vector_t<bool, Size> operator!=(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
----
Return `true` if any one element of `rhs` does not compare equal to the respective element of `lhs`.
[source]
----
template<class T, size_t Size>
make_vector_t<bool, Size> operator<(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
----
Return `true` if all elements of `lhs` are less than the respective element of `rhs`.
[source]
----
template<class T, size_t Size>
make_vector_t<bool, Size> operator>(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
----
Return `true` if all elements of `lhs` are greater than the respective element of `rhs`.
[source]
----
template<class T, size_t Size>
make_vector_t<bool, Size> operator<=(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
----
Return `true` if all elements of `lhs` are less than or equal to the respective element of `rhs`.
[source]
----
template<class T, size_t Size>
make_vector_t<bool, Size> operator>=(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
----
Return `true` if all elements of `lhs` are greater than or equal to the respective element of `rhs`.
[source]
----
template<class T, size_t Size>
vec<T, Size> operator+(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator+(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator+(const T &lhs, const vec<T, Size> &rhs) noexcept;
----
Add each element of `rhs` to the respective element of `lhs`.
[source]
----
template<class T, size_t Size>
vec<T, Size> operator-(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator-(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator-(const T &lhs, const vec<T, Size> &rhs) noexcept;
----
Subtract each element of `rhs` from the respective element of `lhs`.
[source]
----
template<class T, size_t Size>
vec<T, Size> operator*(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator*(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator*(const T &lhs, const vec<T, Size> &rhs) noexcept;
----
Multiply each element of `rhs` by the respective element of `lhs`.
[source]
----
template<class T, size_t Size>
vec<T, Size> operator/(const vec<T, Size> &lhs,
const vec<T, Size> &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator/(const vec<T, Size> &lhs, const T &rhs) noexcept;
template<class T, size_t Size>
vec<T, Size> operator/(const T &lhs, const vec<T, Size> &rhs) noexcept;
----
Divide each element of `lhs` by the respective element of the `rhs`.