Grok 12.0.1
tuple-inl.h
Go to the documentation of this file.
1// Copyright 2023 Google LLC
2// SPDX-License-Identifier: Apache-2.0
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16// Tuple support. Included by those ops/* that lack native tuple types, after
17// they define VFromD and before they use the tuples e.g. for LoadInterleaved2.
18// Assumes we are already in the HWY_NAMESPACE and under an include guard.
19
20// If viewing this header standalone, define VFromD to avoid IDE warnings.
21// This is normally set by set_macros-inl.h before this header is included.
22#if !defined(HWY_NAMESPACE)
23#include "hwy/base.h"
24template <class D>
25using VFromD = int;
26#endif
27
28// On SVE, Vec2..4 are aliases to built-in types.
29template <class D>
34
35template <class D>
41
42template <class D>
49
50// D arg is unused but allows deducing D.
51template <class D>
53 return Vec2<D>{v0, v1};
54}
55
56template <class D>
58 return Vec3<D>{v0, v1, v2};
59}
60
61template <class D>
63 VFromD<D> v3) {
64 return Vec4<D>{v0, v1, v2, v3};
65}
66
67template <size_t kIndex, class D>
69 static_assert(kIndex < 2, "Tuple index out of bounds");
70 return kIndex == 0 ? tuple.v0 : tuple.v1;
71}
72
73template <size_t kIndex, class D>
75 static_assert(kIndex < 3, "Tuple index out of bounds");
76 return kIndex == 0 ? tuple.v0 : kIndex == 1 ? tuple.v1 : tuple.v2;
77}
78
79template <size_t kIndex, class D>
81 static_assert(kIndex < 4, "Tuple index out of bounds");
82 return kIndex == 0 ? tuple.v0
83 : kIndex == 1 ? tuple.v1
84 : kIndex == 2 ? tuple.v2
85 : tuple.v3;
86}
87
88template <size_t kIndex, class D>
90 static_assert(kIndex < 2, "Tuple index out of bounds");
91 if (kIndex == 0) {
92 tuple.v0 = val;
93 } else {
94 tuple.v1 = val;
95 }
96 return tuple;
97}
98
99template <size_t kIndex, class D>
101 static_assert(kIndex < 3, "Tuple index out of bounds");
102 if (kIndex == 0) {
103 tuple.v0 = val;
104 } else if (kIndex == 1) {
105 tuple.v1 = val;
106 } else {
107 tuple.v2 = val;
108 }
109 return tuple;
110}
111
112template <size_t kIndex, class D>
114 static_assert(kIndex < 4, "Tuple index out of bounds");
115 if (kIndex == 0) {
116 tuple.v0 = val;
117 } else if (kIndex == 1) {
118 tuple.v1 = val;
119 } else if (kIndex == 2) {
120 tuple.v2 = val;
121 } else {
122 tuple.v3 = val;
123 }
124 return tuple;
125}
#define HWY_API
Definition base.h:171
Definition tuple-inl.h:30
VFromD< D > v0
Definition tuple-inl.h:31
VFromD< D > v1
Definition tuple-inl.h:32
Definition tuple-inl.h:36
VFromD< D > v2
Definition tuple-inl.h:39
VFromD< D > v1
Definition tuple-inl.h:38
VFromD< D > v0
Definition tuple-inl.h:37
Definition tuple-inl.h:43
VFromD< D > v0
Definition tuple-inl.h:44
VFromD< D > v3
Definition tuple-inl.h:47
VFromD< D > v1
Definition tuple-inl.h:45
VFromD< D > v2
Definition tuple-inl.h:46
HWY_API VFromD< D > Get4(Vec4< D > tuple)
Definition tuple-inl.h:80
int VFromD
Definition tuple-inl.h:25
HWY_API Vec2< D > Create2(D, VFromD< D > v0, VFromD< D > v1)
Definition tuple-inl.h:52
HWY_API VFromD< D > Get2(Vec2< D > tuple)
Definition tuple-inl.h:68
HWY_API Vec4< D > Create4(D, VFromD< D > v0, VFromD< D > v1, VFromD< D > v2, VFromD< D > v3)
Definition tuple-inl.h:62
HWY_API Vec3< D > Set3(Vec3< D > tuple, VFromD< D > val)
Definition tuple-inl.h:100
HWY_API Vec4< D > Set4(Vec4< D > tuple, VFromD< D > val)
Definition tuple-inl.h:113
HWY_API VFromD< D > Get3(Vec3< D > tuple)
Definition tuple-inl.h:74
HWY_API Vec2< D > Set2(Vec2< D > tuple, VFromD< D > val)
Definition tuple-inl.h:89
HWY_API Vec3< D > Create3(D, VFromD< D > v0, VFromD< D > v1, VFromD< D > v2)
Definition tuple-inl.h:57