12 #ifndef hifi_task_Varying_h
13 #define hifi_task_Varying_h
15 #include <type_traits>
27 Varying(
const Varying& var) : _concept(var._concept) {}
28 Varying& operator=(
const Varying& var) {
29 _concept = var._concept;
32 template <
class T> Varying(
const T& data,
const std::string& name =
"noname") : _concept(std::make_shared<
Model<T>>(data, name)) {}
34 template <
class T>
bool canCast()
const {
return !!std::dynamic_pointer_cast<Model<T>>(_concept); }
35 template <
class T>
const T& get()
const {
return std::static_pointer_cast<const Model<T>>(_concept)->_data; }
36 template <
class T> T& edit() {
return std::static_pointer_cast<Model<T>>(_concept)->_data; }
38 const std::string name()
const {
return _concept->name(); }
41 Varying operator[] (uint8_t index)
const {
return (*_concept)[index]; }
42 uint8_t length()
const {
return (*_concept).length(); }
44 template <
class T> Varying getN (uint8_t index)
const {
return get<T>()[index]; }
45 template <
class T> Varying editN (uint8_t index) {
return edit<T>()[index]; }
47 bool isNull()
const {
return _concept ==
nullptr; }
52 Concept(
const std::string& name) : _name(name) {}
54 virtual ~Concept() =
default;
56 virtual Varying operator[] (uint8_t index)
const = 0;
57 virtual uint8_t length()
const = 0;
59 const std::string name() {
return _name; }
61 const std::string _name;
63 template <
class T>
class Model :
public Concept {
67 Model(
const Data& data,
const std::string& name) : Concept(name), _data(data) {}
68 virtual ~
Model() =
default;
70 virtual Varying operator[] (uint8_t index)
const override {
73 virtual uint8_t length()
const override {
80 std::shared_ptr<Concept> _concept;
83 template <
typename T0,
typename T1 >
84 class VaryingSet2 :
public std::pair<Varying, Varying> {
86 using Parent = std::pair<Varying, Varying>;
87 typedef void is_proxy_tag;
89 VaryingSet2() : Parent(Varying(T0()), Varying(T1())) {}
90 VaryingSet2(
const VaryingSet2& pair) : Parent(pair.first, pair.second) {}
91 VaryingSet2(
const Varying& first,
const Varying& second) : Parent(first, second) {}
93 const T0& get0()
const {
return first.get<T0>(); }
94 T0& edit0() {
return first.edit<T0>(); }
96 const T1& get1()
const {
return second.get<T1>(); }
97 T1& edit1() {
return second.edit<T1>(); }
99 virtual Varying operator[] (uint8_t index)
const {
101 return std::get<1>((*
this));
103 return std::get<0>((*
this));
106 virtual uint8_t length()
const {
return 2; }
108 Varying asVarying()
const {
return Varying((*
this)); }
111 template <
class T0,
class T1,
class T2>
112 class VaryingSet3 :
public std::tuple<Varying, Varying,Varying>{
114 using Parent = std::tuple<Varying, Varying, Varying>;
116 VaryingSet3() : Parent(Varying(T0()), Varying(T1()), Varying(T2())) {}
117 VaryingSet3(
const VaryingSet3& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src)) {}
118 VaryingSet3(
const Varying& first,
const Varying& second,
const Varying& third) : Parent(first, second, third) {}
120 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
121 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
123 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
124 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
126 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
127 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
129 virtual Varying operator[] (uint8_t index)
const {
131 return std::get<2>((*
this));
132 }
else if (index == 1) {
133 return std::get<1>((*
this));
135 return std::get<0>((*
this));
138 virtual uint8_t length()
const {
return 3; }
140 Varying asVarying()
const {
return Varying((*
this)); }
143 template <
class T0,
class T1,
class T2,
class T3>
144 class VaryingSet4 :
public std::tuple<Varying, Varying, Varying, Varying>{
146 using Parent = std::tuple<Varying, Varying, Varying, Varying>;
148 VaryingSet4() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3())) {}
149 VaryingSet4(
const VaryingSet4& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src)) {}
150 VaryingSet4(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth) : Parent(first, second, third, fourth) {}
152 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
153 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
155 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
156 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
158 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
159 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
161 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
162 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
164 virtual Varying operator[] (uint8_t index)
const {
166 return std::get<3>((*
this));
167 }
else if (index == 2) {
168 return std::get<2>((*
this));
169 }
else if (index == 1) {
170 return std::get<1>((*
this));
172 return std::get<0>((*
this));
175 virtual uint8_t length()
const {
return 4; }
177 Varying asVarying()
const {
return Varying((*
this)); }
180 template <
class T0,
class T1,
class T2,
class T3,
class T4>
181 class VaryingSet5 :
public std::tuple<Varying, Varying, Varying, Varying, Varying>{
183 using Parent = std::tuple<Varying, Varying, Varying, Varying, Varying>;
185 VaryingSet5() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4())) {}
186 VaryingSet5(
const VaryingSet5& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src)) {}
187 VaryingSet5(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth,
const Varying& fifth) : Parent(first, second, third, fourth, fifth) {}
189 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
190 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
192 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
193 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
195 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
196 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
198 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
199 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
201 const T4& get4()
const {
return std::get<4>((*
this)).template get<T4>(); }
202 T4& edit4() {
return std::get<4>((*
this)).template edit<T4>(); }
204 virtual Varying operator[] (uint8_t index)
const {
206 return std::get<4>((*
this));
207 }
else if (index == 3) {
208 return std::get<3>((*
this));
209 }
else if (index == 2) {
210 return std::get<2>((*
this));
211 }
else if (index == 1) {
212 return std::get<1>((*
this));
214 return std::get<0>((*
this));
217 virtual uint8_t length()
const {
return 5; }
219 Varying asVarying()
const {
return Varying((*
this)); }
222 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5>
223 class VaryingSet6 :
public std::tuple<Varying, Varying, Varying, Varying, Varying, Varying>{
225 using Parent = std::tuple<Varying, Varying, Varying, Varying, Varying, Varying>;
227 VaryingSet6() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4()), Varying(T5())) {}
228 VaryingSet6(
const VaryingSet6& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src), std::get<5>(src)) {}
229 VaryingSet6(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth,
const Varying& fifth,
const Varying& sixth) : Parent(first, second, third, fourth, fifth, sixth) {}
231 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
232 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
234 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
235 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
237 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
238 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
240 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
241 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
243 const T4& get4()
const {
return std::get<4>((*
this)).template get<T4>(); }
244 T4& edit4() {
return std::get<4>((*
this)).template edit<T4>(); }
246 const T5& get5()
const {
return std::get<5>((*
this)).template get<T5>(); }
247 T5& edit5() {
return std::get<5>((*
this)).template edit<T5>(); }
249 virtual Varying operator[] (uint8_t index)
const {
252 return std::get<0>((*
this));
254 return std::get<1>((*
this));
256 return std::get<2>((*
this));
258 return std::get<3>((*
this));
260 return std::get<4>((*
this));
262 return std::get<5>((*
this));
265 virtual uint8_t length()
const {
return 6; }
267 Varying asVarying()
const {
return Varying((*
this)); }
270 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6>
271 class VaryingSet7 :
public std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying>{
273 using Parent = std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying>;
275 VaryingSet7() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4()), Varying(T5()), Varying(T6())) {}
276 VaryingSet7(
const VaryingSet7& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src), std::get<5>(src), std::get<6>(src)) {}
277 VaryingSet7(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth,
const Varying& fifth,
const Varying& sixth,
const Varying& seventh) : Parent(first, second, third, fourth, fifth, sixth, seventh) {}
279 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
280 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
282 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
283 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
285 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
286 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
288 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
289 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
291 const T4& get4()
const {
return std::get<4>((*
this)).template get<T4>(); }
292 T4& edit4() {
return std::get<4>((*
this)).template edit<T4>(); }
294 const T5& get5()
const {
return std::get<5>((*
this)).template get<T5>(); }
295 T5& edit5() {
return std::get<5>((*
this)).template edit<T5>(); }
297 const T6& get6()
const {
return std::get<6>((*
this)).template get<T6>(); }
298 T6& edit6() {
return std::get<6>((*
this)).template edit<T6>(); }
300 virtual Varying operator[] (uint8_t index)
const {
303 return std::get<0>((*
this));
305 return std::get<1>((*
this));
307 return std::get<2>((*
this));
309 return std::get<3>((*
this));
311 return std::get<4>((*
this));
313 return std::get<5>((*
this));
315 return std::get<6>((*
this));
318 virtual uint8_t length()
const {
return 7; }
320 Varying asVarying()
const {
return Varying((*
this)); }
323 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7>
324 class VaryingSet8 :
public std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying> {
326 using Parent = std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying>;
328 VaryingSet8() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4()), Varying(T5()), Varying(T6()), Varying(T7())) {}
329 VaryingSet8(
const VaryingSet8& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src), std::get<5>(src), std::get<6>(src), std::get<7>(src)) {}
330 VaryingSet8(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth,
const Varying& fifth,
const Varying& sixth,
const Varying& seventh,
const Varying& eighth) : Parent(first, second, third, fourth, fifth, sixth, seventh, eighth) {}
332 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
333 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
335 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
336 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
338 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
339 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
341 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
342 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
344 const T4& get4()
const {
return std::get<4>((*
this)).template get<T4>(); }
345 T4& edit4() {
return std::get<4>((*
this)).template edit<T4>(); }
347 const T5& get5()
const {
return std::get<5>((*
this)).template get<T5>(); }
348 T5& edit5() {
return std::get<5>((*
this)).template edit<T5>(); }
350 const T6& get6()
const {
return std::get<6>((*
this)).template get<T6>(); }
351 T6& edit6() {
return std::get<6>((*
this)).template edit<T6>(); }
353 const T7& get7()
const {
return std::get<7>((*
this)).template get<T7>(); }
354 T7& edit7() {
return std::get<7>((*
this)).template edit<T7>(); }
356 virtual Varying operator[] (uint8_t index)
const {
359 return std::get<0>((*
this));
361 return std::get<1>((*
this));
363 return std::get<2>((*
this));
365 return std::get<3>((*
this));
367 return std::get<4>((*
this));
369 return std::get<5>((*
this));
371 return std::get<6>((*
this));
373 return std::get<7>((*
this));
376 virtual uint8_t length()
const {
return 8; }
378 Varying asVarying()
const {
return Varying((*
this)); }
381 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8>
382 class VaryingSet9 :
public std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying> {
384 using Parent = std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying>;
386 VaryingSet9() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4()), Varying(T5()), Varying(T6()), Varying(T7()), Varying(T8())) {}
387 VaryingSet9(
const VaryingSet9& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src), std::get<5>(src), std::get<6>(src), std::get<7>(src), std::get<8>(src)) {}
388 VaryingSet9(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth,
const Varying& fifth,
const Varying& sixth,
const Varying& seventh,
const Varying& eighth,
const Varying& nine) : Parent(first, second, third, fourth, fifth, sixth, seventh, eighth, nine) {}
390 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
391 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
393 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
394 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
396 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
397 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
399 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
400 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
402 const T4& get4()
const {
return std::get<4>((*
this)).template get<T4>(); }
403 T4& edit4() {
return std::get<4>((*
this)).template edit<T4>(); }
405 const T5& get5()
const {
return std::get<5>((*
this)).template get<T5>(); }
406 T5& edit5() {
return std::get<5>((*
this)).template edit<T5>(); }
408 const T6& get6()
const {
return std::get<6>((*
this)).template get<T6>(); }
409 T6& edit6() {
return std::get<6>((*
this)).template edit<T6>(); }
411 const T7& get7()
const {
return std::get<7>((*
this)).template get<T7>(); }
412 T7& edit7() {
return std::get<7>((*
this)).template edit<T7>(); }
414 const T8& get8()
const {
return std::get<8>((*
this)).template get<T8>(); }
415 T8& edit8() {
return std::get<8>((*
this)).template edit<T8>(); }
416 virtual Varying operator[] (uint8_t index)
const {
419 return std::get<0>((*
this));
421 return std::get<1>((*
this));
423 return std::get<2>((*
this));
425 return std::get<3>((*
this));
427 return std::get<4>((*
this));
429 return std::get<5>((*
this));
431 return std::get<6>((*
this));
433 return std::get<7>((*
this));
435 return std::get<8>((*
this));
438 virtual uint8_t length()
const {
return 9; }
440 Varying asVarying()
const {
return Varying((*
this)); }
444 template <
class T0,
class T1,
class T2,
class T3,
class T4,
class T5,
class T6,
class T7,
class T8,
class T9>
445 class VaryingSet10 :
public std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying> {
447 using Parent = std::tuple<Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying, Varying>;
449 VaryingSet10() : Parent(Varying(T0()), Varying(T1()), Varying(T2()), Varying(T3()), Varying(T4()), Varying(T5()), Varying(T6()), Varying(T7()), Varying(T8()), Varying(T9())) {}
450 VaryingSet10(
const VaryingSet10& src) : Parent(std::get<0>(src), std::get<1>(src), std::get<2>(src), std::get<3>(src), std::get<4>(src), std::get<5>(src), std::get<6>(src), std::get<7>(src), std::get<8>(src), std::get<9>(src)) {}
451 VaryingSet10(
const Varying& first,
const Varying& second,
const Varying& third,
const Varying& fourth,
const Varying& fifth,
const Varying& sixth,
const Varying& seventh,
const Varying& eighth,
const Varying& nine,
const Varying& ten) : Parent(first, second, third, fourth, fifth, sixth, seventh, eighth, nine, ten) {}
453 const T0& get0()
const {
return std::get<0>((*
this)).template get<T0>(); }
454 T0& edit0() {
return std::get<0>((*
this)).template edit<T0>(); }
456 const T1& get1()
const {
return std::get<1>((*
this)).template get<T1>(); }
457 T1& edit1() {
return std::get<1>((*
this)).template edit<T1>(); }
459 const T2& get2()
const {
return std::get<2>((*
this)).template get<T2>(); }
460 T2& edit2() {
return std::get<2>((*
this)).template edit<T2>(); }
462 const T3& get3()
const {
return std::get<3>((*
this)).template get<T3>(); }
463 T3& edit3() {
return std::get<3>((*
this)).template edit<T3>(); }
465 const T4& get4()
const {
return std::get<4>((*
this)).template get<T4>(); }
466 T4& edit4() {
return std::get<4>((*
this)).template edit<T4>(); }
468 const T5& get5()
const {
return std::get<5>((*
this)).template get<T5>(); }
469 T5& edit5() {
return std::get<5>((*
this)).template edit<T5>(); }
471 const T6& get6()
const {
return std::get<6>((*
this)).template get<T6>(); }
472 T6& edit6() {
return std::get<6>((*
this)).template edit<T6>(); }
474 const T7& get7()
const {
return std::get<7>((*
this)).template get<T7>(); }
475 T7& edit7() {
return std::get<7>((*
this)).template edit<T7>(); }
477 const T8& get8()
const {
return std::get<8>((*
this)).template get<T8>(); }
478 T8& edit8() {
return std::get<8>((*
this)).template edit<T8>(); }
480 const T9& get9()
const {
return std::get<9>((*
this)).template get<T9>(); }
481 T9& edit9() {
return std::get<9>((*
this)).template edit<T9>(); }
483 virtual Varying operator[] (uint8_t index)
const {
486 return std::get<0>((*
this));
488 return std::get<1>((*
this));
490 return std::get<2>((*
this));
492 return std::get<3>((*
this));
494 return std::get<4>((*
this));
496 return std::get<5>((*
this));
498 return std::get<6>((*
this));
500 return std::get<7>((*
this));
502 return std::get<8>((*
this));
504 return std::get<9>((*
this));
507 virtual uint8_t length()
const {
return 10; }
509 Varying asVarying()
const {
return Varying((*
this)); }
512 template <
class T,
int NUM >
513 class VaryingArray :
public std::array<Varying, NUM> {
516 for (
size_t i = 0; i < NUM; i++) {
517 (*this)[i] = Varying(T());
521 VaryingArray(std::initializer_list<Varying> list) {
522 assert(list.size() == NUM);
523 std::copy(list.begin(), list.end(), std::array<Varying, NUM>::begin());
A generic 3D model displaying geometry loaded from a URL.
Definition: Model.h:84