Skip to content

Commit c496916

Browse files
author
kevyuu
committed
Promote and Truncate take vector and scalar by value and the rest by reference
1 parent 83d27c9 commit c496916

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

include/nbl/builtin/hlsl/cpp_compat/promote.hlsl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace impl
1515
template<typename T, typename U>
1616
struct Promote
1717
{
18-
NBL_CONSTEXPR_FUNC T operator()(const U v)
18+
NBL_CONSTEXPR_FUNC T operator()(NBL_CONST_REF_ARG(U) v)
1919
{
2020
return T(v);
2121
}
@@ -26,7 +26,7 @@ struct Promote
2626
template<typename Scalar, typename U>
2727
struct Promote<vector <Scalar, 1>, U>
2828
{
29-
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 1> > operator()(NBL_CONST_REF_ARG(U) v)
29+
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 1> > operator()(const U v)
3030
{
3131
vector <Scalar, 1> promoted = {Scalar(v)};
3232
return promoted;
@@ -36,7 +36,7 @@ struct Promote<vector <Scalar, 1>, U>
3636
template<typename Scalar, typename U>
3737
struct Promote<vector <Scalar, 2>, U>
3838
{
39-
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 2> > operator()(NBL_CONST_REF_ARG(U) v)
39+
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 2> > operator()(const U v)
4040
{
4141
vector <Scalar, 2> promoted = {Scalar(v), Scalar(v)};
4242
return promoted;
@@ -46,7 +46,7 @@ struct Promote<vector <Scalar, 2>, U>
4646
template<typename Scalar, typename U>
4747
struct Promote<vector <Scalar, 3>, U>
4848
{
49-
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 3> > operator()(NBL_CONST_REF_ARG(U) v)
49+
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 3> > operator()(const U v)
5050
{
5151
vector <Scalar, 3> promoted = {Scalar(v), Scalar(v), Scalar(v)};
5252
return promoted;
@@ -56,7 +56,7 @@ struct Promote<vector <Scalar, 3>, U>
5656
template<typename Scalar, typename U>
5757
struct Promote<vector <Scalar, 4>, U>
5858
{
59-
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 4> > operator()(NBL_CONST_REF_ARG(U) v)
59+
NBL_CONSTEXPR_FUNC enable_if_t<is_scalar<Scalar>::value && is_scalar<U>::value, vector <Scalar, 4> > operator()(const U v)
6060
{
6161
vector <Scalar, 4> promoted = {Scalar(v), Scalar(v), Scalar(v), Scalar(v)};
6262
return promoted;
@@ -67,13 +67,15 @@ struct Promote<vector <Scalar, 4>, U>
6767

6868
}
6969

70+
// TODO(kevinyu): Should we specialize this for vector and scalar to take argument by value instead of reference?
7071
template<typename T, typename U>
71-
NBL_CONSTEXPR_FUNC T promote(const U v) // TODO: use NBL_CONST_REF_ARG(U) instead of U v (circular ref)
72+
NBL_CONSTEXPR_FUNC T promote(NBL_CONST_REF_ARG(U) v)
7273
{
7374
impl::Promote<T,U> _promote;
7475
return _promote(v);
7576
}
7677

78+
7779
}
7880
}
7981

include/nbl/builtin/hlsl/cpp_compat/truncate.hlsl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ struct Truncate
2424
template<typename Scalar, uint16_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar>)
2525
struct Truncate<vector<Scalar, 1>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar>) >
2626
{
27-
NBL_CONSTEXPR_FUNC vector<Scalar, 1> operator()(NBL_CONST_REF_ARG(vector<Scalar, N>) v)
27+
NBL_CONSTEXPR_FUNC vector<Scalar, 1> operator()(const vector<Scalar, N> v)
2828
{
2929
vector<Scalar, 1> truncated = { v[0] };
3030
return truncated;
@@ -34,7 +34,7 @@ struct Truncate<vector<Scalar, 1>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concept
3434
template<typename Scalar, uint16_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar> && N >= 2)
3535
struct Truncate<vector<Scalar, 2>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar> && N >= 2) >
3636
{
37-
NBL_CONSTEXPR_FUNC vector<Scalar, 2> operator()(NBL_CONST_REF_ARG(vector<Scalar, N>) v)
37+
NBL_CONSTEXPR_FUNC vector<Scalar, 2> operator()(const vector<Scalar, N> v)
3838
{
3939
vector<Scalar, 2> truncated = { v[0], v[1]};
4040
return truncated;
@@ -44,7 +44,7 @@ struct Truncate<vector<Scalar, 2>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concept
4444
template<typename Scalar, uint16_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar>&& N >= 3)
4545
struct Truncate<vector<Scalar, 3>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar>&& N >= 3) >
4646
{
47-
NBL_CONSTEXPR_FUNC vector<Scalar, 3> operator()(NBL_CONST_REF_ARG(vector<Scalar, N>) v)
47+
NBL_CONSTEXPR_FUNC vector<Scalar, 3> operator()(const vector<Scalar, N> v)
4848
{
4949
vector<Scalar, 3> truncated = { v[0], v[1], v[2] };
5050
return truncated;
@@ -54,7 +54,7 @@ struct Truncate<vector<Scalar, 3>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concept
5454
template<typename Scalar, uint16_t N> NBL_PARTIAL_REQ_TOP(concepts::Scalar<Scalar>&& N >= 4)
5555
struct Truncate<vector<Scalar, 4>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concepts::Scalar<Scalar>&& N >= 4) >
5656
{
57-
NBL_CONSTEXPR_FUNC vector<Scalar, 4> operator()(NBL_CONST_REF_ARG(vector<Scalar, N>) v)
57+
NBL_CONSTEXPR_FUNC vector<Scalar, 4> operator()(const vector<Scalar, N> v)
5858
{
5959
vector<Scalar, 4> truncated = { v[0], v[1], v[2], v[3] };
6060
return truncated;
@@ -63,6 +63,7 @@ struct Truncate<vector<Scalar, 4>, vector<Scalar, N> NBL_PARTIAL_REQ_BOT(concept
6363

6464
} //namespace impl
6565

66+
// TODO(kevinyu): Should we specialize this for vector and scalar to take argument by value instead of reference?
6667
template<typename T, typename U>
6768
NBL_CONSTEXPR_FUNC T truncate(NBL_CONST_REF_ARG(U) v)
6869
{

0 commit comments

Comments
 (0)