1 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!!
3 // Copyright 2008 Google Inc.
4 // All Rights Reserved.
6 // Redistribution and use in source and binary forms, with or without
7 // modification, are permitted provided that the following conditions are
10 // * Redistributions of source code must retain the above copyright
11 // notice, this list of conditions and the following disclaimer.
12 // * Redistributions in binary form must reproduce the above
13 // copyright notice, this list of conditions and the following disclaimer
14 // in the documentation and/or other materials provided with the
16 // * Neither the name of Google Inc. nor the names of its
17 // contributors may be used to endorse or promote products derived from
18 // this software without specific prior written permission.
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 // Author: vladl@google.com (Vlad Losev)
34 // Type and function utilities for implementing parameterized tests.
35 // This file is generated by a SCRIPT. DO NOT EDIT BY HAND!
37 // Currently Google Test supports at most 50 arguments in Values,
38 // and at most 10 arguments in Combine. Please contact
39 // googletestframework@googlegroups.com if you need more.
40 // Please note that the number of arguments to Combine is limited
41 // by the maximum arity of the implementation of tr1::tuple which is
42 // currently set at 10.
44 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
45 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
47 #include <gtest/internal/gtest-port.h>
49 #if GTEST_HAS_PARAM_TEST
51 #include <gtest/internal/gtest-param-util.h>
56 // Used in the Values() function to provide polymorphic capabilities.
57 template <typename T1>
60 explicit ValueArray1(T1 v1) : v1_(v1) {}
63 operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
66 // No implementation - assignment is unsupported.
67 void operator=(const ValueArray1& other);
72 template <typename T1, typename T2>
75 ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
78 operator ParamGenerator<T>() const {
79 const T array[] = {v1_, v2_};
80 return ValuesIn(array);
84 // No implementation - assignment is unsupported.
85 void operator=(const ValueArray2& other);
91 template <typename T1, typename T2, typename T3>
94 ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
97 operator ParamGenerator<T>() const {
98 const T array[] = {v1_, v2_, v3_};
99 return ValuesIn(array);
103 // No implementation - assignment is unsupported.
104 void operator=(const ValueArray3& other);
111 template <typename T1, typename T2, typename T3, typename T4>
114 ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
117 template <typename T>
118 operator ParamGenerator<T>() const {
119 const T array[] = {v1_, v2_, v3_, v4_};
120 return ValuesIn(array);
124 // No implementation - assignment is unsupported.
125 void operator=(const ValueArray4& other);
133 template <typename T1, typename T2, typename T3, typename T4, typename T5>
136 ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
139 template <typename T>
140 operator ParamGenerator<T>() const {
141 const T array[] = {v1_, v2_, v3_, v4_, v5_};
142 return ValuesIn(array);
146 // No implementation - assignment is unsupported.
147 void operator=(const ValueArray5& other);
156 template <typename T1, typename T2, typename T3, typename T4, typename T5,
160 ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
161 v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
163 template <typename T>
164 operator ParamGenerator<T>() const {
165 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_};
166 return ValuesIn(array);
170 // No implementation - assignment is unsupported.
171 void operator=(const ValueArray6& other);
181 template <typename T1, typename T2, typename T3, typename T4, typename T5,
182 typename T6, typename T7>
185 ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
186 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
188 template <typename T>
189 operator ParamGenerator<T>() const {
190 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_};
191 return ValuesIn(array);
195 // No implementation - assignment is unsupported.
196 void operator=(const ValueArray7& other);
207 template <typename T1, typename T2, typename T3, typename T4, typename T5,
208 typename T6, typename T7, typename T8>
211 ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
212 T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
215 template <typename T>
216 operator ParamGenerator<T>() const {
217 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_};
218 return ValuesIn(array);
222 // No implementation - assignment is unsupported.
223 void operator=(const ValueArray8& other);
235 template <typename T1, typename T2, typename T3, typename T4, typename T5,
236 typename T6, typename T7, typename T8, typename T9>
239 ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
240 T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
243 template <typename T>
244 operator ParamGenerator<T>() const {
245 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_};
246 return ValuesIn(array);
250 // No implementation - assignment is unsupported.
251 void operator=(const ValueArray9& other);
264 template <typename T1, typename T2, typename T3, typename T4, typename T5,
265 typename T6, typename T7, typename T8, typename T9, typename T10>
268 ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
269 T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
270 v8_(v8), v9_(v9), v10_(v10) {}
272 template <typename T>
273 operator ParamGenerator<T>() const {
274 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_};
275 return ValuesIn(array);
279 // No implementation - assignment is unsupported.
280 void operator=(const ValueArray10& other);
294 template <typename T1, typename T2, typename T3, typename T4, typename T5,
295 typename T6, typename T7, typename T8, typename T9, typename T10,
299 ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
300 T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
301 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
303 template <typename T>
304 operator ParamGenerator<T>() const {
305 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_};
306 return ValuesIn(array);
310 // No implementation - assignment is unsupported.
311 void operator=(const ValueArray11& other);
326 template <typename T1, typename T2, typename T3, typename T4, typename T5,
327 typename T6, typename T7, typename T8, typename T9, typename T10,
328 typename T11, typename T12>
331 ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
332 T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
333 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
335 template <typename T>
336 operator ParamGenerator<T>() const {
337 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
339 return ValuesIn(array);
343 // No implementation - assignment is unsupported.
344 void operator=(const ValueArray12& other);
360 template <typename T1, typename T2, typename T3, typename T4, typename T5,
361 typename T6, typename T7, typename T8, typename T9, typename T10,
362 typename T11, typename T12, typename T13>
365 ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
366 T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
367 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
368 v12_(v12), v13_(v13) {}
370 template <typename T>
371 operator ParamGenerator<T>() const {
372 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
374 return ValuesIn(array);
378 // No implementation - assignment is unsupported.
379 void operator=(const ValueArray13& other);
396 template <typename T1, typename T2, typename T3, typename T4, typename T5,
397 typename T6, typename T7, typename T8, typename T9, typename T10,
398 typename T11, typename T12, typename T13, typename T14>
401 ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
402 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
403 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
404 v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
406 template <typename T>
407 operator ParamGenerator<T>() const {
408 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
410 return ValuesIn(array);
414 // No implementation - assignment is unsupported.
415 void operator=(const ValueArray14& other);
433 template <typename T1, typename T2, typename T3, typename T4, typename T5,
434 typename T6, typename T7, typename T8, typename T9, typename T10,
435 typename T11, typename T12, typename T13, typename T14, typename T15>
438 ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
439 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
440 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
441 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
443 template <typename T>
444 operator ParamGenerator<T>() const {
445 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
446 v12_, v13_, v14_, v15_};
447 return ValuesIn(array);
451 // No implementation - assignment is unsupported.
452 void operator=(const ValueArray15& other);
471 template <typename T1, typename T2, typename T3, typename T4, typename T5,
472 typename T6, typename T7, typename T8, typename T9, typename T10,
473 typename T11, typename T12, typename T13, typename T14, typename T15,
477 ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
478 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
479 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
480 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
483 template <typename T>
484 operator ParamGenerator<T>() const {
485 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
486 v12_, v13_, v14_, v15_, v16_};
487 return ValuesIn(array);
491 // No implementation - assignment is unsupported.
492 void operator=(const ValueArray16& other);
512 template <typename T1, typename T2, typename T3, typename T4, typename T5,
513 typename T6, typename T7, typename T8, typename T9, typename T10,
514 typename T11, typename T12, typename T13, typename T14, typename T15,
515 typename T16, typename T17>
518 ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
519 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
520 T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
521 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
522 v15_(v15), v16_(v16), v17_(v17) {}
524 template <typename T>
525 operator ParamGenerator<T>() const {
526 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
527 v12_, v13_, v14_, v15_, v16_, v17_};
528 return ValuesIn(array);
532 // No implementation - assignment is unsupported.
533 void operator=(const ValueArray17& other);
554 template <typename T1, typename T2, typename T3, typename T4, typename T5,
555 typename T6, typename T7, typename T8, typename T9, typename T10,
556 typename T11, typename T12, typename T13, typename T14, typename T15,
557 typename T16, typename T17, typename T18>
560 ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
561 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
562 T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
563 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
564 v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
566 template <typename T>
567 operator ParamGenerator<T>() const {
568 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
569 v12_, v13_, v14_, v15_, v16_, v17_, v18_};
570 return ValuesIn(array);
574 // No implementation - assignment is unsupported.
575 void operator=(const ValueArray18& other);
597 template <typename T1, typename T2, typename T3, typename T4, typename T5,
598 typename T6, typename T7, typename T8, typename T9, typename T10,
599 typename T11, typename T12, typename T13, typename T14, typename T15,
600 typename T16, typename T17, typename T18, typename T19>
603 ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
604 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
605 T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
606 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
607 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
609 template <typename T>
610 operator ParamGenerator<T>() const {
611 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
612 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_};
613 return ValuesIn(array);
617 // No implementation - assignment is unsupported.
618 void operator=(const ValueArray19& other);
641 template <typename T1, typename T2, typename T3, typename T4, typename T5,
642 typename T6, typename T7, typename T8, typename T9, typename T10,
643 typename T11, typename T12, typename T13, typename T14, typename T15,
644 typename T16, typename T17, typename T18, typename T19, typename T20>
647 ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
648 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
649 T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
650 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
651 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
652 v19_(v19), v20_(v20) {}
654 template <typename T>
655 operator ParamGenerator<T>() const {
656 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
657 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_};
658 return ValuesIn(array);
662 // No implementation - assignment is unsupported.
663 void operator=(const ValueArray20& other);
687 template <typename T1, typename T2, typename T3, typename T4, typename T5,
688 typename T6, typename T7, typename T8, typename T9, typename T10,
689 typename T11, typename T12, typename T13, typename T14, typename T15,
690 typename T16, typename T17, typename T18, typename T19, typename T20,
694 ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
695 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
696 T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
697 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
698 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
699 v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
701 template <typename T>
702 operator ParamGenerator<T>() const {
703 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
704 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_};
705 return ValuesIn(array);
709 // No implementation - assignment is unsupported.
710 void operator=(const ValueArray21& other);
735 template <typename T1, typename T2, typename T3, typename T4, typename T5,
736 typename T6, typename T7, typename T8, typename T9, typename T10,
737 typename T11, typename T12, typename T13, typename T14, typename T15,
738 typename T16, typename T17, typename T18, typename T19, typename T20,
739 typename T21, typename T22>
742 ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
743 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
744 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
745 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
746 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
747 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
749 template <typename T>
750 operator ParamGenerator<T>() const {
751 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
752 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_};
753 return ValuesIn(array);
757 // No implementation - assignment is unsupported.
758 void operator=(const ValueArray22& other);
784 template <typename T1, typename T2, typename T3, typename T4, typename T5,
785 typename T6, typename T7, typename T8, typename T9, typename T10,
786 typename T11, typename T12, typename T13, typename T14, typename T15,
787 typename T16, typename T17, typename T18, typename T19, typename T20,
788 typename T21, typename T22, typename T23>
791 ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
792 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
793 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
794 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
795 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
796 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
799 template <typename T>
800 operator ParamGenerator<T>() const {
801 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
802 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_,
804 return ValuesIn(array);
808 // No implementation - assignment is unsupported.
809 void operator=(const ValueArray23& other);
836 template <typename T1, typename T2, typename T3, typename T4, typename T5,
837 typename T6, typename T7, typename T8, typename T9, typename T10,
838 typename T11, typename T12, typename T13, typename T14, typename T15,
839 typename T16, typename T17, typename T18, typename T19, typename T20,
840 typename T21, typename T22, typename T23, typename T24>
843 ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
844 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
845 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
846 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
847 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
848 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
849 v22_(v22), v23_(v23), v24_(v24) {}
851 template <typename T>
852 operator ParamGenerator<T>() const {
853 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
854 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
856 return ValuesIn(array);
860 // No implementation - assignment is unsupported.
861 void operator=(const ValueArray24& other);
889 template <typename T1, typename T2, typename T3, typename T4, typename T5,
890 typename T6, typename T7, typename T8, typename T9, typename T10,
891 typename T11, typename T12, typename T13, typename T14, typename T15,
892 typename T16, typename T17, typename T18, typename T19, typename T20,
893 typename T21, typename T22, typename T23, typename T24, typename T25>
896 ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
897 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
898 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
899 T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
900 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
901 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
902 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
904 template <typename T>
905 operator ParamGenerator<T>() const {
906 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
907 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
909 return ValuesIn(array);
913 // No implementation - assignment is unsupported.
914 void operator=(const ValueArray25& other);
943 template <typename T1, typename T2, typename T3, typename T4, typename T5,
944 typename T6, typename T7, typename T8, typename T9, typename T10,
945 typename T11, typename T12, typename T13, typename T14, typename T15,
946 typename T16, typename T17, typename T18, typename T19, typename T20,
947 typename T21, typename T22, typename T23, typename T24, typename T25,
951 ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
952 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
953 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
954 T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
955 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
956 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
957 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
959 template <typename T>
960 operator ParamGenerator<T>() const {
961 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
962 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
964 return ValuesIn(array);
968 // No implementation - assignment is unsupported.
969 void operator=(const ValueArray26& other);
999 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1000 typename T6, typename T7, typename T8, typename T9, typename T10,
1001 typename T11, typename T12, typename T13, typename T14, typename T15,
1002 typename T16, typename T17, typename T18, typename T19, typename T20,
1003 typename T21, typename T22, typename T23, typename T24, typename T25,
1004 typename T26, typename T27>
1005 class ValueArray27 {
1007 ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1008 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1009 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1010 T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1011 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1012 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1013 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1014 v26_(v26), v27_(v27) {}
1016 template <typename T>
1017 operator ParamGenerator<T>() const {
1018 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1019 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1020 v24_, v25_, v26_, v27_};
1021 return ValuesIn(array);
1025 // No implementation - assignment is unsupported.
1026 void operator=(const ValueArray27& other);
1057 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1058 typename T6, typename T7, typename T8, typename T9, typename T10,
1059 typename T11, typename T12, typename T13, typename T14, typename T15,
1060 typename T16, typename T17, typename T18, typename T19, typename T20,
1061 typename T21, typename T22, typename T23, typename T24, typename T25,
1062 typename T26, typename T27, typename T28>
1063 class ValueArray28 {
1065 ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1066 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1067 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1068 T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1069 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1070 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1071 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1072 v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
1074 template <typename T>
1075 operator ParamGenerator<T>() const {
1076 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1077 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1078 v24_, v25_, v26_, v27_, v28_};
1079 return ValuesIn(array);
1083 // No implementation - assignment is unsupported.
1084 void operator=(const ValueArray28& other);
1116 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1117 typename T6, typename T7, typename T8, typename T9, typename T10,
1118 typename T11, typename T12, typename T13, typename T14, typename T15,
1119 typename T16, typename T17, typename T18, typename T19, typename T20,
1120 typename T21, typename T22, typename T23, typename T24, typename T25,
1121 typename T26, typename T27, typename T28, typename T29>
1122 class ValueArray29 {
1124 ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1125 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1126 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1127 T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1128 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1129 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1130 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1131 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
1133 template <typename T>
1134 operator ParamGenerator<T>() const {
1135 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1136 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1137 v24_, v25_, v26_, v27_, v28_, v29_};
1138 return ValuesIn(array);
1142 // No implementation - assignment is unsupported.
1143 void operator=(const ValueArray29& other);
1176 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1177 typename T6, typename T7, typename T8, typename T9, typename T10,
1178 typename T11, typename T12, typename T13, typename T14, typename T15,
1179 typename T16, typename T17, typename T18, typename T19, typename T20,
1180 typename T21, typename T22, typename T23, typename T24, typename T25,
1181 typename T26, typename T27, typename T28, typename T29, typename T30>
1182 class ValueArray30 {
1184 ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1185 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1186 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1187 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
1188 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1189 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1190 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1191 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1192 v29_(v29), v30_(v30) {}
1194 template <typename T>
1195 operator ParamGenerator<T>() const {
1196 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1197 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1198 v24_, v25_, v26_, v27_, v28_, v29_, v30_};
1199 return ValuesIn(array);
1203 // No implementation - assignment is unsupported.
1204 void operator=(const ValueArray30& other);
1238 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1239 typename T6, typename T7, typename T8, typename T9, typename T10,
1240 typename T11, typename T12, typename T13, typename T14, typename T15,
1241 typename T16, typename T17, typename T18, typename T19, typename T20,
1242 typename T21, typename T22, typename T23, typename T24, typename T25,
1243 typename T26, typename T27, typename T28, typename T29, typename T30,
1245 class ValueArray31 {
1247 ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1248 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1249 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1250 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
1251 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1252 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1253 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1254 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1255 v29_(v29), v30_(v30), v31_(v31) {}
1257 template <typename T>
1258 operator ParamGenerator<T>() const {
1259 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1260 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1261 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_};
1262 return ValuesIn(array);
1266 // No implementation - assignment is unsupported.
1267 void operator=(const ValueArray31& other);
1302 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1303 typename T6, typename T7, typename T8, typename T9, typename T10,
1304 typename T11, typename T12, typename T13, typename T14, typename T15,
1305 typename T16, typename T17, typename T18, typename T19, typename T20,
1306 typename T21, typename T22, typename T23, typename T24, typename T25,
1307 typename T26, typename T27, typename T28, typename T29, typename T30,
1308 typename T31, typename T32>
1309 class ValueArray32 {
1311 ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1312 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1313 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1314 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
1315 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1316 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1317 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1318 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1319 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
1321 template <typename T>
1322 operator ParamGenerator<T>() const {
1323 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1324 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1325 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_};
1326 return ValuesIn(array);
1330 // No implementation - assignment is unsupported.
1331 void operator=(const ValueArray32& other);
1367 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1368 typename T6, typename T7, typename T8, typename T9, typename T10,
1369 typename T11, typename T12, typename T13, typename T14, typename T15,
1370 typename T16, typename T17, typename T18, typename T19, typename T20,
1371 typename T21, typename T22, typename T23, typename T24, typename T25,
1372 typename T26, typename T27, typename T28, typename T29, typename T30,
1373 typename T31, typename T32, typename T33>
1374 class ValueArray33 {
1376 ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1377 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1378 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1379 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
1380 T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1381 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1382 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1383 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1384 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1387 template <typename T>
1388 operator ParamGenerator<T>() const {
1389 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1390 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1391 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_};
1392 return ValuesIn(array);
1396 // No implementation - assignment is unsupported.
1397 void operator=(const ValueArray33& other);
1434 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1435 typename T6, typename T7, typename T8, typename T9, typename T10,
1436 typename T11, typename T12, typename T13, typename T14, typename T15,
1437 typename T16, typename T17, typename T18, typename T19, typename T20,
1438 typename T21, typename T22, typename T23, typename T24, typename T25,
1439 typename T26, typename T27, typename T28, typename T29, typename T30,
1440 typename T31, typename T32, typename T33, typename T34>
1441 class ValueArray34 {
1443 ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1444 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1445 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1446 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1447 T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1448 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1449 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1450 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1451 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1452 v33_(v33), v34_(v34) {}
1454 template <typename T>
1455 operator ParamGenerator<T>() const {
1456 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1457 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1458 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_};
1459 return ValuesIn(array);
1463 // No implementation - assignment is unsupported.
1464 void operator=(const ValueArray34& other);
1502 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1503 typename T6, typename T7, typename T8, typename T9, typename T10,
1504 typename T11, typename T12, typename T13, typename T14, typename T15,
1505 typename T16, typename T17, typename T18, typename T19, typename T20,
1506 typename T21, typename T22, typename T23, typename T24, typename T25,
1507 typename T26, typename T27, typename T28, typename T29, typename T30,
1508 typename T31, typename T32, typename T33, typename T34, typename T35>
1509 class ValueArray35 {
1511 ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1512 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1513 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1514 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1515 T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
1516 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
1517 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
1518 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
1519 v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
1520 v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
1522 template <typename T>
1523 operator ParamGenerator<T>() const {
1524 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1525 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1526 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_,
1528 return ValuesIn(array);
1532 // No implementation - assignment is unsupported.
1533 void operator=(const ValueArray35& other);
1572 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1573 typename T6, typename T7, typename T8, typename T9, typename T10,
1574 typename T11, typename T12, typename T13, typename T14, typename T15,
1575 typename T16, typename T17, typename T18, typename T19, typename T20,
1576 typename T21, typename T22, typename T23, typename T24, typename T25,
1577 typename T26, typename T27, typename T28, typename T29, typename T30,
1578 typename T31, typename T32, typename T33, typename T34, typename T35,
1580 class ValueArray36 {
1582 ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1583 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1584 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1585 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1586 T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
1587 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
1588 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
1589 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
1590 v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
1591 v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
1593 template <typename T>
1594 operator ParamGenerator<T>() const {
1595 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1596 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1597 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1599 return ValuesIn(array);
1603 // No implementation - assignment is unsupported.
1604 void operator=(const ValueArray36& other);
1644 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1645 typename T6, typename T7, typename T8, typename T9, typename T10,
1646 typename T11, typename T12, typename T13, typename T14, typename T15,
1647 typename T16, typename T17, typename T18, typename T19, typename T20,
1648 typename T21, typename T22, typename T23, typename T24, typename T25,
1649 typename T26, typename T27, typename T28, typename T29, typename T30,
1650 typename T31, typename T32, typename T33, typename T34, typename T35,
1651 typename T36, typename T37>
1652 class ValueArray37 {
1654 ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1655 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1656 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1657 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1658 T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
1659 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
1660 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
1661 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
1662 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
1663 v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
1664 v36_(v36), v37_(v37) {}
1666 template <typename T>
1667 operator ParamGenerator<T>() const {
1668 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1669 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1670 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1672 return ValuesIn(array);
1676 // No implementation - assignment is unsupported.
1677 void operator=(const ValueArray37& other);
1718 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1719 typename T6, typename T7, typename T8, typename T9, typename T10,
1720 typename T11, typename T12, typename T13, typename T14, typename T15,
1721 typename T16, typename T17, typename T18, typename T19, typename T20,
1722 typename T21, typename T22, typename T23, typename T24, typename T25,
1723 typename T26, typename T27, typename T28, typename T29, typename T30,
1724 typename T31, typename T32, typename T33, typename T34, typename T35,
1725 typename T36, typename T37, typename T38>
1726 class ValueArray38 {
1728 ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1729 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1730 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1731 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1732 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
1733 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1734 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1735 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1736 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1737 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1738 v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
1740 template <typename T>
1741 operator ParamGenerator<T>() const {
1742 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1743 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1744 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1746 return ValuesIn(array);
1750 // No implementation - assignment is unsupported.
1751 void operator=(const ValueArray38& other);
1793 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1794 typename T6, typename T7, typename T8, typename T9, typename T10,
1795 typename T11, typename T12, typename T13, typename T14, typename T15,
1796 typename T16, typename T17, typename T18, typename T19, typename T20,
1797 typename T21, typename T22, typename T23, typename T24, typename T25,
1798 typename T26, typename T27, typename T28, typename T29, typename T30,
1799 typename T31, typename T32, typename T33, typename T34, typename T35,
1800 typename T36, typename T37, typename T38, typename T39>
1801 class ValueArray39 {
1803 ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1804 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1805 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1806 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1807 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
1808 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
1809 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
1810 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
1811 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
1812 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
1813 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
1815 template <typename T>
1816 operator ParamGenerator<T>() const {
1817 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1818 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1819 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1820 v36_, v37_, v38_, v39_};
1821 return ValuesIn(array);
1825 // No implementation - assignment is unsupported.
1826 void operator=(const ValueArray39& other);
1869 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1870 typename T6, typename T7, typename T8, typename T9, typename T10,
1871 typename T11, typename T12, typename T13, typename T14, typename T15,
1872 typename T16, typename T17, typename T18, typename T19, typename T20,
1873 typename T21, typename T22, typename T23, typename T24, typename T25,
1874 typename T26, typename T27, typename T28, typename T29, typename T30,
1875 typename T31, typename T32, typename T33, typename T34, typename T35,
1876 typename T36, typename T37, typename T38, typename T39, typename T40>
1877 class ValueArray40 {
1879 ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1880 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1881 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1882 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1883 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
1884 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
1885 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
1886 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
1887 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
1888 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
1889 v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
1892 template <typename T>
1893 operator ParamGenerator<T>() const {
1894 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1895 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1896 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1897 v36_, v37_, v38_, v39_, v40_};
1898 return ValuesIn(array);
1902 // No implementation - assignment is unsupported.
1903 void operator=(const ValueArray40& other);
1947 template <typename T1, typename T2, typename T3, typename T4, typename T5,
1948 typename T6, typename T7, typename T8, typename T9, typename T10,
1949 typename T11, typename T12, typename T13, typename T14, typename T15,
1950 typename T16, typename T17, typename T18, typename T19, typename T20,
1951 typename T21, typename T22, typename T23, typename T24, typename T25,
1952 typename T26, typename T27, typename T28, typename T29, typename T30,
1953 typename T31, typename T32, typename T33, typename T34, typename T35,
1954 typename T36, typename T37, typename T38, typename T39, typename T40,
1956 class ValueArray41 {
1958 ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
1959 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
1960 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
1961 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
1962 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
1963 T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
1964 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
1965 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
1966 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
1967 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
1968 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
1969 v39_(v39), v40_(v40), v41_(v41) {}
1971 template <typename T>
1972 operator ParamGenerator<T>() const {
1973 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
1974 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
1975 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
1976 v36_, v37_, v38_, v39_, v40_, v41_};
1977 return ValuesIn(array);
1981 // No implementation - assignment is unsupported.
1982 void operator=(const ValueArray41& other);
2027 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2028 typename T6, typename T7, typename T8, typename T9, typename T10,
2029 typename T11, typename T12, typename T13, typename T14, typename T15,
2030 typename T16, typename T17, typename T18, typename T19, typename T20,
2031 typename T21, typename T22, typename T23, typename T24, typename T25,
2032 typename T26, typename T27, typename T28, typename T29, typename T30,
2033 typename T31, typename T32, typename T33, typename T34, typename T35,
2034 typename T36, typename T37, typename T38, typename T39, typename T40,
2035 typename T41, typename T42>
2036 class ValueArray42 {
2038 ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2039 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2040 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2041 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2042 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2043 T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2044 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2045 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2046 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2047 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2048 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2049 v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
2051 template <typename T>
2052 operator ParamGenerator<T>() const {
2053 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2054 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2055 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2056 v36_, v37_, v38_, v39_, v40_, v41_, v42_};
2057 return ValuesIn(array);
2061 // No implementation - assignment is unsupported.
2062 void operator=(const ValueArray42& other);
2108 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2109 typename T6, typename T7, typename T8, typename T9, typename T10,
2110 typename T11, typename T12, typename T13, typename T14, typename T15,
2111 typename T16, typename T17, typename T18, typename T19, typename T20,
2112 typename T21, typename T22, typename T23, typename T24, typename T25,
2113 typename T26, typename T27, typename T28, typename T29, typename T30,
2114 typename T31, typename T32, typename T33, typename T34, typename T35,
2115 typename T36, typename T37, typename T38, typename T39, typename T40,
2116 typename T41, typename T42, typename T43>
2117 class ValueArray43 {
2119 ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2120 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2121 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2122 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2123 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2124 T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
2125 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
2126 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
2127 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
2128 v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
2129 v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
2130 v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
2132 template <typename T>
2133 operator ParamGenerator<T>() const {
2134 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2135 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2136 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2137 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_};
2138 return ValuesIn(array);
2142 // No implementation - assignment is unsupported.
2143 void operator=(const ValueArray43& other);
2190 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2191 typename T6, typename T7, typename T8, typename T9, typename T10,
2192 typename T11, typename T12, typename T13, typename T14, typename T15,
2193 typename T16, typename T17, typename T18, typename T19, typename T20,
2194 typename T21, typename T22, typename T23, typename T24, typename T25,
2195 typename T26, typename T27, typename T28, typename T29, typename T30,
2196 typename T31, typename T32, typename T33, typename T34, typename T35,
2197 typename T36, typename T37, typename T38, typename T39, typename T40,
2198 typename T41, typename T42, typename T43, typename T44>
2199 class ValueArray44 {
2201 ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2202 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2203 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2204 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2205 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2206 T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
2207 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
2208 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
2209 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
2210 v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
2211 v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
2212 v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
2213 v43_(v43), v44_(v44) {}
2215 template <typename T>
2216 operator ParamGenerator<T>() const {
2217 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2218 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2219 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2220 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_};
2221 return ValuesIn(array);
2225 // No implementation - assignment is unsupported.
2226 void operator=(const ValueArray44& other);
2274 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2275 typename T6, typename T7, typename T8, typename T9, typename T10,
2276 typename T11, typename T12, typename T13, typename T14, typename T15,
2277 typename T16, typename T17, typename T18, typename T19, typename T20,
2278 typename T21, typename T22, typename T23, typename T24, typename T25,
2279 typename T26, typename T27, typename T28, typename T29, typename T30,
2280 typename T31, typename T32, typename T33, typename T34, typename T35,
2281 typename T36, typename T37, typename T38, typename T39, typename T40,
2282 typename T41, typename T42, typename T43, typename T44, typename T45>
2283 class ValueArray45 {
2285 ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2286 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2287 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2288 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2289 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2290 T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
2291 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
2292 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
2293 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
2294 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
2295 v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
2296 v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
2297 v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
2299 template <typename T>
2300 operator ParamGenerator<T>() const {
2301 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2302 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2303 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2304 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_};
2305 return ValuesIn(array);
2309 // No implementation - assignment is unsupported.
2310 void operator=(const ValueArray45& other);
2359 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2360 typename T6, typename T7, typename T8, typename T9, typename T10,
2361 typename T11, typename T12, typename T13, typename T14, typename T15,
2362 typename T16, typename T17, typename T18, typename T19, typename T20,
2363 typename T21, typename T22, typename T23, typename T24, typename T25,
2364 typename T26, typename T27, typename T28, typename T29, typename T30,
2365 typename T31, typename T32, typename T33, typename T34, typename T35,
2366 typename T36, typename T37, typename T38, typename T39, typename T40,
2367 typename T41, typename T42, typename T43, typename T44, typename T45,
2369 class ValueArray46 {
2371 ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2372 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2373 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2374 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2375 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2376 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
2377 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2378 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2379 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2380 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2381 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2382 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2383 v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
2385 template <typename T>
2386 operator ParamGenerator<T>() const {
2387 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2388 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2389 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2390 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_};
2391 return ValuesIn(array);
2395 // No implementation - assignment is unsupported.
2396 void operator=(const ValueArray46& other);
2446 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2447 typename T6, typename T7, typename T8, typename T9, typename T10,
2448 typename T11, typename T12, typename T13, typename T14, typename T15,
2449 typename T16, typename T17, typename T18, typename T19, typename T20,
2450 typename T21, typename T22, typename T23, typename T24, typename T25,
2451 typename T26, typename T27, typename T28, typename T29, typename T30,
2452 typename T31, typename T32, typename T33, typename T34, typename T35,
2453 typename T36, typename T37, typename T38, typename T39, typename T40,
2454 typename T41, typename T42, typename T43, typename T44, typename T45,
2455 typename T46, typename T47>
2456 class ValueArray47 {
2458 ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2459 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2460 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2461 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2462 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2463 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
2464 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
2465 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
2466 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
2467 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
2468 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
2469 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
2470 v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
2473 template <typename T>
2474 operator ParamGenerator<T>() const {
2475 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2476 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2477 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2478 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_,
2480 return ValuesIn(array);
2484 // No implementation - assignment is unsupported.
2485 void operator=(const ValueArray47& other);
2536 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2537 typename T6, typename T7, typename T8, typename T9, typename T10,
2538 typename T11, typename T12, typename T13, typename T14, typename T15,
2539 typename T16, typename T17, typename T18, typename T19, typename T20,
2540 typename T21, typename T22, typename T23, typename T24, typename T25,
2541 typename T26, typename T27, typename T28, typename T29, typename T30,
2542 typename T31, typename T32, typename T33, typename T34, typename T35,
2543 typename T36, typename T37, typename T38, typename T39, typename T40,
2544 typename T41, typename T42, typename T43, typename T44, typename T45,
2545 typename T46, typename T47, typename T48>
2546 class ValueArray48 {
2548 ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2549 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2550 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2551 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2552 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2553 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
2554 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
2555 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
2556 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
2557 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
2558 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
2559 v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
2560 v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
2561 v46_(v46), v47_(v47), v48_(v48) {}
2563 template <typename T>
2564 operator ParamGenerator<T>() const {
2565 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2566 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2567 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2568 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2570 return ValuesIn(array);
2574 // No implementation - assignment is unsupported.
2575 void operator=(const ValueArray48& other);
2627 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2628 typename T6, typename T7, typename T8, typename T9, typename T10,
2629 typename T11, typename T12, typename T13, typename T14, typename T15,
2630 typename T16, typename T17, typename T18, typename T19, typename T20,
2631 typename T21, typename T22, typename T23, typename T24, typename T25,
2632 typename T26, typename T27, typename T28, typename T29, typename T30,
2633 typename T31, typename T32, typename T33, typename T34, typename T35,
2634 typename T36, typename T37, typename T38, typename T39, typename T40,
2635 typename T41, typename T42, typename T43, typename T44, typename T45,
2636 typename T46, typename T47, typename T48, typename T49>
2637 class ValueArray49 {
2639 ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2640 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2641 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2642 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2643 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2644 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
2645 T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2646 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2647 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2648 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2649 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2650 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2651 v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2652 v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
2654 template <typename T>
2655 operator ParamGenerator<T>() const {
2656 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2657 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2658 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2659 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2661 return ValuesIn(array);
2665 // No implementation - assignment is unsupported.
2666 void operator=(const ValueArray49& other);
2719 template <typename T1, typename T2, typename T3, typename T4, typename T5,
2720 typename T6, typename T7, typename T8, typename T9, typename T10,
2721 typename T11, typename T12, typename T13, typename T14, typename T15,
2722 typename T16, typename T17, typename T18, typename T19, typename T20,
2723 typename T21, typename T22, typename T23, typename T24, typename T25,
2724 typename T26, typename T27, typename T28, typename T29, typename T30,
2725 typename T31, typename T32, typename T33, typename T34, typename T35,
2726 typename T36, typename T37, typename T38, typename T39, typename T40,
2727 typename T41, typename T42, typename T43, typename T44, typename T45,
2728 typename T46, typename T47, typename T48, typename T49, typename T50>
2729 class ValueArray50 {
2731 ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
2732 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
2733 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
2734 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
2735 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
2736 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
2737 T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
2738 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
2739 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
2740 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
2741 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
2742 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
2743 v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
2744 v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
2746 template <typename T>
2747 operator ParamGenerator<T>() const {
2748 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_,
2749 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_,
2750 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_,
2751 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_,
2753 return ValuesIn(array);
2757 // No implementation - assignment is unsupported.
2758 void operator=(const ValueArray50& other);
2812 #if GTEST_HAS_COMBINE
2813 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
2815 // Generates values from the Cartesian product of values produced
2816 // by the argument generators.
2818 template <typename T1, typename T2>
2819 class CartesianProductGenerator2
2820 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
2822 typedef ::std::tr1::tuple<T1, T2> ParamType;
2824 CartesianProductGenerator2(const ParamGenerator<T1>& g1,
2825 const ParamGenerator<T2>& g2)
2826 : g1_(g1), g2_(g2) {}
2827 virtual ~CartesianProductGenerator2() {}
2829 virtual ParamIteratorInterface<ParamType>* Begin() const {
2830 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
2832 virtual ParamIteratorInterface<ParamType>* End() const {
2833 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
2837 class Iterator : public ParamIteratorInterface<ParamType> {
2839 Iterator(const ParamGeneratorInterface<ParamType>* base,
2840 const ParamGenerator<T1>& g1,
2841 const typename ParamGenerator<T1>::iterator& current1,
2842 const ParamGenerator<T2>& g2,
2843 const typename ParamGenerator<T2>::iterator& current2)
2845 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
2846 begin2_(g2.begin()), end2_(g2.end()), current2_(current2) {
2847 ComputeCurrentValue();
2849 virtual ~Iterator() {}
2851 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
2854 // Advance should not be called on beyond-of-range iterators
2855 // so no component iterators must be beyond end of range, either.
2856 virtual void Advance() {
2859 if (current2_ == end2_) {
2860 current2_ = begin2_;
2863 ComputeCurrentValue();
2865 virtual ParamIteratorInterface<ParamType>* Clone() const {
2866 return new Iterator(*this);
2868 virtual const ParamType* Current() const { return ¤t_value_; }
2869 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
2870 // Having the same base generator guarantees that the other
2871 // iterator is of the same type and we can downcast.
2872 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
2873 << "The program attempted to compare iterators "
2874 << "from different generators." << std::endl;
2875 const Iterator* typed_other =
2876 CheckedDowncastToActualType<const Iterator>(&other);
2877 // We must report iterators equal if they both point beyond their
2878 // respective ranges. That can happen in a variety of fashions,
2879 // so we have to consult AtEnd().
2880 return (AtEnd() && typed_other->AtEnd()) ||
2882 current1_ == typed_other->current1_ &&
2883 current2_ == typed_other->current2_);
2887 Iterator(const Iterator& other)
2888 : base_(other.base_),
2889 begin1_(other.begin1_),
2891 current1_(other.current1_),
2892 begin2_(other.begin2_),
2894 current2_(other.current2_) {
2895 ComputeCurrentValue();
2898 void ComputeCurrentValue() {
2900 current_value_ = ParamType(*current1_, *current2_);
2902 bool AtEnd() const {
2903 // We must report iterator past the end of the range when either of the
2904 // component iterators has reached the end of its range.
2906 current1_ == end1_ ||
2910 // No implementation - assignment is unsupported.
2911 void operator=(const Iterator& other);
2913 const ParamGeneratorInterface<ParamType>* const base_;
2914 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
2915 // current[i]_ is the actual traversing iterator.
2916 const typename ParamGenerator<T1>::iterator begin1_;
2917 const typename ParamGenerator<T1>::iterator end1_;
2918 typename ParamGenerator<T1>::iterator current1_;
2919 const typename ParamGenerator<T2>::iterator begin2_;
2920 const typename ParamGenerator<T2>::iterator end2_;
2921 typename ParamGenerator<T2>::iterator current2_;
2922 ParamType current_value_;
2923 }; // class CartesianProductGenerator2::Iterator
2925 // No implementation - assignment is unsupported.
2926 void operator=(const CartesianProductGenerator2& other);
2928 const ParamGenerator<T1> g1_;
2929 const ParamGenerator<T2> g2_;
2930 }; // class CartesianProductGenerator2
2933 template <typename T1, typename T2, typename T3>
2934 class CartesianProductGenerator3
2935 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
2937 typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
2939 CartesianProductGenerator3(const ParamGenerator<T1>& g1,
2940 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
2941 : g1_(g1), g2_(g2), g3_(g3) {}
2942 virtual ~CartesianProductGenerator3() {}
2944 virtual ParamIteratorInterface<ParamType>* Begin() const {
2945 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
2948 virtual ParamIteratorInterface<ParamType>* End() const {
2949 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
2953 class Iterator : public ParamIteratorInterface<ParamType> {
2955 Iterator(const ParamGeneratorInterface<ParamType>* base,
2956 const ParamGenerator<T1>& g1,
2957 const typename ParamGenerator<T1>::iterator& current1,
2958 const ParamGenerator<T2>& g2,
2959 const typename ParamGenerator<T2>::iterator& current2,
2960 const ParamGenerator<T3>& g3,
2961 const typename ParamGenerator<T3>::iterator& current3)
2963 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
2964 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
2965 begin3_(g3.begin()), end3_(g3.end()), current3_(current3) {
2966 ComputeCurrentValue();
2968 virtual ~Iterator() {}
2970 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
2973 // Advance should not be called on beyond-of-range iterators
2974 // so no component iterators must be beyond end of range, either.
2975 virtual void Advance() {
2978 if (current3_ == end3_) {
2979 current3_ = begin3_;
2982 if (current2_ == end2_) {
2983 current2_ = begin2_;
2986 ComputeCurrentValue();
2988 virtual ParamIteratorInterface<ParamType>* Clone() const {
2989 return new Iterator(*this);
2991 virtual const ParamType* Current() const { return ¤t_value_; }
2992 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
2993 // Having the same base generator guarantees that the other
2994 // iterator is of the same type and we can downcast.
2995 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
2996 << "The program attempted to compare iterators "
2997 << "from different generators." << std::endl;
2998 const Iterator* typed_other =
2999 CheckedDowncastToActualType<const Iterator>(&other);
3000 // We must report iterators equal if they both point beyond their
3001 // respective ranges. That can happen in a variety of fashions,
3002 // so we have to consult AtEnd().
3003 return (AtEnd() && typed_other->AtEnd()) ||
3005 current1_ == typed_other->current1_ &&
3006 current2_ == typed_other->current2_ &&
3007 current3_ == typed_other->current3_);
3011 Iterator(const Iterator& other)
3012 : base_(other.base_),
3013 begin1_(other.begin1_),
3015 current1_(other.current1_),
3016 begin2_(other.begin2_),
3018 current2_(other.current2_),
3019 begin3_(other.begin3_),
3021 current3_(other.current3_) {
3022 ComputeCurrentValue();
3025 void ComputeCurrentValue() {
3027 current_value_ = ParamType(*current1_, *current2_, *current3_);
3029 bool AtEnd() const {
3030 // We must report iterator past the end of the range when either of the
3031 // component iterators has reached the end of its range.
3033 current1_ == end1_ ||
3034 current2_ == end2_ ||
3038 // No implementation - assignment is unsupported.
3039 void operator=(const Iterator& other);
3041 const ParamGeneratorInterface<ParamType>* const base_;
3042 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3043 // current[i]_ is the actual traversing iterator.
3044 const typename ParamGenerator<T1>::iterator begin1_;
3045 const typename ParamGenerator<T1>::iterator end1_;
3046 typename ParamGenerator<T1>::iterator current1_;
3047 const typename ParamGenerator<T2>::iterator begin2_;
3048 const typename ParamGenerator<T2>::iterator end2_;
3049 typename ParamGenerator<T2>::iterator current2_;
3050 const typename ParamGenerator<T3>::iterator begin3_;
3051 const typename ParamGenerator<T3>::iterator end3_;
3052 typename ParamGenerator<T3>::iterator current3_;
3053 ParamType current_value_;
3054 }; // class CartesianProductGenerator3::Iterator
3056 // No implementation - assignment is unsupported.
3057 void operator=(const CartesianProductGenerator3& other);
3059 const ParamGenerator<T1> g1_;
3060 const ParamGenerator<T2> g2_;
3061 const ParamGenerator<T3> g3_;
3062 }; // class CartesianProductGenerator3
3065 template <typename T1, typename T2, typename T3, typename T4>
3066 class CartesianProductGenerator4
3067 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
3069 typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
3071 CartesianProductGenerator4(const ParamGenerator<T1>& g1,
3072 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3073 const ParamGenerator<T4>& g4)
3074 : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
3075 virtual ~CartesianProductGenerator4() {}
3077 virtual ParamIteratorInterface<ParamType>* Begin() const {
3078 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3079 g3_.begin(), g4_, g4_.begin());
3081 virtual ParamIteratorInterface<ParamType>* End() const {
3082 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3087 class Iterator : public ParamIteratorInterface<ParamType> {
3089 Iterator(const ParamGeneratorInterface<ParamType>* base,
3090 const ParamGenerator<T1>& g1,
3091 const typename ParamGenerator<T1>::iterator& current1,
3092 const ParamGenerator<T2>& g2,
3093 const typename ParamGenerator<T2>::iterator& current2,
3094 const ParamGenerator<T3>& g3,
3095 const typename ParamGenerator<T3>::iterator& current3,
3096 const ParamGenerator<T4>& g4,
3097 const typename ParamGenerator<T4>::iterator& current4)
3099 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3100 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3101 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3102 begin4_(g4.begin()), end4_(g4.end()), current4_(current4) {
3103 ComputeCurrentValue();
3105 virtual ~Iterator() {}
3107 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3110 // Advance should not be called on beyond-of-range iterators
3111 // so no component iterators must be beyond end of range, either.
3112 virtual void Advance() {
3115 if (current4_ == end4_) {
3116 current4_ = begin4_;
3119 if (current3_ == end3_) {
3120 current3_ = begin3_;
3123 if (current2_ == end2_) {
3124 current2_ = begin2_;
3127 ComputeCurrentValue();
3129 virtual ParamIteratorInterface<ParamType>* Clone() const {
3130 return new Iterator(*this);
3132 virtual const ParamType* Current() const { return ¤t_value_; }
3133 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3134 // Having the same base generator guarantees that the other
3135 // iterator is of the same type and we can downcast.
3136 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3137 << "The program attempted to compare iterators "
3138 << "from different generators." << std::endl;
3139 const Iterator* typed_other =
3140 CheckedDowncastToActualType<const Iterator>(&other);
3141 // We must report iterators equal if they both point beyond their
3142 // respective ranges. That can happen in a variety of fashions,
3143 // so we have to consult AtEnd().
3144 return (AtEnd() && typed_other->AtEnd()) ||
3146 current1_ == typed_other->current1_ &&
3147 current2_ == typed_other->current2_ &&
3148 current3_ == typed_other->current3_ &&
3149 current4_ == typed_other->current4_);
3153 Iterator(const Iterator& other)
3154 : base_(other.base_),
3155 begin1_(other.begin1_),
3157 current1_(other.current1_),
3158 begin2_(other.begin2_),
3160 current2_(other.current2_),
3161 begin3_(other.begin3_),
3163 current3_(other.current3_),
3164 begin4_(other.begin4_),
3166 current4_(other.current4_) {
3167 ComputeCurrentValue();
3170 void ComputeCurrentValue() {
3172 current_value_ = ParamType(*current1_, *current2_, *current3_,
3175 bool AtEnd() const {
3176 // We must report iterator past the end of the range when either of the
3177 // component iterators has reached the end of its range.
3179 current1_ == end1_ ||
3180 current2_ == end2_ ||
3181 current3_ == end3_ ||
3185 // No implementation - assignment is unsupported.
3186 void operator=(const Iterator& other);
3188 const ParamGeneratorInterface<ParamType>* const base_;
3189 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3190 // current[i]_ is the actual traversing iterator.
3191 const typename ParamGenerator<T1>::iterator begin1_;
3192 const typename ParamGenerator<T1>::iterator end1_;
3193 typename ParamGenerator<T1>::iterator current1_;
3194 const typename ParamGenerator<T2>::iterator begin2_;
3195 const typename ParamGenerator<T2>::iterator end2_;
3196 typename ParamGenerator<T2>::iterator current2_;
3197 const typename ParamGenerator<T3>::iterator begin3_;
3198 const typename ParamGenerator<T3>::iterator end3_;
3199 typename ParamGenerator<T3>::iterator current3_;
3200 const typename ParamGenerator<T4>::iterator begin4_;
3201 const typename ParamGenerator<T4>::iterator end4_;
3202 typename ParamGenerator<T4>::iterator current4_;
3203 ParamType current_value_;
3204 }; // class CartesianProductGenerator4::Iterator
3206 // No implementation - assignment is unsupported.
3207 void operator=(const CartesianProductGenerator4& other);
3209 const ParamGenerator<T1> g1_;
3210 const ParamGenerator<T2> g2_;
3211 const ParamGenerator<T3> g3_;
3212 const ParamGenerator<T4> g4_;
3213 }; // class CartesianProductGenerator4
3216 template <typename T1, typename T2, typename T3, typename T4, typename T5>
3217 class CartesianProductGenerator5
3218 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
3220 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
3222 CartesianProductGenerator5(const ParamGenerator<T1>& g1,
3223 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3224 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
3225 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
3226 virtual ~CartesianProductGenerator5() {}
3228 virtual ParamIteratorInterface<ParamType>* Begin() const {
3229 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3230 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
3232 virtual ParamIteratorInterface<ParamType>* End() const {
3233 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3234 g4_, g4_.end(), g5_, g5_.end());
3238 class Iterator : public ParamIteratorInterface<ParamType> {
3240 Iterator(const ParamGeneratorInterface<ParamType>* base,
3241 const ParamGenerator<T1>& g1,
3242 const typename ParamGenerator<T1>::iterator& current1,
3243 const ParamGenerator<T2>& g2,
3244 const typename ParamGenerator<T2>::iterator& current2,
3245 const ParamGenerator<T3>& g3,
3246 const typename ParamGenerator<T3>::iterator& current3,
3247 const ParamGenerator<T4>& g4,
3248 const typename ParamGenerator<T4>::iterator& current4,
3249 const ParamGenerator<T5>& g5,
3250 const typename ParamGenerator<T5>::iterator& current5)
3252 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3253 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3254 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3255 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3256 begin5_(g5.begin()), end5_(g5.end()), current5_(current5) {
3257 ComputeCurrentValue();
3259 virtual ~Iterator() {}
3261 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3264 // Advance should not be called on beyond-of-range iterators
3265 // so no component iterators must be beyond end of range, either.
3266 virtual void Advance() {
3269 if (current5_ == end5_) {
3270 current5_ = begin5_;
3273 if (current4_ == end4_) {
3274 current4_ = begin4_;
3277 if (current3_ == end3_) {
3278 current3_ = begin3_;
3281 if (current2_ == end2_) {
3282 current2_ = begin2_;
3285 ComputeCurrentValue();
3287 virtual ParamIteratorInterface<ParamType>* Clone() const {
3288 return new Iterator(*this);
3290 virtual const ParamType* Current() const { return ¤t_value_; }
3291 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3292 // Having the same base generator guarantees that the other
3293 // iterator is of the same type and we can downcast.
3294 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3295 << "The program attempted to compare iterators "
3296 << "from different generators." << std::endl;
3297 const Iterator* typed_other =
3298 CheckedDowncastToActualType<const Iterator>(&other);
3299 // We must report iterators equal if they both point beyond their
3300 // respective ranges. That can happen in a variety of fashions,
3301 // so we have to consult AtEnd().
3302 return (AtEnd() && typed_other->AtEnd()) ||
3304 current1_ == typed_other->current1_ &&
3305 current2_ == typed_other->current2_ &&
3306 current3_ == typed_other->current3_ &&
3307 current4_ == typed_other->current4_ &&
3308 current5_ == typed_other->current5_);
3312 Iterator(const Iterator& other)
3313 : base_(other.base_),
3314 begin1_(other.begin1_),
3316 current1_(other.current1_),
3317 begin2_(other.begin2_),
3319 current2_(other.current2_),
3320 begin3_(other.begin3_),
3322 current3_(other.current3_),
3323 begin4_(other.begin4_),
3325 current4_(other.current4_),
3326 begin5_(other.begin5_),
3328 current5_(other.current5_) {
3329 ComputeCurrentValue();
3332 void ComputeCurrentValue() {
3334 current_value_ = ParamType(*current1_, *current2_, *current3_,
3335 *current4_, *current5_);
3337 bool AtEnd() const {
3338 // We must report iterator past the end of the range when either of the
3339 // component iterators has reached the end of its range.
3341 current1_ == end1_ ||
3342 current2_ == end2_ ||
3343 current3_ == end3_ ||
3344 current4_ == end4_ ||
3348 // No implementation - assignment is unsupported.
3349 void operator=(const Iterator& other);
3351 const ParamGeneratorInterface<ParamType>* const base_;
3352 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3353 // current[i]_ is the actual traversing iterator.
3354 const typename ParamGenerator<T1>::iterator begin1_;
3355 const typename ParamGenerator<T1>::iterator end1_;
3356 typename ParamGenerator<T1>::iterator current1_;
3357 const typename ParamGenerator<T2>::iterator begin2_;
3358 const typename ParamGenerator<T2>::iterator end2_;
3359 typename ParamGenerator<T2>::iterator current2_;
3360 const typename ParamGenerator<T3>::iterator begin3_;
3361 const typename ParamGenerator<T3>::iterator end3_;
3362 typename ParamGenerator<T3>::iterator current3_;
3363 const typename ParamGenerator<T4>::iterator begin4_;
3364 const typename ParamGenerator<T4>::iterator end4_;
3365 typename ParamGenerator<T4>::iterator current4_;
3366 const typename ParamGenerator<T5>::iterator begin5_;
3367 const typename ParamGenerator<T5>::iterator end5_;
3368 typename ParamGenerator<T5>::iterator current5_;
3369 ParamType current_value_;
3370 }; // class CartesianProductGenerator5::Iterator
3372 // No implementation - assignment is unsupported.
3373 void operator=(const CartesianProductGenerator5& other);
3375 const ParamGenerator<T1> g1_;
3376 const ParamGenerator<T2> g2_;
3377 const ParamGenerator<T3> g3_;
3378 const ParamGenerator<T4> g4_;
3379 const ParamGenerator<T5> g5_;
3380 }; // class CartesianProductGenerator5
3383 template <typename T1, typename T2, typename T3, typename T4, typename T5,
3385 class CartesianProductGenerator6
3386 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
3389 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
3391 CartesianProductGenerator6(const ParamGenerator<T1>& g1,
3392 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3393 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3394 const ParamGenerator<T6>& g6)
3395 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
3396 virtual ~CartesianProductGenerator6() {}
3398 virtual ParamIteratorInterface<ParamType>* Begin() const {
3399 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3400 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
3402 virtual ParamIteratorInterface<ParamType>* End() const {
3403 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3404 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
3408 class Iterator : public ParamIteratorInterface<ParamType> {
3410 Iterator(const ParamGeneratorInterface<ParamType>* base,
3411 const ParamGenerator<T1>& g1,
3412 const typename ParamGenerator<T1>::iterator& current1,
3413 const ParamGenerator<T2>& g2,
3414 const typename ParamGenerator<T2>::iterator& current2,
3415 const ParamGenerator<T3>& g3,
3416 const typename ParamGenerator<T3>::iterator& current3,
3417 const ParamGenerator<T4>& g4,
3418 const typename ParamGenerator<T4>::iterator& current4,
3419 const ParamGenerator<T5>& g5,
3420 const typename ParamGenerator<T5>::iterator& current5,
3421 const ParamGenerator<T6>& g6,
3422 const typename ParamGenerator<T6>::iterator& current6)
3424 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3425 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3426 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3427 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3428 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3429 begin6_(g6.begin()), end6_(g6.end()), current6_(current6) {
3430 ComputeCurrentValue();
3432 virtual ~Iterator() {}
3434 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3437 // Advance should not be called on beyond-of-range iterators
3438 // so no component iterators must be beyond end of range, either.
3439 virtual void Advance() {
3442 if (current6_ == end6_) {
3443 current6_ = begin6_;
3446 if (current5_ == end5_) {
3447 current5_ = begin5_;
3450 if (current4_ == end4_) {
3451 current4_ = begin4_;
3454 if (current3_ == end3_) {
3455 current3_ = begin3_;
3458 if (current2_ == end2_) {
3459 current2_ = begin2_;
3462 ComputeCurrentValue();
3464 virtual ParamIteratorInterface<ParamType>* Clone() const {
3465 return new Iterator(*this);
3467 virtual const ParamType* Current() const { return ¤t_value_; }
3468 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3469 // Having the same base generator guarantees that the other
3470 // iterator is of the same type and we can downcast.
3471 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3472 << "The program attempted to compare iterators "
3473 << "from different generators." << std::endl;
3474 const Iterator* typed_other =
3475 CheckedDowncastToActualType<const Iterator>(&other);
3476 // We must report iterators equal if they both point beyond their
3477 // respective ranges. That can happen in a variety of fashions,
3478 // so we have to consult AtEnd().
3479 return (AtEnd() && typed_other->AtEnd()) ||
3481 current1_ == typed_other->current1_ &&
3482 current2_ == typed_other->current2_ &&
3483 current3_ == typed_other->current3_ &&
3484 current4_ == typed_other->current4_ &&
3485 current5_ == typed_other->current5_ &&
3486 current6_ == typed_other->current6_);
3490 Iterator(const Iterator& other)
3491 : base_(other.base_),
3492 begin1_(other.begin1_),
3494 current1_(other.current1_),
3495 begin2_(other.begin2_),
3497 current2_(other.current2_),
3498 begin3_(other.begin3_),
3500 current3_(other.current3_),
3501 begin4_(other.begin4_),
3503 current4_(other.current4_),
3504 begin5_(other.begin5_),
3506 current5_(other.current5_),
3507 begin6_(other.begin6_),
3509 current6_(other.current6_) {
3510 ComputeCurrentValue();
3513 void ComputeCurrentValue() {
3515 current_value_ = ParamType(*current1_, *current2_, *current3_,
3516 *current4_, *current5_, *current6_);
3518 bool AtEnd() const {
3519 // We must report iterator past the end of the range when either of the
3520 // component iterators has reached the end of its range.
3522 current1_ == end1_ ||
3523 current2_ == end2_ ||
3524 current3_ == end3_ ||
3525 current4_ == end4_ ||
3526 current5_ == end5_ ||
3530 // No implementation - assignment is unsupported.
3531 void operator=(const Iterator& other);
3533 const ParamGeneratorInterface<ParamType>* const base_;
3534 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3535 // current[i]_ is the actual traversing iterator.
3536 const typename ParamGenerator<T1>::iterator begin1_;
3537 const typename ParamGenerator<T1>::iterator end1_;
3538 typename ParamGenerator<T1>::iterator current1_;
3539 const typename ParamGenerator<T2>::iterator begin2_;
3540 const typename ParamGenerator<T2>::iterator end2_;
3541 typename ParamGenerator<T2>::iterator current2_;
3542 const typename ParamGenerator<T3>::iterator begin3_;
3543 const typename ParamGenerator<T3>::iterator end3_;
3544 typename ParamGenerator<T3>::iterator current3_;
3545 const typename ParamGenerator<T4>::iterator begin4_;
3546 const typename ParamGenerator<T4>::iterator end4_;
3547 typename ParamGenerator<T4>::iterator current4_;
3548 const typename ParamGenerator<T5>::iterator begin5_;
3549 const typename ParamGenerator<T5>::iterator end5_;
3550 typename ParamGenerator<T5>::iterator current5_;
3551 const typename ParamGenerator<T6>::iterator begin6_;
3552 const typename ParamGenerator<T6>::iterator end6_;
3553 typename ParamGenerator<T6>::iterator current6_;
3554 ParamType current_value_;
3555 }; // class CartesianProductGenerator6::Iterator
3557 // No implementation - assignment is unsupported.
3558 void operator=(const CartesianProductGenerator6& other);
3560 const ParamGenerator<T1> g1_;
3561 const ParamGenerator<T2> g2_;
3562 const ParamGenerator<T3> g3_;
3563 const ParamGenerator<T4> g4_;
3564 const ParamGenerator<T5> g5_;
3565 const ParamGenerator<T6> g6_;
3566 }; // class CartesianProductGenerator6
3569 template <typename T1, typename T2, typename T3, typename T4, typename T5,
3570 typename T6, typename T7>
3571 class CartesianProductGenerator7
3572 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3575 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
3577 CartesianProductGenerator7(const ParamGenerator<T1>& g1,
3578 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3579 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3580 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
3581 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
3582 virtual ~CartesianProductGenerator7() {}
3584 virtual ParamIteratorInterface<ParamType>* Begin() const {
3585 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3586 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3589 virtual ParamIteratorInterface<ParamType>* End() const {
3590 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3591 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
3595 class Iterator : public ParamIteratorInterface<ParamType> {
3597 Iterator(const ParamGeneratorInterface<ParamType>* base,
3598 const ParamGenerator<T1>& g1,
3599 const typename ParamGenerator<T1>::iterator& current1,
3600 const ParamGenerator<T2>& g2,
3601 const typename ParamGenerator<T2>::iterator& current2,
3602 const ParamGenerator<T3>& g3,
3603 const typename ParamGenerator<T3>::iterator& current3,
3604 const ParamGenerator<T4>& g4,
3605 const typename ParamGenerator<T4>::iterator& current4,
3606 const ParamGenerator<T5>& g5,
3607 const typename ParamGenerator<T5>::iterator& current5,
3608 const ParamGenerator<T6>& g6,
3609 const typename ParamGenerator<T6>::iterator& current6,
3610 const ParamGenerator<T7>& g7,
3611 const typename ParamGenerator<T7>::iterator& current7)
3613 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3614 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3615 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3616 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3617 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3618 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3619 begin7_(g7.begin()), end7_(g7.end()), current7_(current7) {
3620 ComputeCurrentValue();
3622 virtual ~Iterator() {}
3624 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3627 // Advance should not be called on beyond-of-range iterators
3628 // so no component iterators must be beyond end of range, either.
3629 virtual void Advance() {
3632 if (current7_ == end7_) {
3633 current7_ = begin7_;
3636 if (current6_ == end6_) {
3637 current6_ = begin6_;
3640 if (current5_ == end5_) {
3641 current5_ = begin5_;
3644 if (current4_ == end4_) {
3645 current4_ = begin4_;
3648 if (current3_ == end3_) {
3649 current3_ = begin3_;
3652 if (current2_ == end2_) {
3653 current2_ = begin2_;
3656 ComputeCurrentValue();
3658 virtual ParamIteratorInterface<ParamType>* Clone() const {
3659 return new Iterator(*this);
3661 virtual const ParamType* Current() const { return ¤t_value_; }
3662 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3663 // Having the same base generator guarantees that the other
3664 // iterator is of the same type and we can downcast.
3665 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3666 << "The program attempted to compare iterators "
3667 << "from different generators." << std::endl;
3668 const Iterator* typed_other =
3669 CheckedDowncastToActualType<const Iterator>(&other);
3670 // We must report iterators equal if they both point beyond their
3671 // respective ranges. That can happen in a variety of fashions,
3672 // so we have to consult AtEnd().
3673 return (AtEnd() && typed_other->AtEnd()) ||
3675 current1_ == typed_other->current1_ &&
3676 current2_ == typed_other->current2_ &&
3677 current3_ == typed_other->current3_ &&
3678 current4_ == typed_other->current4_ &&
3679 current5_ == typed_other->current5_ &&
3680 current6_ == typed_other->current6_ &&
3681 current7_ == typed_other->current7_);
3685 Iterator(const Iterator& other)
3686 : base_(other.base_),
3687 begin1_(other.begin1_),
3689 current1_(other.current1_),
3690 begin2_(other.begin2_),
3692 current2_(other.current2_),
3693 begin3_(other.begin3_),
3695 current3_(other.current3_),
3696 begin4_(other.begin4_),
3698 current4_(other.current4_),
3699 begin5_(other.begin5_),
3701 current5_(other.current5_),
3702 begin6_(other.begin6_),
3704 current6_(other.current6_),
3705 begin7_(other.begin7_),
3707 current7_(other.current7_) {
3708 ComputeCurrentValue();
3711 void ComputeCurrentValue() {
3713 current_value_ = ParamType(*current1_, *current2_, *current3_,
3714 *current4_, *current5_, *current6_, *current7_);
3716 bool AtEnd() const {
3717 // We must report iterator past the end of the range when either of the
3718 // component iterators has reached the end of its range.
3720 current1_ == end1_ ||
3721 current2_ == end2_ ||
3722 current3_ == end3_ ||
3723 current4_ == end4_ ||
3724 current5_ == end5_ ||
3725 current6_ == end6_ ||
3729 // No implementation - assignment is unsupported.
3730 void operator=(const Iterator& other);
3732 const ParamGeneratorInterface<ParamType>* const base_;
3733 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3734 // current[i]_ is the actual traversing iterator.
3735 const typename ParamGenerator<T1>::iterator begin1_;
3736 const typename ParamGenerator<T1>::iterator end1_;
3737 typename ParamGenerator<T1>::iterator current1_;
3738 const typename ParamGenerator<T2>::iterator begin2_;
3739 const typename ParamGenerator<T2>::iterator end2_;
3740 typename ParamGenerator<T2>::iterator current2_;
3741 const typename ParamGenerator<T3>::iterator begin3_;
3742 const typename ParamGenerator<T3>::iterator end3_;
3743 typename ParamGenerator<T3>::iterator current3_;
3744 const typename ParamGenerator<T4>::iterator begin4_;
3745 const typename ParamGenerator<T4>::iterator end4_;
3746 typename ParamGenerator<T4>::iterator current4_;
3747 const typename ParamGenerator<T5>::iterator begin5_;
3748 const typename ParamGenerator<T5>::iterator end5_;
3749 typename ParamGenerator<T5>::iterator current5_;
3750 const typename ParamGenerator<T6>::iterator begin6_;
3751 const typename ParamGenerator<T6>::iterator end6_;
3752 typename ParamGenerator<T6>::iterator current6_;
3753 const typename ParamGenerator<T7>::iterator begin7_;
3754 const typename ParamGenerator<T7>::iterator end7_;
3755 typename ParamGenerator<T7>::iterator current7_;
3756 ParamType current_value_;
3757 }; // class CartesianProductGenerator7::Iterator
3759 // No implementation - assignment is unsupported.
3760 void operator=(const CartesianProductGenerator7& other);
3762 const ParamGenerator<T1> g1_;
3763 const ParamGenerator<T2> g2_;
3764 const ParamGenerator<T3> g3_;
3765 const ParamGenerator<T4> g4_;
3766 const ParamGenerator<T5> g5_;
3767 const ParamGenerator<T6> g6_;
3768 const ParamGenerator<T7> g7_;
3769 }; // class CartesianProductGenerator7
3772 template <typename T1, typename T2, typename T3, typename T4, typename T5,
3773 typename T6, typename T7, typename T8>
3774 class CartesianProductGenerator8
3775 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
3778 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
3780 CartesianProductGenerator8(const ParamGenerator<T1>& g1,
3781 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
3782 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
3783 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
3784 const ParamGenerator<T8>& g8)
3785 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
3787 virtual ~CartesianProductGenerator8() {}
3789 virtual ParamIteratorInterface<ParamType>* Begin() const {
3790 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
3791 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
3792 g7_.begin(), g8_, g8_.begin());
3794 virtual ParamIteratorInterface<ParamType>* End() const {
3795 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
3796 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
3801 class Iterator : public ParamIteratorInterface<ParamType> {
3803 Iterator(const ParamGeneratorInterface<ParamType>* base,
3804 const ParamGenerator<T1>& g1,
3805 const typename ParamGenerator<T1>::iterator& current1,
3806 const ParamGenerator<T2>& g2,
3807 const typename ParamGenerator<T2>::iterator& current2,
3808 const ParamGenerator<T3>& g3,
3809 const typename ParamGenerator<T3>::iterator& current3,
3810 const ParamGenerator<T4>& g4,
3811 const typename ParamGenerator<T4>::iterator& current4,
3812 const ParamGenerator<T5>& g5,
3813 const typename ParamGenerator<T5>::iterator& current5,
3814 const ParamGenerator<T6>& g6,
3815 const typename ParamGenerator<T6>::iterator& current6,
3816 const ParamGenerator<T7>& g7,
3817 const typename ParamGenerator<T7>::iterator& current7,
3818 const ParamGenerator<T8>& g8,
3819 const typename ParamGenerator<T8>::iterator& current8)
3821 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
3822 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
3823 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
3824 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
3825 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
3826 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
3827 begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
3828 begin8_(g8.begin()), end8_(g8.end()), current8_(current8) {
3829 ComputeCurrentValue();
3831 virtual ~Iterator() {}
3833 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
3836 // Advance should not be called on beyond-of-range iterators
3837 // so no component iterators must be beyond end of range, either.
3838 virtual void Advance() {
3841 if (current8_ == end8_) {
3842 current8_ = begin8_;
3845 if (current7_ == end7_) {
3846 current7_ = begin7_;
3849 if (current6_ == end6_) {
3850 current6_ = begin6_;
3853 if (current5_ == end5_) {
3854 current5_ = begin5_;
3857 if (current4_ == end4_) {
3858 current4_ = begin4_;
3861 if (current3_ == end3_) {
3862 current3_ = begin3_;
3865 if (current2_ == end2_) {
3866 current2_ = begin2_;
3869 ComputeCurrentValue();
3871 virtual ParamIteratorInterface<ParamType>* Clone() const {
3872 return new Iterator(*this);
3874 virtual const ParamType* Current() const { return ¤t_value_; }
3875 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
3876 // Having the same base generator guarantees that the other
3877 // iterator is of the same type and we can downcast.
3878 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
3879 << "The program attempted to compare iterators "
3880 << "from different generators." << std::endl;
3881 const Iterator* typed_other =
3882 CheckedDowncastToActualType<const Iterator>(&other);
3883 // We must report iterators equal if they both point beyond their
3884 // respective ranges. That can happen in a variety of fashions,
3885 // so we have to consult AtEnd().
3886 return (AtEnd() && typed_other->AtEnd()) ||
3888 current1_ == typed_other->current1_ &&
3889 current2_ == typed_other->current2_ &&
3890 current3_ == typed_other->current3_ &&
3891 current4_ == typed_other->current4_ &&
3892 current5_ == typed_other->current5_ &&
3893 current6_ == typed_other->current6_ &&
3894 current7_ == typed_other->current7_ &&
3895 current8_ == typed_other->current8_);
3899 Iterator(const Iterator& other)
3900 : base_(other.base_),
3901 begin1_(other.begin1_),
3903 current1_(other.current1_),
3904 begin2_(other.begin2_),
3906 current2_(other.current2_),
3907 begin3_(other.begin3_),
3909 current3_(other.current3_),
3910 begin4_(other.begin4_),
3912 current4_(other.current4_),
3913 begin5_(other.begin5_),
3915 current5_(other.current5_),
3916 begin6_(other.begin6_),
3918 current6_(other.current6_),
3919 begin7_(other.begin7_),
3921 current7_(other.current7_),
3922 begin8_(other.begin8_),
3924 current8_(other.current8_) {
3925 ComputeCurrentValue();
3928 void ComputeCurrentValue() {
3930 current_value_ = ParamType(*current1_, *current2_, *current3_,
3931 *current4_, *current5_, *current6_, *current7_, *current8_);
3933 bool AtEnd() const {
3934 // We must report iterator past the end of the range when either of the
3935 // component iterators has reached the end of its range.
3937 current1_ == end1_ ||
3938 current2_ == end2_ ||
3939 current3_ == end3_ ||
3940 current4_ == end4_ ||
3941 current5_ == end5_ ||
3942 current6_ == end6_ ||
3943 current7_ == end7_ ||
3947 // No implementation - assignment is unsupported.
3948 void operator=(const Iterator& other);
3950 const ParamGeneratorInterface<ParamType>* const base_;
3951 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
3952 // current[i]_ is the actual traversing iterator.
3953 const typename ParamGenerator<T1>::iterator begin1_;
3954 const typename ParamGenerator<T1>::iterator end1_;
3955 typename ParamGenerator<T1>::iterator current1_;
3956 const typename ParamGenerator<T2>::iterator begin2_;
3957 const typename ParamGenerator<T2>::iterator end2_;
3958 typename ParamGenerator<T2>::iterator current2_;
3959 const typename ParamGenerator<T3>::iterator begin3_;
3960 const typename ParamGenerator<T3>::iterator end3_;
3961 typename ParamGenerator<T3>::iterator current3_;
3962 const typename ParamGenerator<T4>::iterator begin4_;
3963 const typename ParamGenerator<T4>::iterator end4_;
3964 typename ParamGenerator<T4>::iterator current4_;
3965 const typename ParamGenerator<T5>::iterator begin5_;
3966 const typename ParamGenerator<T5>::iterator end5_;
3967 typename ParamGenerator<T5>::iterator current5_;
3968 const typename ParamGenerator<T6>::iterator begin6_;
3969 const typename ParamGenerator<T6>::iterator end6_;
3970 typename ParamGenerator<T6>::iterator current6_;
3971 const typename ParamGenerator<T7>::iterator begin7_;
3972 const typename ParamGenerator<T7>::iterator end7_;
3973 typename ParamGenerator<T7>::iterator current7_;
3974 const typename ParamGenerator<T8>::iterator begin8_;
3975 const typename ParamGenerator<T8>::iterator end8_;
3976 typename ParamGenerator<T8>::iterator current8_;
3977 ParamType current_value_;
3978 }; // class CartesianProductGenerator8::Iterator
3980 // No implementation - assignment is unsupported.
3981 void operator=(const CartesianProductGenerator8& other);
3983 const ParamGenerator<T1> g1_;
3984 const ParamGenerator<T2> g2_;
3985 const ParamGenerator<T3> g3_;
3986 const ParamGenerator<T4> g4_;
3987 const ParamGenerator<T5> g5_;
3988 const ParamGenerator<T6> g6_;
3989 const ParamGenerator<T7> g7_;
3990 const ParamGenerator<T8> g8_;
3991 }; // class CartesianProductGenerator8
3994 template <typename T1, typename T2, typename T3, typename T4, typename T5,
3995 typename T6, typename T7, typename T8, typename T9>
3996 class CartesianProductGenerator9
3997 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4000 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
4002 CartesianProductGenerator9(const ParamGenerator<T1>& g1,
4003 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4004 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4005 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4006 const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
4007 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4009 virtual ~CartesianProductGenerator9() {}
4011 virtual ParamIteratorInterface<ParamType>* Begin() const {
4012 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4013 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4014 g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
4016 virtual ParamIteratorInterface<ParamType>* End() const {
4017 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4018 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4019 g8_.end(), g9_, g9_.end());
4023 class Iterator : public ParamIteratorInterface<ParamType> {
4025 Iterator(const ParamGeneratorInterface<ParamType>* base,
4026 const ParamGenerator<T1>& g1,
4027 const typename ParamGenerator<T1>::iterator& current1,
4028 const ParamGenerator<T2>& g2,
4029 const typename ParamGenerator<T2>::iterator& current2,
4030 const ParamGenerator<T3>& g3,
4031 const typename ParamGenerator<T3>::iterator& current3,
4032 const ParamGenerator<T4>& g4,
4033 const typename ParamGenerator<T4>::iterator& current4,
4034 const ParamGenerator<T5>& g5,
4035 const typename ParamGenerator<T5>::iterator& current5,
4036 const ParamGenerator<T6>& g6,
4037 const typename ParamGenerator<T6>::iterator& current6,
4038 const ParamGenerator<T7>& g7,
4039 const typename ParamGenerator<T7>::iterator& current7,
4040 const ParamGenerator<T8>& g8,
4041 const typename ParamGenerator<T8>::iterator& current8,
4042 const ParamGenerator<T9>& g9,
4043 const typename ParamGenerator<T9>::iterator& current9)
4045 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4046 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4047 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4048 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4049 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4050 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4051 begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4052 begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4053 begin9_(g9.begin()), end9_(g9.end()), current9_(current9) {
4054 ComputeCurrentValue();
4056 virtual ~Iterator() {}
4058 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4061 // Advance should not be called on beyond-of-range iterators
4062 // so no component iterators must be beyond end of range, either.
4063 virtual void Advance() {
4066 if (current9_ == end9_) {
4067 current9_ = begin9_;
4070 if (current8_ == end8_) {
4071 current8_ = begin8_;
4074 if (current7_ == end7_) {
4075 current7_ = begin7_;
4078 if (current6_ == end6_) {
4079 current6_ = begin6_;
4082 if (current5_ == end5_) {
4083 current5_ = begin5_;
4086 if (current4_ == end4_) {
4087 current4_ = begin4_;
4090 if (current3_ == end3_) {
4091 current3_ = begin3_;
4094 if (current2_ == end2_) {
4095 current2_ = begin2_;
4098 ComputeCurrentValue();
4100 virtual ParamIteratorInterface<ParamType>* Clone() const {
4101 return new Iterator(*this);
4103 virtual const ParamType* Current() const { return ¤t_value_; }
4104 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4105 // Having the same base generator guarantees that the other
4106 // iterator is of the same type and we can downcast.
4107 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4108 << "The program attempted to compare iterators "
4109 << "from different generators." << std::endl;
4110 const Iterator* typed_other =
4111 CheckedDowncastToActualType<const Iterator>(&other);
4112 // We must report iterators equal if they both point beyond their
4113 // respective ranges. That can happen in a variety of fashions,
4114 // so we have to consult AtEnd().
4115 return (AtEnd() && typed_other->AtEnd()) ||
4117 current1_ == typed_other->current1_ &&
4118 current2_ == typed_other->current2_ &&
4119 current3_ == typed_other->current3_ &&
4120 current4_ == typed_other->current4_ &&
4121 current5_ == typed_other->current5_ &&
4122 current6_ == typed_other->current6_ &&
4123 current7_ == typed_other->current7_ &&
4124 current8_ == typed_other->current8_ &&
4125 current9_ == typed_other->current9_);
4129 Iterator(const Iterator& other)
4130 : base_(other.base_),
4131 begin1_(other.begin1_),
4133 current1_(other.current1_),
4134 begin2_(other.begin2_),
4136 current2_(other.current2_),
4137 begin3_(other.begin3_),
4139 current3_(other.current3_),
4140 begin4_(other.begin4_),
4142 current4_(other.current4_),
4143 begin5_(other.begin5_),
4145 current5_(other.current5_),
4146 begin6_(other.begin6_),
4148 current6_(other.current6_),
4149 begin7_(other.begin7_),
4151 current7_(other.current7_),
4152 begin8_(other.begin8_),
4154 current8_(other.current8_),
4155 begin9_(other.begin9_),
4157 current9_(other.current9_) {
4158 ComputeCurrentValue();
4161 void ComputeCurrentValue() {
4163 current_value_ = ParamType(*current1_, *current2_, *current3_,
4164 *current4_, *current5_, *current6_, *current7_, *current8_,
4167 bool AtEnd() const {
4168 // We must report iterator past the end of the range when either of the
4169 // component iterators has reached the end of its range.
4171 current1_ == end1_ ||
4172 current2_ == end2_ ||
4173 current3_ == end3_ ||
4174 current4_ == end4_ ||
4175 current5_ == end5_ ||
4176 current6_ == end6_ ||
4177 current7_ == end7_ ||
4178 current8_ == end8_ ||
4182 // No implementation - assignment is unsupported.
4183 void operator=(const Iterator& other);
4185 const ParamGeneratorInterface<ParamType>* const base_;
4186 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4187 // current[i]_ is the actual traversing iterator.
4188 const typename ParamGenerator<T1>::iterator begin1_;
4189 const typename ParamGenerator<T1>::iterator end1_;
4190 typename ParamGenerator<T1>::iterator current1_;
4191 const typename ParamGenerator<T2>::iterator begin2_;
4192 const typename ParamGenerator<T2>::iterator end2_;
4193 typename ParamGenerator<T2>::iterator current2_;
4194 const typename ParamGenerator<T3>::iterator begin3_;
4195 const typename ParamGenerator<T3>::iterator end3_;
4196 typename ParamGenerator<T3>::iterator current3_;
4197 const typename ParamGenerator<T4>::iterator begin4_;
4198 const typename ParamGenerator<T4>::iterator end4_;
4199 typename ParamGenerator<T4>::iterator current4_;
4200 const typename ParamGenerator<T5>::iterator begin5_;
4201 const typename ParamGenerator<T5>::iterator end5_;
4202 typename ParamGenerator<T5>::iterator current5_;
4203 const typename ParamGenerator<T6>::iterator begin6_;
4204 const typename ParamGenerator<T6>::iterator end6_;
4205 typename ParamGenerator<T6>::iterator current6_;
4206 const typename ParamGenerator<T7>::iterator begin7_;
4207 const typename ParamGenerator<T7>::iterator end7_;
4208 typename ParamGenerator<T7>::iterator current7_;
4209 const typename ParamGenerator<T8>::iterator begin8_;
4210 const typename ParamGenerator<T8>::iterator end8_;
4211 typename ParamGenerator<T8>::iterator current8_;
4212 const typename ParamGenerator<T9>::iterator begin9_;
4213 const typename ParamGenerator<T9>::iterator end9_;
4214 typename ParamGenerator<T9>::iterator current9_;
4215 ParamType current_value_;
4216 }; // class CartesianProductGenerator9::Iterator
4218 // No implementation - assignment is unsupported.
4219 void operator=(const CartesianProductGenerator9& other);
4221 const ParamGenerator<T1> g1_;
4222 const ParamGenerator<T2> g2_;
4223 const ParamGenerator<T3> g3_;
4224 const ParamGenerator<T4> g4_;
4225 const ParamGenerator<T5> g5_;
4226 const ParamGenerator<T6> g6_;
4227 const ParamGenerator<T7> g7_;
4228 const ParamGenerator<T8> g8_;
4229 const ParamGenerator<T9> g9_;
4230 }; // class CartesianProductGenerator9
4233 template <typename T1, typename T2, typename T3, typename T4, typename T5,
4234 typename T6, typename T7, typename T8, typename T9, typename T10>
4235 class CartesianProductGenerator10
4236 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4237 T7, T8, T9, T10> > {
4239 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
4241 CartesianProductGenerator10(const ParamGenerator<T1>& g1,
4242 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
4243 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
4244 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
4245 const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
4246 const ParamGenerator<T10>& g10)
4247 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4248 g9_(g9), g10_(g10) {}
4249 virtual ~CartesianProductGenerator10() {}
4251 virtual ParamIteratorInterface<ParamType>* Begin() const {
4252 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
4253 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
4254 g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
4256 virtual ParamIteratorInterface<ParamType>* End() const {
4257 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
4258 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
4259 g8_.end(), g9_, g9_.end(), g10_, g10_.end());
4263 class Iterator : public ParamIteratorInterface<ParamType> {
4265 Iterator(const ParamGeneratorInterface<ParamType>* base,
4266 const ParamGenerator<T1>& g1,
4267 const typename ParamGenerator<T1>::iterator& current1,
4268 const ParamGenerator<T2>& g2,
4269 const typename ParamGenerator<T2>::iterator& current2,
4270 const ParamGenerator<T3>& g3,
4271 const typename ParamGenerator<T3>::iterator& current3,
4272 const ParamGenerator<T4>& g4,
4273 const typename ParamGenerator<T4>::iterator& current4,
4274 const ParamGenerator<T5>& g5,
4275 const typename ParamGenerator<T5>::iterator& current5,
4276 const ParamGenerator<T6>& g6,
4277 const typename ParamGenerator<T6>::iterator& current6,
4278 const ParamGenerator<T7>& g7,
4279 const typename ParamGenerator<T7>::iterator& current7,
4280 const ParamGenerator<T8>& g8,
4281 const typename ParamGenerator<T8>::iterator& current8,
4282 const ParamGenerator<T9>& g9,
4283 const typename ParamGenerator<T9>::iterator& current9,
4284 const ParamGenerator<T10>& g10,
4285 const typename ParamGenerator<T10>::iterator& current10)
4287 begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
4288 begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
4289 begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
4290 begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
4291 begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
4292 begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
4293 begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
4294 begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
4295 begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
4296 begin10_(g10.begin()), end10_(g10.end()), current10_(current10) {
4297 ComputeCurrentValue();
4299 virtual ~Iterator() {}
4301 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
4304 // Advance should not be called on beyond-of-range iterators
4305 // so no component iterators must be beyond end of range, either.
4306 virtual void Advance() {
4309 if (current10_ == end10_) {
4310 current10_ = begin10_;
4313 if (current9_ == end9_) {
4314 current9_ = begin9_;
4317 if (current8_ == end8_) {
4318 current8_ = begin8_;
4321 if (current7_ == end7_) {
4322 current7_ = begin7_;
4325 if (current6_ == end6_) {
4326 current6_ = begin6_;
4329 if (current5_ == end5_) {
4330 current5_ = begin5_;
4333 if (current4_ == end4_) {
4334 current4_ = begin4_;
4337 if (current3_ == end3_) {
4338 current3_ = begin3_;
4341 if (current2_ == end2_) {
4342 current2_ = begin2_;
4345 ComputeCurrentValue();
4347 virtual ParamIteratorInterface<ParamType>* Clone() const {
4348 return new Iterator(*this);
4350 virtual const ParamType* Current() const { return ¤t_value_; }
4351 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
4352 // Having the same base generator guarantees that the other
4353 // iterator is of the same type and we can downcast.
4354 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
4355 << "The program attempted to compare iterators "
4356 << "from different generators." << std::endl;
4357 const Iterator* typed_other =
4358 CheckedDowncastToActualType<const Iterator>(&other);
4359 // We must report iterators equal if they both point beyond their
4360 // respective ranges. That can happen in a variety of fashions,
4361 // so we have to consult AtEnd().
4362 return (AtEnd() && typed_other->AtEnd()) ||
4364 current1_ == typed_other->current1_ &&
4365 current2_ == typed_other->current2_ &&
4366 current3_ == typed_other->current3_ &&
4367 current4_ == typed_other->current4_ &&
4368 current5_ == typed_other->current5_ &&
4369 current6_ == typed_other->current6_ &&
4370 current7_ == typed_other->current7_ &&
4371 current8_ == typed_other->current8_ &&
4372 current9_ == typed_other->current9_ &&
4373 current10_ == typed_other->current10_);
4377 Iterator(const Iterator& other)
4378 : base_(other.base_),
4379 begin1_(other.begin1_),
4381 current1_(other.current1_),
4382 begin2_(other.begin2_),
4384 current2_(other.current2_),
4385 begin3_(other.begin3_),
4387 current3_(other.current3_),
4388 begin4_(other.begin4_),
4390 current4_(other.current4_),
4391 begin5_(other.begin5_),
4393 current5_(other.current5_),
4394 begin6_(other.begin6_),
4396 current6_(other.current6_),
4397 begin7_(other.begin7_),
4399 current7_(other.current7_),
4400 begin8_(other.begin8_),
4402 current8_(other.current8_),
4403 begin9_(other.begin9_),
4405 current9_(other.current9_),
4406 begin10_(other.begin10_),
4407 end10_(other.end10_),
4408 current10_(other.current10_) {
4409 ComputeCurrentValue();
4412 void ComputeCurrentValue() {
4414 current_value_ = ParamType(*current1_, *current2_, *current3_,
4415 *current4_, *current5_, *current6_, *current7_, *current8_,
4416 *current9_, *current10_);
4418 bool AtEnd() const {
4419 // We must report iterator past the end of the range when either of the
4420 // component iterators has reached the end of its range.
4422 current1_ == end1_ ||
4423 current2_ == end2_ ||
4424 current3_ == end3_ ||
4425 current4_ == end4_ ||
4426 current5_ == end5_ ||
4427 current6_ == end6_ ||
4428 current7_ == end7_ ||
4429 current8_ == end8_ ||
4430 current9_ == end9_ ||
4431 current10_ == end10_;
4434 // No implementation - assignment is unsupported.
4435 void operator=(const Iterator& other);
4437 const ParamGeneratorInterface<ParamType>* const base_;
4438 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
4439 // current[i]_ is the actual traversing iterator.
4440 const typename ParamGenerator<T1>::iterator begin1_;
4441 const typename ParamGenerator<T1>::iterator end1_;
4442 typename ParamGenerator<T1>::iterator current1_;
4443 const typename ParamGenerator<T2>::iterator begin2_;
4444 const typename ParamGenerator<T2>::iterator end2_;
4445 typename ParamGenerator<T2>::iterator current2_;
4446 const typename ParamGenerator<T3>::iterator begin3_;
4447 const typename ParamGenerator<T3>::iterator end3_;
4448 typename ParamGenerator<T3>::iterator current3_;
4449 const typename ParamGenerator<T4>::iterator begin4_;
4450 const typename ParamGenerator<T4>::iterator end4_;
4451 typename ParamGenerator<T4>::iterator current4_;
4452 const typename ParamGenerator<T5>::iterator begin5_;
4453 const typename ParamGenerator<T5>::iterator end5_;
4454 typename ParamGenerator<T5>::iterator current5_;
4455 const typename ParamGenerator<T6>::iterator begin6_;
4456 const typename ParamGenerator<T6>::iterator end6_;
4457 typename ParamGenerator<T6>::iterator current6_;
4458 const typename ParamGenerator<T7>::iterator begin7_;
4459 const typename ParamGenerator<T7>::iterator end7_;
4460 typename ParamGenerator<T7>::iterator current7_;
4461 const typename ParamGenerator<T8>::iterator begin8_;
4462 const typename ParamGenerator<T8>::iterator end8_;
4463 typename ParamGenerator<T8>::iterator current8_;
4464 const typename ParamGenerator<T9>::iterator begin9_;
4465 const typename ParamGenerator<T9>::iterator end9_;
4466 typename ParamGenerator<T9>::iterator current9_;
4467 const typename ParamGenerator<T10>::iterator begin10_;
4468 const typename ParamGenerator<T10>::iterator end10_;
4469 typename ParamGenerator<T10>::iterator current10_;
4470 ParamType current_value_;
4471 }; // class CartesianProductGenerator10::Iterator
4473 // No implementation - assignment is unsupported.
4474 void operator=(const CartesianProductGenerator10& other);
4476 const ParamGenerator<T1> g1_;
4477 const ParamGenerator<T2> g2_;
4478 const ParamGenerator<T3> g3_;
4479 const ParamGenerator<T4> g4_;
4480 const ParamGenerator<T5> g5_;
4481 const ParamGenerator<T6> g6_;
4482 const ParamGenerator<T7> g7_;
4483 const ParamGenerator<T8> g8_;
4484 const ParamGenerator<T9> g9_;
4485 const ParamGenerator<T10> g10_;
4486 }; // class CartesianProductGenerator10
4489 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
4491 // Helper classes providing Combine() with polymorphic features. They allow
4492 // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
4493 // convertible to U.
4495 template <class Generator1, class Generator2>
4496 class CartesianProductHolder2 {
4498 CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
4499 : g1_(g1), g2_(g2) {}
4500 template <typename T1, typename T2>
4501 operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
4502 return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
4503 new CartesianProductGenerator2<T1, T2>(
4504 static_cast<ParamGenerator<T1> >(g1_),
4505 static_cast<ParamGenerator<T2> >(g2_)));
4509 // No implementation - assignment is unsupported.
4510 void operator=(const CartesianProductHolder2& other);
4512 const Generator1 g1_;
4513 const Generator2 g2_;
4514 }; // class CartesianProductHolder2
4516 template <class Generator1, class Generator2, class Generator3>
4517 class CartesianProductHolder3 {
4519 CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
4520 const Generator3& g3)
4521 : g1_(g1), g2_(g2), g3_(g3) {}
4522 template <typename T1, typename T2, typename T3>
4523 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
4524 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
4525 new CartesianProductGenerator3<T1, T2, T3>(
4526 static_cast<ParamGenerator<T1> >(g1_),
4527 static_cast<ParamGenerator<T2> >(g2_),
4528 static_cast<ParamGenerator<T3> >(g3_)));
4532 // No implementation - assignment is unsupported.
4533 void operator=(const CartesianProductHolder3& other);
4535 const Generator1 g1_;
4536 const Generator2 g2_;
4537 const Generator3 g3_;
4538 }; // class CartesianProductHolder3
4540 template <class Generator1, class Generator2, class Generator3,
4542 class CartesianProductHolder4 {
4544 CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
4545 const Generator3& g3, const Generator4& g4)
4546 : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
4547 template <typename T1, typename T2, typename T3, typename T4>
4548 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
4549 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
4550 new CartesianProductGenerator4<T1, T2, T3, T4>(
4551 static_cast<ParamGenerator<T1> >(g1_),
4552 static_cast<ParamGenerator<T2> >(g2_),
4553 static_cast<ParamGenerator<T3> >(g3_),
4554 static_cast<ParamGenerator<T4> >(g4_)));
4558 // No implementation - assignment is unsupported.
4559 void operator=(const CartesianProductHolder4& other);
4561 const Generator1 g1_;
4562 const Generator2 g2_;
4563 const Generator3 g3_;
4564 const Generator4 g4_;
4565 }; // class CartesianProductHolder4
4567 template <class Generator1, class Generator2, class Generator3,
4568 class Generator4, class Generator5>
4569 class CartesianProductHolder5 {
4571 CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
4572 const Generator3& g3, const Generator4& g4, const Generator5& g5)
4573 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
4574 template <typename T1, typename T2, typename T3, typename T4, typename T5>
4575 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
4576 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
4577 new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
4578 static_cast<ParamGenerator<T1> >(g1_),
4579 static_cast<ParamGenerator<T2> >(g2_),
4580 static_cast<ParamGenerator<T3> >(g3_),
4581 static_cast<ParamGenerator<T4> >(g4_),
4582 static_cast<ParamGenerator<T5> >(g5_)));
4586 // No implementation - assignment is unsupported.
4587 void operator=(const CartesianProductHolder5& other);
4589 const Generator1 g1_;
4590 const Generator2 g2_;
4591 const Generator3 g3_;
4592 const Generator4 g4_;
4593 const Generator5 g5_;
4594 }; // class CartesianProductHolder5
4596 template <class Generator1, class Generator2, class Generator3,
4597 class Generator4, class Generator5, class Generator6>
4598 class CartesianProductHolder6 {
4600 CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
4601 const Generator3& g3, const Generator4& g4, const Generator5& g5,
4602 const Generator6& g6)
4603 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
4604 template <typename T1, typename T2, typename T3, typename T4, typename T5,
4606 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
4607 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
4608 new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
4609 static_cast<ParamGenerator<T1> >(g1_),
4610 static_cast<ParamGenerator<T2> >(g2_),
4611 static_cast<ParamGenerator<T3> >(g3_),
4612 static_cast<ParamGenerator<T4> >(g4_),
4613 static_cast<ParamGenerator<T5> >(g5_),
4614 static_cast<ParamGenerator<T6> >(g6_)));
4618 // No implementation - assignment is unsupported.
4619 void operator=(const CartesianProductHolder6& other);
4621 const Generator1 g1_;
4622 const Generator2 g2_;
4623 const Generator3 g3_;
4624 const Generator4 g4_;
4625 const Generator5 g5_;
4626 const Generator6 g6_;
4627 }; // class CartesianProductHolder6
4629 template <class Generator1, class Generator2, class Generator3,
4630 class Generator4, class Generator5, class Generator6, class Generator7>
4631 class CartesianProductHolder7 {
4633 CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
4634 const Generator3& g3, const Generator4& g4, const Generator5& g5,
4635 const Generator6& g6, const Generator7& g7)
4636 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
4637 template <typename T1, typename T2, typename T3, typename T4, typename T5,
4638 typename T6, typename T7>
4639 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
4641 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
4642 new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
4643 static_cast<ParamGenerator<T1> >(g1_),
4644 static_cast<ParamGenerator<T2> >(g2_),
4645 static_cast<ParamGenerator<T3> >(g3_),
4646 static_cast<ParamGenerator<T4> >(g4_),
4647 static_cast<ParamGenerator<T5> >(g5_),
4648 static_cast<ParamGenerator<T6> >(g6_),
4649 static_cast<ParamGenerator<T7> >(g7_)));
4653 // No implementation - assignment is unsupported.
4654 void operator=(const CartesianProductHolder7& other);
4656 const Generator1 g1_;
4657 const Generator2 g2_;
4658 const Generator3 g3_;
4659 const Generator4 g4_;
4660 const Generator5 g5_;
4661 const Generator6 g6_;
4662 const Generator7 g7_;
4663 }; // class CartesianProductHolder7
4665 template <class Generator1, class Generator2, class Generator3,
4666 class Generator4, class Generator5, class Generator6, class Generator7,
4668 class CartesianProductHolder8 {
4670 CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
4671 const Generator3& g3, const Generator4& g4, const Generator5& g5,
4672 const Generator6& g6, const Generator7& g7, const Generator8& g8)
4673 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
4675 template <typename T1, typename T2, typename T3, typename T4, typename T5,
4676 typename T6, typename T7, typename T8>
4677 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
4679 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
4680 new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
4681 static_cast<ParamGenerator<T1> >(g1_),
4682 static_cast<ParamGenerator<T2> >(g2_),
4683 static_cast<ParamGenerator<T3> >(g3_),
4684 static_cast<ParamGenerator<T4> >(g4_),
4685 static_cast<ParamGenerator<T5> >(g5_),
4686 static_cast<ParamGenerator<T6> >(g6_),
4687 static_cast<ParamGenerator<T7> >(g7_),
4688 static_cast<ParamGenerator<T8> >(g8_)));
4692 // No implementation - assignment is unsupported.
4693 void operator=(const CartesianProductHolder8& other);
4695 const Generator1 g1_;
4696 const Generator2 g2_;
4697 const Generator3 g3_;
4698 const Generator4 g4_;
4699 const Generator5 g5_;
4700 const Generator6 g6_;
4701 const Generator7 g7_;
4702 const Generator8 g8_;
4703 }; // class CartesianProductHolder8
4705 template <class Generator1, class Generator2, class Generator3,
4706 class Generator4, class Generator5, class Generator6, class Generator7,
4707 class Generator8, class Generator9>
4708 class CartesianProductHolder9 {
4710 CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
4711 const Generator3& g3, const Generator4& g4, const Generator5& g5,
4712 const Generator6& g6, const Generator7& g7, const Generator8& g8,
4713 const Generator9& g9)
4714 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4716 template <typename T1, typename T2, typename T3, typename T4, typename T5,
4717 typename T6, typename T7, typename T8, typename T9>
4718 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4720 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4722 new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
4723 static_cast<ParamGenerator<T1> >(g1_),
4724 static_cast<ParamGenerator<T2> >(g2_),
4725 static_cast<ParamGenerator<T3> >(g3_),
4726 static_cast<ParamGenerator<T4> >(g4_),
4727 static_cast<ParamGenerator<T5> >(g5_),
4728 static_cast<ParamGenerator<T6> >(g6_),
4729 static_cast<ParamGenerator<T7> >(g7_),
4730 static_cast<ParamGenerator<T8> >(g8_),
4731 static_cast<ParamGenerator<T9> >(g9_)));
4735 // No implementation - assignment is unsupported.
4736 void operator=(const CartesianProductHolder9& other);
4738 const Generator1 g1_;
4739 const Generator2 g2_;
4740 const Generator3 g3_;
4741 const Generator4 g4_;
4742 const Generator5 g5_;
4743 const Generator6 g6_;
4744 const Generator7 g7_;
4745 const Generator8 g8_;
4746 const Generator9 g9_;
4747 }; // class CartesianProductHolder9
4749 template <class Generator1, class Generator2, class Generator3,
4750 class Generator4, class Generator5, class Generator6, class Generator7,
4751 class Generator8, class Generator9, class Generator10>
4752 class CartesianProductHolder10 {
4754 CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
4755 const Generator3& g3, const Generator4& g4, const Generator5& g5,
4756 const Generator6& g6, const Generator7& g7, const Generator8& g8,
4757 const Generator9& g9, const Generator10& g10)
4758 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
4759 g9_(g9), g10_(g10) {}
4760 template <typename T1, typename T2, typename T3, typename T4, typename T5,
4761 typename T6, typename T7, typename T8, typename T9, typename T10>
4762 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4763 T9, T10> >() const {
4764 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
4766 new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
4768 static_cast<ParamGenerator<T1> >(g1_),
4769 static_cast<ParamGenerator<T2> >(g2_),
4770 static_cast<ParamGenerator<T3> >(g3_),
4771 static_cast<ParamGenerator<T4> >(g4_),
4772 static_cast<ParamGenerator<T5> >(g5_),
4773 static_cast<ParamGenerator<T6> >(g6_),
4774 static_cast<ParamGenerator<T7> >(g7_),
4775 static_cast<ParamGenerator<T8> >(g8_),
4776 static_cast<ParamGenerator<T9> >(g9_),
4777 static_cast<ParamGenerator<T10> >(g10_)));
4781 // No implementation - assignment is unsupported.
4782 void operator=(const CartesianProductHolder10& other);
4784 const Generator1 g1_;
4785 const Generator2 g2_;
4786 const Generator3 g3_;
4787 const Generator4 g4_;
4788 const Generator5 g5_;
4789 const Generator6 g6_;
4790 const Generator7 g7_;
4791 const Generator8 g8_;
4792 const Generator9 g9_;
4793 const Generator10 g10_;
4794 }; // class CartesianProductHolder10
4796 #endif // GTEST_HAS_COMBINE
4798 } // namespace internal
4799 } // namespace testing
4801 #endif // GTEST_HAS_PARAM_TEST
4803 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_