1 // This file was GENERATED by a script. DO NOT EDIT BY HAND!!! 2 3 // Copyright 2008 Google Inc. 4 // All Rights Reserved. 5 // 6 // Redistribution and use in source and binary forms, with or without 7 // modification, are permitted provided that the following conditions are 8 // met: 9 // 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 15 // distribution. 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. 19 // 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. 31 // 32 // Author: vladl (at) google.com (Vlad Losev) 33 34 // Type and function utilities for implementing parameterized tests. 35 // This file is generated by a SCRIPT. DO NOT EDIT BY HAND! 36 // 37 // Currently Google Test supports at most 50 arguments in Values, 38 // and at most 10 arguments in Combine. Please contact 39 // googletestframework (at) 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. 43 44 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ 45 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ 46 47 // scripts/fuse_gtest.py depends on gtest's own header being #included 48 // *unconditionally*. Therefore these #includes cannot be moved 49 // inside #if GTEST_HAS_PARAM_TEST. 50 #include "gtest/internal/gtest-param-util.h" 51 #include "gtest/internal/gtest-port.h" 52 53 #if GTEST_HAS_PARAM_TEST 54 55 namespace testing { 56 57 // Forward declarations of ValuesIn(), which is implemented in 58 // include/gtest/gtest-param-test.h. 59 template <typename ForwardIterator> 60 internal::ParamGenerator< 61 typename ::std::iterator_traits<ForwardIterator>::value_type> ValuesIn( 62 ForwardIterator begin, ForwardIterator end); 63 64 template <typename T, size_t N> 65 internal::ParamGenerator<T> ValuesIn(const T (&array)[N]); 66 67 template <class Container> 68 internal::ParamGenerator<typename Container::value_type> ValuesIn( 69 const Container& container); 70 71 namespace internal { 72 73 // Used in the Values() function to provide polymorphic capabilities. 74 template <typename T1> 75 class ValueArray1 { 76 public: 77 explicit ValueArray1(T1 v1) : v1_(v1) {} 78 79 template <typename T> 80 operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); } 81 82 private: 83 // No implementation - assignment is unsupported. 84 void operator=(const ValueArray1& other); 85 86 const T1 v1_; 87 }; 88 89 template <typename T1, typename T2> 90 class ValueArray2 { 91 public: 92 ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} 93 94 template <typename T> 95 operator ParamGenerator<T>() const { 96 const T array[] = {v1_, v2_}; 97 return ValuesIn(array); 98 } 99 100 private: 101 // No implementation - assignment is unsupported. 102 void operator=(const ValueArray2& other); 103 104 const T1 v1_; 105 const T2 v2_; 106 }; 107 108 template <typename T1, typename T2, typename T3> 109 class ValueArray3 { 110 public: 111 ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {} 112 113 template <typename T> 114 operator ParamGenerator<T>() const { 115 const T array[] = {v1_, v2_, v3_}; 116 return ValuesIn(array); 117 } 118 119 private: 120 // No implementation - assignment is unsupported. 121 void operator=(const ValueArray3& other); 122 123 const T1 v1_; 124 const T2 v2_; 125 const T3 v3_; 126 }; 127 128 template <typename T1, typename T2, typename T3, typename T4> 129 class ValueArray4 { 130 public: 131 ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3), 132 v4_(v4) {} 133 134 template <typename T> 135 operator ParamGenerator<T>() const { 136 const T array[] = {v1_, v2_, v3_, v4_}; 137 return ValuesIn(array); 138 } 139 140 private: 141 // No implementation - assignment is unsupported. 142 void operator=(const ValueArray4& other); 143 144 const T1 v1_; 145 const T2 v2_; 146 const T3 v3_; 147 const T4 v4_; 148 }; 149 150 template <typename T1, typename T2, typename T3, typename T4, typename T5> 151 class ValueArray5 { 152 public: 153 ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3), 154 v4_(v4), v5_(v5) {} 155 156 template <typename T> 157 operator ParamGenerator<T>() const { 158 const T array[] = {v1_, v2_, v3_, v4_, v5_}; 159 return ValuesIn(array); 160 } 161 162 private: 163 // No implementation - assignment is unsupported. 164 void operator=(const ValueArray5& other); 165 166 const T1 v1_; 167 const T2 v2_; 168 const T3 v3_; 169 const T4 v4_; 170 const T5 v5_; 171 }; 172 173 template <typename T1, typename T2, typename T3, typename T4, typename T5, 174 typename T6> 175 class ValueArray6 { 176 public: 177 ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2), 178 v3_(v3), v4_(v4), v5_(v5), v6_(v6) {} 179 180 template <typename T> 181 operator ParamGenerator<T>() const { 182 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_}; 183 return ValuesIn(array); 184 } 185 186 private: 187 // No implementation - assignment is unsupported. 188 void operator=(const ValueArray6& other); 189 190 const T1 v1_; 191 const T2 v2_; 192 const T3 v3_; 193 const T4 v4_; 194 const T5 v5_; 195 const T6 v6_; 196 }; 197 198 template <typename T1, typename T2, typename T3, typename T4, typename T5, 199 typename T6, typename T7> 200 class ValueArray7 { 201 public: 202 ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1), 203 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {} 204 205 template <typename T> 206 operator ParamGenerator<T>() const { 207 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_}; 208 return ValuesIn(array); 209 } 210 211 private: 212 // No implementation - assignment is unsupported. 213 void operator=(const ValueArray7& other); 214 215 const T1 v1_; 216 const T2 v2_; 217 const T3 v3_; 218 const T4 v4_; 219 const T5 v5_; 220 const T6 v6_; 221 const T7 v7_; 222 }; 223 224 template <typename T1, typename T2, typename T3, typename T4, typename T5, 225 typename T6, typename T7, typename T8> 226 class ValueArray8 { 227 public: 228 ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, 229 T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 230 v8_(v8) {} 231 232 template <typename T> 233 operator ParamGenerator<T>() const { 234 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_}; 235 return ValuesIn(array); 236 } 237 238 private: 239 // No implementation - assignment is unsupported. 240 void operator=(const ValueArray8& other); 241 242 const T1 v1_; 243 const T2 v2_; 244 const T3 v3_; 245 const T4 v4_; 246 const T5 v5_; 247 const T6 v6_; 248 const T7 v7_; 249 const T8 v8_; 250 }; 251 252 template <typename T1, typename T2, typename T3, typename T4, typename T5, 253 typename T6, typename T7, typename T8, typename T9> 254 class ValueArray9 { 255 public: 256 ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, 257 T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 258 v8_(v8), v9_(v9) {} 259 260 template <typename T> 261 operator ParamGenerator<T>() const { 262 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_}; 263 return ValuesIn(array); 264 } 265 266 private: 267 // No implementation - assignment is unsupported. 268 void operator=(const ValueArray9& other); 269 270 const T1 v1_; 271 const T2 v2_; 272 const T3 v3_; 273 const T4 v4_; 274 const T5 v5_; 275 const T6 v6_; 276 const T7 v7_; 277 const T8 v8_; 278 const T9 v9_; 279 }; 280 281 template <typename T1, typename T2, typename T3, typename T4, typename T5, 282 typename T6, typename T7, typename T8, typename T9, typename T10> 283 class ValueArray10 { 284 public: 285 ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 286 T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 287 v8_(v8), v9_(v9), v10_(v10) {} 288 289 template <typename T> 290 operator ParamGenerator<T>() const { 291 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_}; 292 return ValuesIn(array); 293 } 294 295 private: 296 // No implementation - assignment is unsupported. 297 void operator=(const ValueArray10& other); 298 299 const T1 v1_; 300 const T2 v2_; 301 const T3 v3_; 302 const T4 v4_; 303 const T5 v5_; 304 const T6 v6_; 305 const T7 v7_; 306 const T8 v8_; 307 const T9 v9_; 308 const T10 v10_; 309 }; 310 311 template <typename T1, typename T2, typename T3, typename T4, typename T5, 312 typename T6, typename T7, typename T8, typename T9, typename T10, 313 typename T11> 314 class ValueArray11 { 315 public: 316 ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 317 T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), 318 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {} 319 320 template <typename T> 321 operator ParamGenerator<T>() const { 322 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_}; 323 return ValuesIn(array); 324 } 325 326 private: 327 // No implementation - assignment is unsupported. 328 void operator=(const ValueArray11& other); 329 330 const T1 v1_; 331 const T2 v2_; 332 const T3 v3_; 333 const T4 v4_; 334 const T5 v5_; 335 const T6 v6_; 336 const T7 v7_; 337 const T8 v8_; 338 const T9 v9_; 339 const T10 v10_; 340 const T11 v11_; 341 }; 342 343 template <typename T1, typename T2, typename T3, typename T4, typename T5, 344 typename T6, typename T7, typename T8, typename T9, typename T10, 345 typename T11, typename T12> 346 class ValueArray12 { 347 public: 348 ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 349 T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), 350 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {} 351 352 template <typename T> 353 operator ParamGenerator<T>() const { 354 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 355 v12_}; 356 return ValuesIn(array); 357 } 358 359 private: 360 // No implementation - assignment is unsupported. 361 void operator=(const ValueArray12& other); 362 363 const T1 v1_; 364 const T2 v2_; 365 const T3 v3_; 366 const T4 v4_; 367 const T5 v5_; 368 const T6 v6_; 369 const T7 v7_; 370 const T8 v8_; 371 const T9 v9_; 372 const T10 v10_; 373 const T11 v11_; 374 const T12 v12_; 375 }; 376 377 template <typename T1, typename T2, typename T3, typename T4, typename T5, 378 typename T6, typename T7, typename T8, typename T9, typename T10, 379 typename T11, typename T12, typename T13> 380 class ValueArray13 { 381 public: 382 ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 383 T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), 384 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), 385 v12_(v12), v13_(v13) {} 386 387 template <typename T> 388 operator ParamGenerator<T>() const { 389 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 390 v12_, v13_}; 391 return ValuesIn(array); 392 } 393 394 private: 395 // No implementation - assignment is unsupported. 396 void operator=(const ValueArray13& other); 397 398 const T1 v1_; 399 const T2 v2_; 400 const T3 v3_; 401 const T4 v4_; 402 const T5 v5_; 403 const T6 v6_; 404 const T7 v7_; 405 const T8 v8_; 406 const T9 v9_; 407 const T10 v10_; 408 const T11 v11_; 409 const T12 v12_; 410 const T13 v13_; 411 }; 412 413 template <typename T1, typename T2, typename T3, typename T4, typename T5, 414 typename T6, typename T7, typename T8, typename T9, typename T10, 415 typename T11, typename T12, typename T13, typename T14> 416 class ValueArray14 { 417 public: 418 ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 419 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3), 420 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 421 v11_(v11), v12_(v12), v13_(v13), v14_(v14) {} 422 423 template <typename T> 424 operator ParamGenerator<T>() const { 425 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 426 v12_, v13_, v14_}; 427 return ValuesIn(array); 428 } 429 430 private: 431 // No implementation - assignment is unsupported. 432 void operator=(const ValueArray14& other); 433 434 const T1 v1_; 435 const T2 v2_; 436 const T3 v3_; 437 const T4 v4_; 438 const T5 v5_; 439 const T6 v6_; 440 const T7 v7_; 441 const T8 v8_; 442 const T9 v9_; 443 const T10 v10_; 444 const T11 v11_; 445 const T12 v12_; 446 const T13 v13_; 447 const T14 v14_; 448 }; 449 450 template <typename T1, typename T2, typename T3, typename T4, typename T5, 451 typename T6, typename T7, typename T8, typename T9, typename T10, 452 typename T11, typename T12, typename T13, typename T14, typename T15> 453 class ValueArray15 { 454 public: 455 ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 456 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2), 457 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 458 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {} 459 460 template <typename T> 461 operator ParamGenerator<T>() const { 462 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 463 v12_, v13_, v14_, v15_}; 464 return ValuesIn(array); 465 } 466 467 private: 468 // No implementation - assignment is unsupported. 469 void operator=(const ValueArray15& other); 470 471 const T1 v1_; 472 const T2 v2_; 473 const T3 v3_; 474 const T4 v4_; 475 const T5 v5_; 476 const T6 v6_; 477 const T7 v7_; 478 const T8 v8_; 479 const T9 v9_; 480 const T10 v10_; 481 const T11 v11_; 482 const T12 v12_; 483 const T13 v13_; 484 const T14 v14_; 485 const T15 v15_; 486 }; 487 488 template <typename T1, typename T2, typename T3, typename T4, typename T5, 489 typename T6, typename T7, typename T8, typename T9, typename T10, 490 typename T11, typename T12, typename T13, typename T14, typename T15, 491 typename T16> 492 class ValueArray16 { 493 public: 494 ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 495 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1), 496 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), 497 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), 498 v16_(v16) {} 499 500 template <typename T> 501 operator ParamGenerator<T>() const { 502 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 503 v12_, v13_, v14_, v15_, v16_}; 504 return ValuesIn(array); 505 } 506 507 private: 508 // No implementation - assignment is unsupported. 509 void operator=(const ValueArray16& other); 510 511 const T1 v1_; 512 const T2 v2_; 513 const T3 v3_; 514 const T4 v4_; 515 const T5 v5_; 516 const T6 v6_; 517 const T7 v7_; 518 const T8 v8_; 519 const T9 v9_; 520 const T10 v10_; 521 const T11 v11_; 522 const T12 v12_; 523 const T13 v13_; 524 const T14 v14_; 525 const T15 v15_; 526 const T16 v16_; 527 }; 528 529 template <typename T1, typename T2, typename T3, typename T4, typename T5, 530 typename T6, typename T7, typename T8, typename T9, typename T10, 531 typename T11, typename T12, typename T13, typename T14, typename T15, 532 typename T16, typename T17> 533 class ValueArray17 { 534 public: 535 ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 536 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, 537 T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 538 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 539 v15_(v15), v16_(v16), v17_(v17) {} 540 541 template <typename T> 542 operator ParamGenerator<T>() const { 543 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 544 v12_, v13_, v14_, v15_, v16_, v17_}; 545 return ValuesIn(array); 546 } 547 548 private: 549 // No implementation - assignment is unsupported. 550 void operator=(const ValueArray17& other); 551 552 const T1 v1_; 553 const T2 v2_; 554 const T3 v3_; 555 const T4 v4_; 556 const T5 v5_; 557 const T6 v6_; 558 const T7 v7_; 559 const T8 v8_; 560 const T9 v9_; 561 const T10 v10_; 562 const T11 v11_; 563 const T12 v12_; 564 const T13 v13_; 565 const T14 v14_; 566 const T15 v15_; 567 const T16 v16_; 568 const T17 v17_; 569 }; 570 571 template <typename T1, typename T2, typename T3, typename T4, typename T5, 572 typename T6, typename T7, typename T8, typename T9, typename T10, 573 typename T11, typename T12, typename T13, typename T14, typename T15, 574 typename T16, typename T17, typename T18> 575 class ValueArray18 { 576 public: 577 ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 578 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 579 T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 580 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 581 v15_(v15), v16_(v16), v17_(v17), v18_(v18) {} 582 583 template <typename T> 584 operator ParamGenerator<T>() const { 585 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 586 v12_, v13_, v14_, v15_, v16_, v17_, v18_}; 587 return ValuesIn(array); 588 } 589 590 private: 591 // No implementation - assignment is unsupported. 592 void operator=(const ValueArray18& other); 593 594 const T1 v1_; 595 const T2 v2_; 596 const T3 v3_; 597 const T4 v4_; 598 const T5 v5_; 599 const T6 v6_; 600 const T7 v7_; 601 const T8 v8_; 602 const T9 v9_; 603 const T10 v10_; 604 const T11 v11_; 605 const T12 v12_; 606 const T13 v13_; 607 const T14 v14_; 608 const T15 v15_; 609 const T16 v16_; 610 const T17 v17_; 611 const T18 v18_; 612 }; 613 614 template <typename T1, typename T2, typename T3, typename T4, typename T5, 615 typename T6, typename T7, typename T8, typename T9, typename T10, 616 typename T11, typename T12, typename T13, typename T14, typename T15, 617 typename T16, typename T17, typename T18, typename T19> 618 class ValueArray19 { 619 public: 620 ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 621 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 622 T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), 623 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), 624 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {} 625 626 template <typename T> 627 operator ParamGenerator<T>() const { 628 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 629 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_}; 630 return ValuesIn(array); 631 } 632 633 private: 634 // No implementation - assignment is unsupported. 635 void operator=(const ValueArray19& other); 636 637 const T1 v1_; 638 const T2 v2_; 639 const T3 v3_; 640 const T4 v4_; 641 const T5 v5_; 642 const T6 v6_; 643 const T7 v7_; 644 const T8 v8_; 645 const T9 v9_; 646 const T10 v10_; 647 const T11 v11_; 648 const T12 v12_; 649 const T13 v13_; 650 const T14 v14_; 651 const T15 v15_; 652 const T16 v16_; 653 const T17 v17_; 654 const T18 v18_; 655 const T19 v19_; 656 }; 657 658 template <typename T1, typename T2, typename T3, typename T4, typename T5, 659 typename T6, typename T7, typename T8, typename T9, typename T10, 660 typename T11, typename T12, typename T13, typename T14, typename T15, 661 typename T16, typename T17, typename T18, typename T19, typename T20> 662 class ValueArray20 { 663 public: 664 ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 665 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 666 T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), 667 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), 668 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), 669 v19_(v19), v20_(v20) {} 670 671 template <typename T> 672 operator ParamGenerator<T>() const { 673 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 674 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_}; 675 return ValuesIn(array); 676 } 677 678 private: 679 // No implementation - assignment is unsupported. 680 void operator=(const ValueArray20& other); 681 682 const T1 v1_; 683 const T2 v2_; 684 const T3 v3_; 685 const T4 v4_; 686 const T5 v5_; 687 const T6 v6_; 688 const T7 v7_; 689 const T8 v8_; 690 const T9 v9_; 691 const T10 v10_; 692 const T11 v11_; 693 const T12 v12_; 694 const T13 v13_; 695 const T14 v14_; 696 const T15 v15_; 697 const T16 v16_; 698 const T17 v17_; 699 const T18 v18_; 700 const T19 v19_; 701 const T20 v20_; 702 }; 703 704 template <typename T1, typename T2, typename T3, typename T4, typename T5, 705 typename T6, typename T7, typename T8, typename T9, typename T10, 706 typename T11, typename T12, typename T13, typename T14, typename T15, 707 typename T16, typename T17, typename T18, typename T19, typename T20, 708 typename T21> 709 class ValueArray21 { 710 public: 711 ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 712 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 713 T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), 714 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), 715 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), 716 v18_(v18), v19_(v19), v20_(v20), v21_(v21) {} 717 718 template <typename T> 719 operator ParamGenerator<T>() const { 720 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 721 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_}; 722 return ValuesIn(array); 723 } 724 725 private: 726 // No implementation - assignment is unsupported. 727 void operator=(const ValueArray21& other); 728 729 const T1 v1_; 730 const T2 v2_; 731 const T3 v3_; 732 const T4 v4_; 733 const T5 v5_; 734 const T6 v6_; 735 const T7 v7_; 736 const T8 v8_; 737 const T9 v9_; 738 const T10 v10_; 739 const T11 v11_; 740 const T12 v12_; 741 const T13 v13_; 742 const T14 v14_; 743 const T15 v15_; 744 const T16 v16_; 745 const T17 v17_; 746 const T18 v18_; 747 const T19 v19_; 748 const T20 v20_; 749 const T21 v21_; 750 }; 751 752 template <typename T1, typename T2, typename T3, typename T4, typename T5, 753 typename T6, typename T7, typename T8, typename T9, typename T10, 754 typename T11, typename T12, typename T13, typename T14, typename T15, 755 typename T16, typename T17, typename T18, typename T19, typename T20, 756 typename T21, typename T22> 757 class ValueArray22 { 758 public: 759 ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 760 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 761 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3), 762 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 763 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 764 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {} 765 766 template <typename T> 767 operator ParamGenerator<T>() const { 768 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 769 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_}; 770 return ValuesIn(array); 771 } 772 773 private: 774 // No implementation - assignment is unsupported. 775 void operator=(const ValueArray22& other); 776 777 const T1 v1_; 778 const T2 v2_; 779 const T3 v3_; 780 const T4 v4_; 781 const T5 v5_; 782 const T6 v6_; 783 const T7 v7_; 784 const T8 v8_; 785 const T9 v9_; 786 const T10 v10_; 787 const T11 v11_; 788 const T12 v12_; 789 const T13 v13_; 790 const T14 v14_; 791 const T15 v15_; 792 const T16 v16_; 793 const T17 v17_; 794 const T18 v18_; 795 const T19 v19_; 796 const T20 v20_; 797 const T21 v21_; 798 const T22 v22_; 799 }; 800 801 template <typename T1, typename T2, typename T3, typename T4, typename T5, 802 typename T6, typename T7, typename T8, typename T9, typename T10, 803 typename T11, typename T12, typename T13, typename T14, typename T15, 804 typename T16, typename T17, typename T18, typename T19, typename T20, 805 typename T21, typename T22, typename T23> 806 class ValueArray23 { 807 public: 808 ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 809 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 810 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2), 811 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 812 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 813 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 814 v23_(v23) {} 815 816 template <typename T> 817 operator ParamGenerator<T>() const { 818 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 819 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, 820 v23_}; 821 return ValuesIn(array); 822 } 823 824 private: 825 // No implementation - assignment is unsupported. 826 void operator=(const ValueArray23& other); 827 828 const T1 v1_; 829 const T2 v2_; 830 const T3 v3_; 831 const T4 v4_; 832 const T5 v5_; 833 const T6 v6_; 834 const T7 v7_; 835 const T8 v8_; 836 const T9 v9_; 837 const T10 v10_; 838 const T11 v11_; 839 const T12 v12_; 840 const T13 v13_; 841 const T14 v14_; 842 const T15 v15_; 843 const T16 v16_; 844 const T17 v17_; 845 const T18 v18_; 846 const T19 v19_; 847 const T20 v20_; 848 const T21 v21_; 849 const T22 v22_; 850 const T23 v23_; 851 }; 852 853 template <typename T1, typename T2, typename T3, typename T4, typename T5, 854 typename T6, typename T7, typename T8, typename T9, typename T10, 855 typename T11, typename T12, typename T13, typename T14, typename T15, 856 typename T16, typename T17, typename T18, typename T19, typename T20, 857 typename T21, typename T22, typename T23, typename T24> 858 class ValueArray24 { 859 public: 860 ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 861 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 862 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1), 863 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), 864 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), 865 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), 866 v22_(v22), v23_(v23), v24_(v24) {} 867 868 template <typename T> 869 operator ParamGenerator<T>() const { 870 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 871 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 872 v24_}; 873 return ValuesIn(array); 874 } 875 876 private: 877 // No implementation - assignment is unsupported. 878 void operator=(const ValueArray24& other); 879 880 const T1 v1_; 881 const T2 v2_; 882 const T3 v3_; 883 const T4 v4_; 884 const T5 v5_; 885 const T6 v6_; 886 const T7 v7_; 887 const T8 v8_; 888 const T9 v9_; 889 const T10 v10_; 890 const T11 v11_; 891 const T12 v12_; 892 const T13 v13_; 893 const T14 v14_; 894 const T15 v15_; 895 const T16 v16_; 896 const T17 v17_; 897 const T18 v18_; 898 const T19 v19_; 899 const T20 v20_; 900 const T21 v21_; 901 const T22 v22_; 902 const T23 v23_; 903 const T24 v24_; 904 }; 905 906 template <typename T1, typename T2, typename T3, typename T4, typename T5, 907 typename T6, typename T7, typename T8, typename T9, typename T10, 908 typename T11, typename T12, typename T13, typename T14, typename T15, 909 typename T16, typename T17, typename T18, typename T19, typename T20, 910 typename T21, typename T22, typename T23, typename T24, typename T25> 911 class ValueArray25 { 912 public: 913 ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 914 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 915 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, 916 T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 917 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 918 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 919 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {} 920 921 template <typename T> 922 operator ParamGenerator<T>() const { 923 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 924 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 925 v24_, v25_}; 926 return ValuesIn(array); 927 } 928 929 private: 930 // No implementation - assignment is unsupported. 931 void operator=(const ValueArray25& other); 932 933 const T1 v1_; 934 const T2 v2_; 935 const T3 v3_; 936 const T4 v4_; 937 const T5 v5_; 938 const T6 v6_; 939 const T7 v7_; 940 const T8 v8_; 941 const T9 v9_; 942 const T10 v10_; 943 const T11 v11_; 944 const T12 v12_; 945 const T13 v13_; 946 const T14 v14_; 947 const T15 v15_; 948 const T16 v16_; 949 const T17 v17_; 950 const T18 v18_; 951 const T19 v19_; 952 const T20 v20_; 953 const T21 v21_; 954 const T22 v22_; 955 const T23 v23_; 956 const T24 v24_; 957 const T25 v25_; 958 }; 959 960 template <typename T1, typename T2, typename T3, typename T4, typename T5, 961 typename T6, typename T7, typename T8, typename T9, typename T10, 962 typename T11, typename T12, typename T13, typename T14, typename T15, 963 typename T16, typename T17, typename T18, typename T19, typename T20, 964 typename T21, typename T22, typename T23, typename T24, typename T25, 965 typename T26> 966 class ValueArray26 { 967 public: 968 ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 969 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 970 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 971 T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 972 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 973 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 974 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {} 975 976 template <typename T> 977 operator ParamGenerator<T>() const { 978 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 979 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 980 v24_, v25_, v26_}; 981 return ValuesIn(array); 982 } 983 984 private: 985 // No implementation - assignment is unsupported. 986 void operator=(const ValueArray26& other); 987 988 const T1 v1_; 989 const T2 v2_; 990 const T3 v3_; 991 const T4 v4_; 992 const T5 v5_; 993 const T6 v6_; 994 const T7 v7_; 995 const T8 v8_; 996 const T9 v9_; 997 const T10 v10_; 998 const T11 v11_; 999 const T12 v12_; 1000 const T13 v13_; 1001 const T14 v14_; 1002 const T15 v15_; 1003 const T16 v16_; 1004 const T17 v17_; 1005 const T18 v18_; 1006 const T19 v19_; 1007 const T20 v20_; 1008 const T21 v21_; 1009 const T22 v22_; 1010 const T23 v23_; 1011 const T24 v24_; 1012 const T25 v25_; 1013 const T26 v26_; 1014 }; 1015 1016 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1017 typename T6, typename T7, typename T8, typename T9, typename T10, 1018 typename T11, typename T12, typename T13, typename T14, typename T15, 1019 typename T16, typename T17, typename T18, typename T19, typename T20, 1020 typename T21, typename T22, typename T23, typename T24, typename T25, 1021 typename T26, typename T27> 1022 class ValueArray27 { 1023 public: 1024 ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1025 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1026 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1027 T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), 1028 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), 1029 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), 1030 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), 1031 v26_(v26), v27_(v27) {} 1032 1033 template <typename T> 1034 operator ParamGenerator<T>() const { 1035 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1036 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1037 v24_, v25_, v26_, v27_}; 1038 return ValuesIn(array); 1039 } 1040 1041 private: 1042 // No implementation - assignment is unsupported. 1043 void operator=(const ValueArray27& other); 1044 1045 const T1 v1_; 1046 const T2 v2_; 1047 const T3 v3_; 1048 const T4 v4_; 1049 const T5 v5_; 1050 const T6 v6_; 1051 const T7 v7_; 1052 const T8 v8_; 1053 const T9 v9_; 1054 const T10 v10_; 1055 const T11 v11_; 1056 const T12 v12_; 1057 const T13 v13_; 1058 const T14 v14_; 1059 const T15 v15_; 1060 const T16 v16_; 1061 const T17 v17_; 1062 const T18 v18_; 1063 const T19 v19_; 1064 const T20 v20_; 1065 const T21 v21_; 1066 const T22 v22_; 1067 const T23 v23_; 1068 const T24 v24_; 1069 const T25 v25_; 1070 const T26 v26_; 1071 const T27 v27_; 1072 }; 1073 1074 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1075 typename T6, typename T7, typename T8, typename T9, typename T10, 1076 typename T11, typename T12, typename T13, typename T14, typename T15, 1077 typename T16, typename T17, typename T18, typename T19, typename T20, 1078 typename T21, typename T22, typename T23, typename T24, typename T25, 1079 typename T26, typename T27, typename T28> 1080 class ValueArray28 { 1081 public: 1082 ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1083 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1084 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1085 T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), 1086 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), 1087 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), 1088 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), 1089 v25_(v25), v26_(v26), v27_(v27), v28_(v28) {} 1090 1091 template <typename T> 1092 operator ParamGenerator<T>() const { 1093 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1094 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1095 v24_, v25_, v26_, v27_, v28_}; 1096 return ValuesIn(array); 1097 } 1098 1099 private: 1100 // No implementation - assignment is unsupported. 1101 void operator=(const ValueArray28& other); 1102 1103 const T1 v1_; 1104 const T2 v2_; 1105 const T3 v3_; 1106 const T4 v4_; 1107 const T5 v5_; 1108 const T6 v6_; 1109 const T7 v7_; 1110 const T8 v8_; 1111 const T9 v9_; 1112 const T10 v10_; 1113 const T11 v11_; 1114 const T12 v12_; 1115 const T13 v13_; 1116 const T14 v14_; 1117 const T15 v15_; 1118 const T16 v16_; 1119 const T17 v17_; 1120 const T18 v18_; 1121 const T19 v19_; 1122 const T20 v20_; 1123 const T21 v21_; 1124 const T22 v22_; 1125 const T23 v23_; 1126 const T24 v24_; 1127 const T25 v25_; 1128 const T26 v26_; 1129 const T27 v27_; 1130 const T28 v28_; 1131 }; 1132 1133 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1134 typename T6, typename T7, typename T8, typename T9, typename T10, 1135 typename T11, typename T12, typename T13, typename T14, typename T15, 1136 typename T16, typename T17, typename T18, typename T19, typename T20, 1137 typename T21, typename T22, typename T23, typename T24, typename T25, 1138 typename T26, typename T27, typename T28, typename T29> 1139 class ValueArray29 { 1140 public: 1141 ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1142 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1143 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1144 T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), 1145 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), 1146 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), 1147 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), 1148 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {} 1149 1150 template <typename T> 1151 operator ParamGenerator<T>() const { 1152 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1153 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1154 v24_, v25_, v26_, v27_, v28_, v29_}; 1155 return ValuesIn(array); 1156 } 1157 1158 private: 1159 // No implementation - assignment is unsupported. 1160 void operator=(const ValueArray29& other); 1161 1162 const T1 v1_; 1163 const T2 v2_; 1164 const T3 v3_; 1165 const T4 v4_; 1166 const T5 v5_; 1167 const T6 v6_; 1168 const T7 v7_; 1169 const T8 v8_; 1170 const T9 v9_; 1171 const T10 v10_; 1172 const T11 v11_; 1173 const T12 v12_; 1174 const T13 v13_; 1175 const T14 v14_; 1176 const T15 v15_; 1177 const T16 v16_; 1178 const T17 v17_; 1179 const T18 v18_; 1180 const T19 v19_; 1181 const T20 v20_; 1182 const T21 v21_; 1183 const T22 v22_; 1184 const T23 v23_; 1185 const T24 v24_; 1186 const T25 v25_; 1187 const T26 v26_; 1188 const T27 v27_; 1189 const T28 v28_; 1190 const T29 v29_; 1191 }; 1192 1193 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1194 typename T6, typename T7, typename T8, typename T9, typename T10, 1195 typename T11, typename T12, typename T13, typename T14, typename T15, 1196 typename T16, typename T17, typename T18, typename T19, typename T20, 1197 typename T21, typename T22, typename T23, typename T24, typename T25, 1198 typename T26, typename T27, typename T28, typename T29, typename T30> 1199 class ValueArray30 { 1200 public: 1201 ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1202 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1203 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1204 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3), 1205 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 1206 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 1207 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 1208 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), 1209 v29_(v29), v30_(v30) {} 1210 1211 template <typename T> 1212 operator ParamGenerator<T>() const { 1213 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1214 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1215 v24_, v25_, v26_, v27_, v28_, v29_, v30_}; 1216 return ValuesIn(array); 1217 } 1218 1219 private: 1220 // No implementation - assignment is unsupported. 1221 void operator=(const ValueArray30& other); 1222 1223 const T1 v1_; 1224 const T2 v2_; 1225 const T3 v3_; 1226 const T4 v4_; 1227 const T5 v5_; 1228 const T6 v6_; 1229 const T7 v7_; 1230 const T8 v8_; 1231 const T9 v9_; 1232 const T10 v10_; 1233 const T11 v11_; 1234 const T12 v12_; 1235 const T13 v13_; 1236 const T14 v14_; 1237 const T15 v15_; 1238 const T16 v16_; 1239 const T17 v17_; 1240 const T18 v18_; 1241 const T19 v19_; 1242 const T20 v20_; 1243 const T21 v21_; 1244 const T22 v22_; 1245 const T23 v23_; 1246 const T24 v24_; 1247 const T25 v25_; 1248 const T26 v26_; 1249 const T27 v27_; 1250 const T28 v28_; 1251 const T29 v29_; 1252 const T30 v30_; 1253 }; 1254 1255 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1256 typename T6, typename T7, typename T8, typename T9, typename T10, 1257 typename T11, typename T12, typename T13, typename T14, typename T15, 1258 typename T16, typename T17, typename T18, typename T19, typename T20, 1259 typename T21, typename T22, typename T23, typename T24, typename T25, 1260 typename T26, typename T27, typename T28, typename T29, typename T30, 1261 typename T31> 1262 class ValueArray31 { 1263 public: 1264 ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1265 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1266 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1267 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2), 1268 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 1269 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 1270 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 1271 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), 1272 v29_(v29), v30_(v30), v31_(v31) {} 1273 1274 template <typename T> 1275 operator ParamGenerator<T>() const { 1276 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1277 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1278 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_}; 1279 return ValuesIn(array); 1280 } 1281 1282 private: 1283 // No implementation - assignment is unsupported. 1284 void operator=(const ValueArray31& other); 1285 1286 const T1 v1_; 1287 const T2 v2_; 1288 const T3 v3_; 1289 const T4 v4_; 1290 const T5 v5_; 1291 const T6 v6_; 1292 const T7 v7_; 1293 const T8 v8_; 1294 const T9 v9_; 1295 const T10 v10_; 1296 const T11 v11_; 1297 const T12 v12_; 1298 const T13 v13_; 1299 const T14 v14_; 1300 const T15 v15_; 1301 const T16 v16_; 1302 const T17 v17_; 1303 const T18 v18_; 1304 const T19 v19_; 1305 const T20 v20_; 1306 const T21 v21_; 1307 const T22 v22_; 1308 const T23 v23_; 1309 const T24 v24_; 1310 const T25 v25_; 1311 const T26 v26_; 1312 const T27 v27_; 1313 const T28 v28_; 1314 const T29 v29_; 1315 const T30 v30_; 1316 const T31 v31_; 1317 }; 1318 1319 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1320 typename T6, typename T7, typename T8, typename T9, typename T10, 1321 typename T11, typename T12, typename T13, typename T14, typename T15, 1322 typename T16, typename T17, typename T18, typename T19, typename T20, 1323 typename T21, typename T22, typename T23, typename T24, typename T25, 1324 typename T26, typename T27, typename T28, typename T29, typename T30, 1325 typename T31, typename T32> 1326 class ValueArray32 { 1327 public: 1328 ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1329 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1330 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1331 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1), 1332 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), 1333 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), 1334 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), 1335 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), 1336 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {} 1337 1338 template <typename T> 1339 operator ParamGenerator<T>() const { 1340 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1341 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1342 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_}; 1343 return ValuesIn(array); 1344 } 1345 1346 private: 1347 // No implementation - assignment is unsupported. 1348 void operator=(const ValueArray32& other); 1349 1350 const T1 v1_; 1351 const T2 v2_; 1352 const T3 v3_; 1353 const T4 v4_; 1354 const T5 v5_; 1355 const T6 v6_; 1356 const T7 v7_; 1357 const T8 v8_; 1358 const T9 v9_; 1359 const T10 v10_; 1360 const T11 v11_; 1361 const T12 v12_; 1362 const T13 v13_; 1363 const T14 v14_; 1364 const T15 v15_; 1365 const T16 v16_; 1366 const T17 v17_; 1367 const T18 v18_; 1368 const T19 v19_; 1369 const T20 v20_; 1370 const T21 v21_; 1371 const T22 v22_; 1372 const T23 v23_; 1373 const T24 v24_; 1374 const T25 v25_; 1375 const T26 v26_; 1376 const T27 v27_; 1377 const T28 v28_; 1378 const T29 v29_; 1379 const T30 v30_; 1380 const T31 v31_; 1381 const T32 v32_; 1382 }; 1383 1384 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1385 typename T6, typename T7, typename T8, typename T9, typename T10, 1386 typename T11, typename T12, typename T13, typename T14, typename T15, 1387 typename T16, typename T17, typename T18, typename T19, typename T20, 1388 typename T21, typename T22, typename T23, typename T24, typename T25, 1389 typename T26, typename T27, typename T28, typename T29, typename T30, 1390 typename T31, typename T32, typename T33> 1391 class ValueArray33 { 1392 public: 1393 ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1394 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1395 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1396 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, 1397 T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 1398 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 1399 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 1400 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), 1401 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), 1402 v33_(v33) {} 1403 1404 template <typename T> 1405 operator ParamGenerator<T>() const { 1406 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1407 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1408 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_}; 1409 return ValuesIn(array); 1410 } 1411 1412 private: 1413 // No implementation - assignment is unsupported. 1414 void operator=(const ValueArray33& other); 1415 1416 const T1 v1_; 1417 const T2 v2_; 1418 const T3 v3_; 1419 const T4 v4_; 1420 const T5 v5_; 1421 const T6 v6_; 1422 const T7 v7_; 1423 const T8 v8_; 1424 const T9 v9_; 1425 const T10 v10_; 1426 const T11 v11_; 1427 const T12 v12_; 1428 const T13 v13_; 1429 const T14 v14_; 1430 const T15 v15_; 1431 const T16 v16_; 1432 const T17 v17_; 1433 const T18 v18_; 1434 const T19 v19_; 1435 const T20 v20_; 1436 const T21 v21_; 1437 const T22 v22_; 1438 const T23 v23_; 1439 const T24 v24_; 1440 const T25 v25_; 1441 const T26 v26_; 1442 const T27 v27_; 1443 const T28 v28_; 1444 const T29 v29_; 1445 const T30 v30_; 1446 const T31 v31_; 1447 const T32 v32_; 1448 const T33 v33_; 1449 }; 1450 1451 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1452 typename T6, typename T7, typename T8, typename T9, typename T10, 1453 typename T11, typename T12, typename T13, typename T14, typename T15, 1454 typename T16, typename T17, typename T18, typename T19, typename T20, 1455 typename T21, typename T22, typename T23, typename T24, typename T25, 1456 typename T26, typename T27, typename T28, typename T29, typename T30, 1457 typename T31, typename T32, typename T33, typename T34> 1458 class ValueArray34 { 1459 public: 1460 ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1461 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1462 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1463 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1464 T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 1465 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 1466 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 1467 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), 1468 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), 1469 v33_(v33), v34_(v34) {} 1470 1471 template <typename T> 1472 operator ParamGenerator<T>() const { 1473 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1474 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1475 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_}; 1476 return ValuesIn(array); 1477 } 1478 1479 private: 1480 // No implementation - assignment is unsupported. 1481 void operator=(const ValueArray34& other); 1482 1483 const T1 v1_; 1484 const T2 v2_; 1485 const T3 v3_; 1486 const T4 v4_; 1487 const T5 v5_; 1488 const T6 v6_; 1489 const T7 v7_; 1490 const T8 v8_; 1491 const T9 v9_; 1492 const T10 v10_; 1493 const T11 v11_; 1494 const T12 v12_; 1495 const T13 v13_; 1496 const T14 v14_; 1497 const T15 v15_; 1498 const T16 v16_; 1499 const T17 v17_; 1500 const T18 v18_; 1501 const T19 v19_; 1502 const T20 v20_; 1503 const T21 v21_; 1504 const T22 v22_; 1505 const T23 v23_; 1506 const T24 v24_; 1507 const T25 v25_; 1508 const T26 v26_; 1509 const T27 v27_; 1510 const T28 v28_; 1511 const T29 v29_; 1512 const T30 v30_; 1513 const T31 v31_; 1514 const T32 v32_; 1515 const T33 v33_; 1516 const T34 v34_; 1517 }; 1518 1519 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1520 typename T6, typename T7, typename T8, typename T9, typename T10, 1521 typename T11, typename T12, typename T13, typename T14, typename T15, 1522 typename T16, typename T17, typename T18, typename T19, typename T20, 1523 typename T21, typename T22, typename T23, typename T24, typename T25, 1524 typename T26, typename T27, typename T28, typename T29, typename T30, 1525 typename T31, typename T32, typename T33, typename T34, typename T35> 1526 class ValueArray35 { 1527 public: 1528 ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1529 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1530 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1531 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1532 T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), 1533 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), 1534 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), 1535 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), 1536 v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), 1537 v32_(v32), v33_(v33), v34_(v34), v35_(v35) {} 1538 1539 template <typename T> 1540 operator ParamGenerator<T>() const { 1541 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1542 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1543 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, 1544 v35_}; 1545 return ValuesIn(array); 1546 } 1547 1548 private: 1549 // No implementation - assignment is unsupported. 1550 void operator=(const ValueArray35& other); 1551 1552 const T1 v1_; 1553 const T2 v2_; 1554 const T3 v3_; 1555 const T4 v4_; 1556 const T5 v5_; 1557 const T6 v6_; 1558 const T7 v7_; 1559 const T8 v8_; 1560 const T9 v9_; 1561 const T10 v10_; 1562 const T11 v11_; 1563 const T12 v12_; 1564 const T13 v13_; 1565 const T14 v14_; 1566 const T15 v15_; 1567 const T16 v16_; 1568 const T17 v17_; 1569 const T18 v18_; 1570 const T19 v19_; 1571 const T20 v20_; 1572 const T21 v21_; 1573 const T22 v22_; 1574 const T23 v23_; 1575 const T24 v24_; 1576 const T25 v25_; 1577 const T26 v26_; 1578 const T27 v27_; 1579 const T28 v28_; 1580 const T29 v29_; 1581 const T30 v30_; 1582 const T31 v31_; 1583 const T32 v32_; 1584 const T33 v33_; 1585 const T34 v34_; 1586 const T35 v35_; 1587 }; 1588 1589 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1590 typename T6, typename T7, typename T8, typename T9, typename T10, 1591 typename T11, typename T12, typename T13, typename T14, typename T15, 1592 typename T16, typename T17, typename T18, typename T19, typename T20, 1593 typename T21, typename T22, typename T23, typename T24, typename T25, 1594 typename T26, typename T27, typename T28, typename T29, typename T30, 1595 typename T31, typename T32, typename T33, typename T34, typename T35, 1596 typename T36> 1597 class ValueArray36 { 1598 public: 1599 ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1600 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1601 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1602 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1603 T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), 1604 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), 1605 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), 1606 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), 1607 v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), 1608 v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {} 1609 1610 template <typename T> 1611 operator ParamGenerator<T>() const { 1612 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1613 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1614 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 1615 v36_}; 1616 return ValuesIn(array); 1617 } 1618 1619 private: 1620 // No implementation - assignment is unsupported. 1621 void operator=(const ValueArray36& other); 1622 1623 const T1 v1_; 1624 const T2 v2_; 1625 const T3 v3_; 1626 const T4 v4_; 1627 const T5 v5_; 1628 const T6 v6_; 1629 const T7 v7_; 1630 const T8 v8_; 1631 const T9 v9_; 1632 const T10 v10_; 1633 const T11 v11_; 1634 const T12 v12_; 1635 const T13 v13_; 1636 const T14 v14_; 1637 const T15 v15_; 1638 const T16 v16_; 1639 const T17 v17_; 1640 const T18 v18_; 1641 const T19 v19_; 1642 const T20 v20_; 1643 const T21 v21_; 1644 const T22 v22_; 1645 const T23 v23_; 1646 const T24 v24_; 1647 const T25 v25_; 1648 const T26 v26_; 1649 const T27 v27_; 1650 const T28 v28_; 1651 const T29 v29_; 1652 const T30 v30_; 1653 const T31 v31_; 1654 const T32 v32_; 1655 const T33 v33_; 1656 const T34 v34_; 1657 const T35 v35_; 1658 const T36 v36_; 1659 }; 1660 1661 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1662 typename T6, typename T7, typename T8, typename T9, typename T10, 1663 typename T11, typename T12, typename T13, typename T14, typename T15, 1664 typename T16, typename T17, typename T18, typename T19, typename T20, 1665 typename T21, typename T22, typename T23, typename T24, typename T25, 1666 typename T26, typename T27, typename T28, typename T29, typename T30, 1667 typename T31, typename T32, typename T33, typename T34, typename T35, 1668 typename T36, typename T37> 1669 class ValueArray37 { 1670 public: 1671 ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1672 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1673 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1674 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1675 T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), 1676 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), 1677 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), 1678 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), 1679 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), 1680 v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), 1681 v36_(v36), v37_(v37) {} 1682 1683 template <typename T> 1684 operator ParamGenerator<T>() const { 1685 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1686 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1687 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 1688 v36_, v37_}; 1689 return ValuesIn(array); 1690 } 1691 1692 private: 1693 // No implementation - assignment is unsupported. 1694 void operator=(const ValueArray37& other); 1695 1696 const T1 v1_; 1697 const T2 v2_; 1698 const T3 v3_; 1699 const T4 v4_; 1700 const T5 v5_; 1701 const T6 v6_; 1702 const T7 v7_; 1703 const T8 v8_; 1704 const T9 v9_; 1705 const T10 v10_; 1706 const T11 v11_; 1707 const T12 v12_; 1708 const T13 v13_; 1709 const T14 v14_; 1710 const T15 v15_; 1711 const T16 v16_; 1712 const T17 v17_; 1713 const T18 v18_; 1714 const T19 v19_; 1715 const T20 v20_; 1716 const T21 v21_; 1717 const T22 v22_; 1718 const T23 v23_; 1719 const T24 v24_; 1720 const T25 v25_; 1721 const T26 v26_; 1722 const T27 v27_; 1723 const T28 v28_; 1724 const T29 v29_; 1725 const T30 v30_; 1726 const T31 v31_; 1727 const T32 v32_; 1728 const T33 v33_; 1729 const T34 v34_; 1730 const T35 v35_; 1731 const T36 v36_; 1732 const T37 v37_; 1733 }; 1734 1735 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1736 typename T6, typename T7, typename T8, typename T9, typename T10, 1737 typename T11, typename T12, typename T13, typename T14, typename T15, 1738 typename T16, typename T17, typename T18, typename T19, typename T20, 1739 typename T21, typename T22, typename T23, typename T24, typename T25, 1740 typename T26, typename T27, typename T28, typename T29, typename T30, 1741 typename T31, typename T32, typename T33, typename T34, typename T35, 1742 typename T36, typename T37, typename T38> 1743 class ValueArray38 { 1744 public: 1745 ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1746 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1747 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1748 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1749 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3), 1750 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 1751 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 1752 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 1753 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), 1754 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), 1755 v35_(v35), v36_(v36), v37_(v37), v38_(v38) {} 1756 1757 template <typename T> 1758 operator ParamGenerator<T>() const { 1759 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1760 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1761 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 1762 v36_, v37_, v38_}; 1763 return ValuesIn(array); 1764 } 1765 1766 private: 1767 // No implementation - assignment is unsupported. 1768 void operator=(const ValueArray38& other); 1769 1770 const T1 v1_; 1771 const T2 v2_; 1772 const T3 v3_; 1773 const T4 v4_; 1774 const T5 v5_; 1775 const T6 v6_; 1776 const T7 v7_; 1777 const T8 v8_; 1778 const T9 v9_; 1779 const T10 v10_; 1780 const T11 v11_; 1781 const T12 v12_; 1782 const T13 v13_; 1783 const T14 v14_; 1784 const T15 v15_; 1785 const T16 v16_; 1786 const T17 v17_; 1787 const T18 v18_; 1788 const T19 v19_; 1789 const T20 v20_; 1790 const T21 v21_; 1791 const T22 v22_; 1792 const T23 v23_; 1793 const T24 v24_; 1794 const T25 v25_; 1795 const T26 v26_; 1796 const T27 v27_; 1797 const T28 v28_; 1798 const T29 v29_; 1799 const T30 v30_; 1800 const T31 v31_; 1801 const T32 v32_; 1802 const T33 v33_; 1803 const T34 v34_; 1804 const T35 v35_; 1805 const T36 v36_; 1806 const T37 v37_; 1807 const T38 v38_; 1808 }; 1809 1810 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1811 typename T6, typename T7, typename T8, typename T9, typename T10, 1812 typename T11, typename T12, typename T13, typename T14, typename T15, 1813 typename T16, typename T17, typename T18, typename T19, typename T20, 1814 typename T21, typename T22, typename T23, typename T24, typename T25, 1815 typename T26, typename T27, typename T28, typename T29, typename T30, 1816 typename T31, typename T32, typename T33, typename T34, typename T35, 1817 typename T36, typename T37, typename T38, typename T39> 1818 class ValueArray39 { 1819 public: 1820 ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1821 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1822 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1823 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1824 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2), 1825 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 1826 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 1827 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 1828 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), 1829 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), 1830 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {} 1831 1832 template <typename T> 1833 operator ParamGenerator<T>() const { 1834 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1835 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1836 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 1837 v36_, v37_, v38_, v39_}; 1838 return ValuesIn(array); 1839 } 1840 1841 private: 1842 // No implementation - assignment is unsupported. 1843 void operator=(const ValueArray39& other); 1844 1845 const T1 v1_; 1846 const T2 v2_; 1847 const T3 v3_; 1848 const T4 v4_; 1849 const T5 v5_; 1850 const T6 v6_; 1851 const T7 v7_; 1852 const T8 v8_; 1853 const T9 v9_; 1854 const T10 v10_; 1855 const T11 v11_; 1856 const T12 v12_; 1857 const T13 v13_; 1858 const T14 v14_; 1859 const T15 v15_; 1860 const T16 v16_; 1861 const T17 v17_; 1862 const T18 v18_; 1863 const T19 v19_; 1864 const T20 v20_; 1865 const T21 v21_; 1866 const T22 v22_; 1867 const T23 v23_; 1868 const T24 v24_; 1869 const T25 v25_; 1870 const T26 v26_; 1871 const T27 v27_; 1872 const T28 v28_; 1873 const T29 v29_; 1874 const T30 v30_; 1875 const T31 v31_; 1876 const T32 v32_; 1877 const T33 v33_; 1878 const T34 v34_; 1879 const T35 v35_; 1880 const T36 v36_; 1881 const T37 v37_; 1882 const T38 v38_; 1883 const T39 v39_; 1884 }; 1885 1886 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1887 typename T6, typename T7, typename T8, typename T9, typename T10, 1888 typename T11, typename T12, typename T13, typename T14, typename T15, 1889 typename T16, typename T17, typename T18, typename T19, typename T20, 1890 typename T21, typename T22, typename T23, typename T24, typename T25, 1891 typename T26, typename T27, typename T28, typename T29, typename T30, 1892 typename T31, typename T32, typename T33, typename T34, typename T35, 1893 typename T36, typename T37, typename T38, typename T39, typename T40> 1894 class ValueArray40 { 1895 public: 1896 ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1897 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1898 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1899 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1900 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1), 1901 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), 1902 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), 1903 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), 1904 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), 1905 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), 1906 v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), 1907 v40_(v40) {} 1908 1909 template <typename T> 1910 operator ParamGenerator<T>() const { 1911 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1912 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1913 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 1914 v36_, v37_, v38_, v39_, v40_}; 1915 return ValuesIn(array); 1916 } 1917 1918 private: 1919 // No implementation - assignment is unsupported. 1920 void operator=(const ValueArray40& other); 1921 1922 const T1 v1_; 1923 const T2 v2_; 1924 const T3 v3_; 1925 const T4 v4_; 1926 const T5 v5_; 1927 const T6 v6_; 1928 const T7 v7_; 1929 const T8 v8_; 1930 const T9 v9_; 1931 const T10 v10_; 1932 const T11 v11_; 1933 const T12 v12_; 1934 const T13 v13_; 1935 const T14 v14_; 1936 const T15 v15_; 1937 const T16 v16_; 1938 const T17 v17_; 1939 const T18 v18_; 1940 const T19 v19_; 1941 const T20 v20_; 1942 const T21 v21_; 1943 const T22 v22_; 1944 const T23 v23_; 1945 const T24 v24_; 1946 const T25 v25_; 1947 const T26 v26_; 1948 const T27 v27_; 1949 const T28 v28_; 1950 const T29 v29_; 1951 const T30 v30_; 1952 const T31 v31_; 1953 const T32 v32_; 1954 const T33 v33_; 1955 const T34 v34_; 1956 const T35 v35_; 1957 const T36 v36_; 1958 const T37 v37_; 1959 const T38 v38_; 1960 const T39 v39_; 1961 const T40 v40_; 1962 }; 1963 1964 template <typename T1, typename T2, typename T3, typename T4, typename T5, 1965 typename T6, typename T7, typename T8, typename T9, typename T10, 1966 typename T11, typename T12, typename T13, typename T14, typename T15, 1967 typename T16, typename T17, typename T18, typename T19, typename T20, 1968 typename T21, typename T22, typename T23, typename T24, typename T25, 1969 typename T26, typename T27, typename T28, typename T29, typename T30, 1970 typename T31, typename T32, typename T33, typename T34, typename T35, 1971 typename T36, typename T37, typename T38, typename T39, typename T40, 1972 typename T41> 1973 class ValueArray41 { 1974 public: 1975 ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 1976 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 1977 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 1978 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 1979 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, 1980 T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 1981 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 1982 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 1983 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), 1984 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), 1985 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), 1986 v39_(v39), v40_(v40), v41_(v41) {} 1987 1988 template <typename T> 1989 operator ParamGenerator<T>() const { 1990 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 1991 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 1992 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 1993 v36_, v37_, v38_, v39_, v40_, v41_}; 1994 return ValuesIn(array); 1995 } 1996 1997 private: 1998 // No implementation - assignment is unsupported. 1999 void operator=(const ValueArray41& other); 2000 2001 const T1 v1_; 2002 const T2 v2_; 2003 const T3 v3_; 2004 const T4 v4_; 2005 const T5 v5_; 2006 const T6 v6_; 2007 const T7 v7_; 2008 const T8 v8_; 2009 const T9 v9_; 2010 const T10 v10_; 2011 const T11 v11_; 2012 const T12 v12_; 2013 const T13 v13_; 2014 const T14 v14_; 2015 const T15 v15_; 2016 const T16 v16_; 2017 const T17 v17_; 2018 const T18 v18_; 2019 const T19 v19_; 2020 const T20 v20_; 2021 const T21 v21_; 2022 const T22 v22_; 2023 const T23 v23_; 2024 const T24 v24_; 2025 const T25 v25_; 2026 const T26 v26_; 2027 const T27 v27_; 2028 const T28 v28_; 2029 const T29 v29_; 2030 const T30 v30_; 2031 const T31 v31_; 2032 const T32 v32_; 2033 const T33 v33_; 2034 const T34 v34_; 2035 const T35 v35_; 2036 const T36 v36_; 2037 const T37 v37_; 2038 const T38 v38_; 2039 const T39 v39_; 2040 const T40 v40_; 2041 const T41 v41_; 2042 }; 2043 2044 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2045 typename T6, typename T7, typename T8, typename T9, typename T10, 2046 typename T11, typename T12, typename T13, typename T14, typename T15, 2047 typename T16, typename T17, typename T18, typename T19, typename T20, 2048 typename T21, typename T22, typename T23, typename T24, typename T25, 2049 typename T26, typename T27, typename T28, typename T29, typename T30, 2050 typename T31, typename T32, typename T33, typename T34, typename T35, 2051 typename T36, typename T37, typename T38, typename T39, typename T40, 2052 typename T41, typename T42> 2053 class ValueArray42 { 2054 public: 2055 ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2056 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2057 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2058 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2059 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2060 T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 2061 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 2062 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 2063 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), 2064 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), 2065 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), 2066 v39_(v39), v40_(v40), v41_(v41), v42_(v42) {} 2067 2068 template <typename T> 2069 operator ParamGenerator<T>() const { 2070 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2071 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2072 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2073 v36_, v37_, v38_, v39_, v40_, v41_, v42_}; 2074 return ValuesIn(array); 2075 } 2076 2077 private: 2078 // No implementation - assignment is unsupported. 2079 void operator=(const ValueArray42& other); 2080 2081 const T1 v1_; 2082 const T2 v2_; 2083 const T3 v3_; 2084 const T4 v4_; 2085 const T5 v5_; 2086 const T6 v6_; 2087 const T7 v7_; 2088 const T8 v8_; 2089 const T9 v9_; 2090 const T10 v10_; 2091 const T11 v11_; 2092 const T12 v12_; 2093 const T13 v13_; 2094 const T14 v14_; 2095 const T15 v15_; 2096 const T16 v16_; 2097 const T17 v17_; 2098 const T18 v18_; 2099 const T19 v19_; 2100 const T20 v20_; 2101 const T21 v21_; 2102 const T22 v22_; 2103 const T23 v23_; 2104 const T24 v24_; 2105 const T25 v25_; 2106 const T26 v26_; 2107 const T27 v27_; 2108 const T28 v28_; 2109 const T29 v29_; 2110 const T30 v30_; 2111 const T31 v31_; 2112 const T32 v32_; 2113 const T33 v33_; 2114 const T34 v34_; 2115 const T35 v35_; 2116 const T36 v36_; 2117 const T37 v37_; 2118 const T38 v38_; 2119 const T39 v39_; 2120 const T40 v40_; 2121 const T41 v41_; 2122 const T42 v42_; 2123 }; 2124 2125 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2126 typename T6, typename T7, typename T8, typename T9, typename T10, 2127 typename T11, typename T12, typename T13, typename T14, typename T15, 2128 typename T16, typename T17, typename T18, typename T19, typename T20, 2129 typename T21, typename T22, typename T23, typename T24, typename T25, 2130 typename T26, typename T27, typename T28, typename T29, typename T30, 2131 typename T31, typename T32, typename T33, typename T34, typename T35, 2132 typename T36, typename T37, typename T38, typename T39, typename T40, 2133 typename T41, typename T42, typename T43> 2134 class ValueArray43 { 2135 public: 2136 ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2137 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2138 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2139 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2140 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2141 T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), 2142 v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), 2143 v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), 2144 v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), 2145 v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), 2146 v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), 2147 v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {} 2148 2149 template <typename T> 2150 operator ParamGenerator<T>() const { 2151 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2152 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2153 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2154 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_}; 2155 return ValuesIn(array); 2156 } 2157 2158 private: 2159 // No implementation - assignment is unsupported. 2160 void operator=(const ValueArray43& other); 2161 2162 const T1 v1_; 2163 const T2 v2_; 2164 const T3 v3_; 2165 const T4 v4_; 2166 const T5 v5_; 2167 const T6 v6_; 2168 const T7 v7_; 2169 const T8 v8_; 2170 const T9 v9_; 2171 const T10 v10_; 2172 const T11 v11_; 2173 const T12 v12_; 2174 const T13 v13_; 2175 const T14 v14_; 2176 const T15 v15_; 2177 const T16 v16_; 2178 const T17 v17_; 2179 const T18 v18_; 2180 const T19 v19_; 2181 const T20 v20_; 2182 const T21 v21_; 2183 const T22 v22_; 2184 const T23 v23_; 2185 const T24 v24_; 2186 const T25 v25_; 2187 const T26 v26_; 2188 const T27 v27_; 2189 const T28 v28_; 2190 const T29 v29_; 2191 const T30 v30_; 2192 const T31 v31_; 2193 const T32 v32_; 2194 const T33 v33_; 2195 const T34 v34_; 2196 const T35 v35_; 2197 const T36 v36_; 2198 const T37 v37_; 2199 const T38 v38_; 2200 const T39 v39_; 2201 const T40 v40_; 2202 const T41 v41_; 2203 const T42 v42_; 2204 const T43 v43_; 2205 }; 2206 2207 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2208 typename T6, typename T7, typename T8, typename T9, typename T10, 2209 typename T11, typename T12, typename T13, typename T14, typename T15, 2210 typename T16, typename T17, typename T18, typename T19, typename T20, 2211 typename T21, typename T22, typename T23, typename T24, typename T25, 2212 typename T26, typename T27, typename T28, typename T29, typename T30, 2213 typename T31, typename T32, typename T33, typename T34, typename T35, 2214 typename T36, typename T37, typename T38, typename T39, typename T40, 2215 typename T41, typename T42, typename T43, typename T44> 2216 class ValueArray44 { 2217 public: 2218 ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2219 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2220 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2221 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2222 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2223 T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), 2224 v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), 2225 v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), 2226 v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), 2227 v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), 2228 v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), 2229 v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), 2230 v43_(v43), v44_(v44) {} 2231 2232 template <typename T> 2233 operator ParamGenerator<T>() const { 2234 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2235 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2236 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2237 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_}; 2238 return ValuesIn(array); 2239 } 2240 2241 private: 2242 // No implementation - assignment is unsupported. 2243 void operator=(const ValueArray44& other); 2244 2245 const T1 v1_; 2246 const T2 v2_; 2247 const T3 v3_; 2248 const T4 v4_; 2249 const T5 v5_; 2250 const T6 v6_; 2251 const T7 v7_; 2252 const T8 v8_; 2253 const T9 v9_; 2254 const T10 v10_; 2255 const T11 v11_; 2256 const T12 v12_; 2257 const T13 v13_; 2258 const T14 v14_; 2259 const T15 v15_; 2260 const T16 v16_; 2261 const T17 v17_; 2262 const T18 v18_; 2263 const T19 v19_; 2264 const T20 v20_; 2265 const T21 v21_; 2266 const T22 v22_; 2267 const T23 v23_; 2268 const T24 v24_; 2269 const T25 v25_; 2270 const T26 v26_; 2271 const T27 v27_; 2272 const T28 v28_; 2273 const T29 v29_; 2274 const T30 v30_; 2275 const T31 v31_; 2276 const T32 v32_; 2277 const T33 v33_; 2278 const T34 v34_; 2279 const T35 v35_; 2280 const T36 v36_; 2281 const T37 v37_; 2282 const T38 v38_; 2283 const T39 v39_; 2284 const T40 v40_; 2285 const T41 v41_; 2286 const T42 v42_; 2287 const T43 v43_; 2288 const T44 v44_; 2289 }; 2290 2291 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2292 typename T6, typename T7, typename T8, typename T9, typename T10, 2293 typename T11, typename T12, typename T13, typename T14, typename T15, 2294 typename T16, typename T17, typename T18, typename T19, typename T20, 2295 typename T21, typename T22, typename T23, typename T24, typename T25, 2296 typename T26, typename T27, typename T28, typename T29, typename T30, 2297 typename T31, typename T32, typename T33, typename T34, typename T35, 2298 typename T36, typename T37, typename T38, typename T39, typename T40, 2299 typename T41, typename T42, typename T43, typename T44, typename T45> 2300 class ValueArray45 { 2301 public: 2302 ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2303 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2304 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2305 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2306 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2307 T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), 2308 v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), 2309 v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), 2310 v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), 2311 v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), 2312 v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), 2313 v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), 2314 v42_(v42), v43_(v43), v44_(v44), v45_(v45) {} 2315 2316 template <typename T> 2317 operator ParamGenerator<T>() const { 2318 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2319 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2320 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2321 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_}; 2322 return ValuesIn(array); 2323 } 2324 2325 private: 2326 // No implementation - assignment is unsupported. 2327 void operator=(const ValueArray45& other); 2328 2329 const T1 v1_; 2330 const T2 v2_; 2331 const T3 v3_; 2332 const T4 v4_; 2333 const T5 v5_; 2334 const T6 v6_; 2335 const T7 v7_; 2336 const T8 v8_; 2337 const T9 v9_; 2338 const T10 v10_; 2339 const T11 v11_; 2340 const T12 v12_; 2341 const T13 v13_; 2342 const T14 v14_; 2343 const T15 v15_; 2344 const T16 v16_; 2345 const T17 v17_; 2346 const T18 v18_; 2347 const T19 v19_; 2348 const T20 v20_; 2349 const T21 v21_; 2350 const T22 v22_; 2351 const T23 v23_; 2352 const T24 v24_; 2353 const T25 v25_; 2354 const T26 v26_; 2355 const T27 v27_; 2356 const T28 v28_; 2357 const T29 v29_; 2358 const T30 v30_; 2359 const T31 v31_; 2360 const T32 v32_; 2361 const T33 v33_; 2362 const T34 v34_; 2363 const T35 v35_; 2364 const T36 v36_; 2365 const T37 v37_; 2366 const T38 v38_; 2367 const T39 v39_; 2368 const T40 v40_; 2369 const T41 v41_; 2370 const T42 v42_; 2371 const T43 v43_; 2372 const T44 v44_; 2373 const T45 v45_; 2374 }; 2375 2376 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2377 typename T6, typename T7, typename T8, typename T9, typename T10, 2378 typename T11, typename T12, typename T13, typename T14, typename T15, 2379 typename T16, typename T17, typename T18, typename T19, typename T20, 2380 typename T21, typename T22, typename T23, typename T24, typename T25, 2381 typename T26, typename T27, typename T28, typename T29, typename T30, 2382 typename T31, typename T32, typename T33, typename T34, typename T35, 2383 typename T36, typename T37, typename T38, typename T39, typename T40, 2384 typename T41, typename T42, typename T43, typename T44, typename T45, 2385 typename T46> 2386 class ValueArray46 { 2387 public: 2388 ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2389 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2390 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2391 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2392 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2393 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3), 2394 v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 2395 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 2396 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 2397 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), 2398 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), 2399 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), 2400 v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {} 2401 2402 template <typename T> 2403 operator ParamGenerator<T>() const { 2404 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2405 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2406 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2407 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_}; 2408 return ValuesIn(array); 2409 } 2410 2411 private: 2412 // No implementation - assignment is unsupported. 2413 void operator=(const ValueArray46& other); 2414 2415 const T1 v1_; 2416 const T2 v2_; 2417 const T3 v3_; 2418 const T4 v4_; 2419 const T5 v5_; 2420 const T6 v6_; 2421 const T7 v7_; 2422 const T8 v8_; 2423 const T9 v9_; 2424 const T10 v10_; 2425 const T11 v11_; 2426 const T12 v12_; 2427 const T13 v13_; 2428 const T14 v14_; 2429 const T15 v15_; 2430 const T16 v16_; 2431 const T17 v17_; 2432 const T18 v18_; 2433 const T19 v19_; 2434 const T20 v20_; 2435 const T21 v21_; 2436 const T22 v22_; 2437 const T23 v23_; 2438 const T24 v24_; 2439 const T25 v25_; 2440 const T26 v26_; 2441 const T27 v27_; 2442 const T28 v28_; 2443 const T29 v29_; 2444 const T30 v30_; 2445 const T31 v31_; 2446 const T32 v32_; 2447 const T33 v33_; 2448 const T34 v34_; 2449 const T35 v35_; 2450 const T36 v36_; 2451 const T37 v37_; 2452 const T38 v38_; 2453 const T39 v39_; 2454 const T40 v40_; 2455 const T41 v41_; 2456 const T42 v42_; 2457 const T43 v43_; 2458 const T44 v44_; 2459 const T45 v45_; 2460 const T46 v46_; 2461 }; 2462 2463 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2464 typename T6, typename T7, typename T8, typename T9, typename T10, 2465 typename T11, typename T12, typename T13, typename T14, typename T15, 2466 typename T16, typename T17, typename T18, typename T19, typename T20, 2467 typename T21, typename T22, typename T23, typename T24, typename T25, 2468 typename T26, typename T27, typename T28, typename T29, typename T30, 2469 typename T31, typename T32, typename T33, typename T34, typename T35, 2470 typename T36, typename T37, typename T38, typename T39, typename T40, 2471 typename T41, typename T42, typename T43, typename T44, typename T45, 2472 typename T46, typename T47> 2473 class ValueArray47 { 2474 public: 2475 ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2476 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2477 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2478 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2479 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2480 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2), 2481 v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), 2482 v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), 2483 v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), 2484 v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), 2485 v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), 2486 v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), 2487 v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), 2488 v47_(v47) {} 2489 2490 template <typename T> 2491 operator ParamGenerator<T>() const { 2492 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2493 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2494 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2495 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, 2496 v47_}; 2497 return ValuesIn(array); 2498 } 2499 2500 private: 2501 // No implementation - assignment is unsupported. 2502 void operator=(const ValueArray47& other); 2503 2504 const T1 v1_; 2505 const T2 v2_; 2506 const T3 v3_; 2507 const T4 v4_; 2508 const T5 v5_; 2509 const T6 v6_; 2510 const T7 v7_; 2511 const T8 v8_; 2512 const T9 v9_; 2513 const T10 v10_; 2514 const T11 v11_; 2515 const T12 v12_; 2516 const T13 v13_; 2517 const T14 v14_; 2518 const T15 v15_; 2519 const T16 v16_; 2520 const T17 v17_; 2521 const T18 v18_; 2522 const T19 v19_; 2523 const T20 v20_; 2524 const T21 v21_; 2525 const T22 v22_; 2526 const T23 v23_; 2527 const T24 v24_; 2528 const T25 v25_; 2529 const T26 v26_; 2530 const T27 v27_; 2531 const T28 v28_; 2532 const T29 v29_; 2533 const T30 v30_; 2534 const T31 v31_; 2535 const T32 v32_; 2536 const T33 v33_; 2537 const T34 v34_; 2538 const T35 v35_; 2539 const T36 v36_; 2540 const T37 v37_; 2541 const T38 v38_; 2542 const T39 v39_; 2543 const T40 v40_; 2544 const T41 v41_; 2545 const T42 v42_; 2546 const T43 v43_; 2547 const T44 v44_; 2548 const T45 v45_; 2549 const T46 v46_; 2550 const T47 v47_; 2551 }; 2552 2553 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2554 typename T6, typename T7, typename T8, typename T9, typename T10, 2555 typename T11, typename T12, typename T13, typename T14, typename T15, 2556 typename T16, typename T17, typename T18, typename T19, typename T20, 2557 typename T21, typename T22, typename T23, typename T24, typename T25, 2558 typename T26, typename T27, typename T28, typename T29, typename T30, 2559 typename T31, typename T32, typename T33, typename T34, typename T35, 2560 typename T36, typename T37, typename T38, typename T39, typename T40, 2561 typename T41, typename T42, typename T43, typename T44, typename T45, 2562 typename T46, typename T47, typename T48> 2563 class ValueArray48 { 2564 public: 2565 ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2566 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2567 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2568 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2569 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2570 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1), 2571 v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), 2572 v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), 2573 v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), 2574 v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), 2575 v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), 2576 v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), 2577 v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), 2578 v46_(v46), v47_(v47), v48_(v48) {} 2579 2580 template <typename T> 2581 operator ParamGenerator<T>() const { 2582 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2583 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2584 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2585 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, 2586 v48_}; 2587 return ValuesIn(array); 2588 } 2589 2590 private: 2591 // No implementation - assignment is unsupported. 2592 void operator=(const ValueArray48& other); 2593 2594 const T1 v1_; 2595 const T2 v2_; 2596 const T3 v3_; 2597 const T4 v4_; 2598 const T5 v5_; 2599 const T6 v6_; 2600 const T7 v7_; 2601 const T8 v8_; 2602 const T9 v9_; 2603 const T10 v10_; 2604 const T11 v11_; 2605 const T12 v12_; 2606 const T13 v13_; 2607 const T14 v14_; 2608 const T15 v15_; 2609 const T16 v16_; 2610 const T17 v17_; 2611 const T18 v18_; 2612 const T19 v19_; 2613 const T20 v20_; 2614 const T21 v21_; 2615 const T22 v22_; 2616 const T23 v23_; 2617 const T24 v24_; 2618 const T25 v25_; 2619 const T26 v26_; 2620 const T27 v27_; 2621 const T28 v28_; 2622 const T29 v29_; 2623 const T30 v30_; 2624 const T31 v31_; 2625 const T32 v32_; 2626 const T33 v33_; 2627 const T34 v34_; 2628 const T35 v35_; 2629 const T36 v36_; 2630 const T37 v37_; 2631 const T38 v38_; 2632 const T39 v39_; 2633 const T40 v40_; 2634 const T41 v41_; 2635 const T42 v42_; 2636 const T43 v43_; 2637 const T44 v44_; 2638 const T45 v45_; 2639 const T46 v46_; 2640 const T47 v47_; 2641 const T48 v48_; 2642 }; 2643 2644 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2645 typename T6, typename T7, typename T8, typename T9, typename T10, 2646 typename T11, typename T12, typename T13, typename T14, typename T15, 2647 typename T16, typename T17, typename T18, typename T19, typename T20, 2648 typename T21, typename T22, typename T23, typename T24, typename T25, 2649 typename T26, typename T27, typename T28, typename T29, typename T30, 2650 typename T31, typename T32, typename T33, typename T34, typename T35, 2651 typename T36, typename T37, typename T38, typename T39, typename T40, 2652 typename T41, typename T42, typename T43, typename T44, typename T45, 2653 typename T46, typename T47, typename T48, typename T49> 2654 class ValueArray49 { 2655 public: 2656 ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2657 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2658 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2659 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2660 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2661 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, 2662 T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 2663 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 2664 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 2665 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), 2666 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), 2667 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), 2668 v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), 2669 v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {} 2670 2671 template <typename T> 2672 operator ParamGenerator<T>() const { 2673 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2674 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2675 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2676 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, 2677 v48_, v49_}; 2678 return ValuesIn(array); 2679 } 2680 2681 private: 2682 // No implementation - assignment is unsupported. 2683 void operator=(const ValueArray49& other); 2684 2685 const T1 v1_; 2686 const T2 v2_; 2687 const T3 v3_; 2688 const T4 v4_; 2689 const T5 v5_; 2690 const T6 v6_; 2691 const T7 v7_; 2692 const T8 v8_; 2693 const T9 v9_; 2694 const T10 v10_; 2695 const T11 v11_; 2696 const T12 v12_; 2697 const T13 v13_; 2698 const T14 v14_; 2699 const T15 v15_; 2700 const T16 v16_; 2701 const T17 v17_; 2702 const T18 v18_; 2703 const T19 v19_; 2704 const T20 v20_; 2705 const T21 v21_; 2706 const T22 v22_; 2707 const T23 v23_; 2708 const T24 v24_; 2709 const T25 v25_; 2710 const T26 v26_; 2711 const T27 v27_; 2712 const T28 v28_; 2713 const T29 v29_; 2714 const T30 v30_; 2715 const T31 v31_; 2716 const T32 v32_; 2717 const T33 v33_; 2718 const T34 v34_; 2719 const T35 v35_; 2720 const T36 v36_; 2721 const T37 v37_; 2722 const T38 v38_; 2723 const T39 v39_; 2724 const T40 v40_; 2725 const T41 v41_; 2726 const T42 v42_; 2727 const T43 v43_; 2728 const T44 v44_; 2729 const T45 v45_; 2730 const T46 v46_; 2731 const T47 v47_; 2732 const T48 v48_; 2733 const T49 v49_; 2734 }; 2735 2736 template <typename T1, typename T2, typename T3, typename T4, typename T5, 2737 typename T6, typename T7, typename T8, typename T9, typename T10, 2738 typename T11, typename T12, typename T13, typename T14, typename T15, 2739 typename T16, typename T17, typename T18, typename T19, typename T20, 2740 typename T21, typename T22, typename T23, typename T24, typename T25, 2741 typename T26, typename T27, typename T28, typename T29, typename T30, 2742 typename T31, typename T32, typename T33, typename T34, typename T35, 2743 typename T36, typename T37, typename T38, typename T39, typename T40, 2744 typename T41, typename T42, typename T43, typename T44, typename T45, 2745 typename T46, typename T47, typename T48, typename T49, typename T50> 2746 class ValueArray50 { 2747 public: 2748 ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, 2749 T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, 2750 T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, 2751 T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, 2752 T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, 2753 T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, 2754 T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), 2755 v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), 2756 v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), 2757 v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), 2758 v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), 2759 v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), 2760 v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), 2761 v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {} 2762 2763 template <typename T> 2764 operator ParamGenerator<T>() const { 2765 const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, 2766 v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, 2767 v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, 2768 v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, 2769 v48_, v49_, v50_}; 2770 return ValuesIn(array); 2771 } 2772 2773 private: 2774 // No implementation - assignment is unsupported. 2775 void operator=(const ValueArray50& other); 2776 2777 const T1 v1_; 2778 const T2 v2_; 2779 const T3 v3_; 2780 const T4 v4_; 2781 const T5 v5_; 2782 const T6 v6_; 2783 const T7 v7_; 2784 const T8 v8_; 2785 const T9 v9_; 2786 const T10 v10_; 2787 const T11 v11_; 2788 const T12 v12_; 2789 const T13 v13_; 2790 const T14 v14_; 2791 const T15 v15_; 2792 const T16 v16_; 2793 const T17 v17_; 2794 const T18 v18_; 2795 const T19 v19_; 2796 const T20 v20_; 2797 const T21 v21_; 2798 const T22 v22_; 2799 const T23 v23_; 2800 const T24 v24_; 2801 const T25 v25_; 2802 const T26 v26_; 2803 const T27 v27_; 2804 const T28 v28_; 2805 const T29 v29_; 2806 const T30 v30_; 2807 const T31 v31_; 2808 const T32 v32_; 2809 const T33 v33_; 2810 const T34 v34_; 2811 const T35 v35_; 2812 const T36 v36_; 2813 const T37 v37_; 2814 const T38 v38_; 2815 const T39 v39_; 2816 const T40 v40_; 2817 const T41 v41_; 2818 const T42 v42_; 2819 const T43 v43_; 2820 const T44 v44_; 2821 const T45 v45_; 2822 const T46 v46_; 2823 const T47 v47_; 2824 const T48 v48_; 2825 const T49 v49_; 2826 const T50 v50_; 2827 }; 2828 2829 # if GTEST_HAS_COMBINE 2830 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. 2831 // 2832 // Generates values from the Cartesian product of values produced 2833 // by the argument generators. 2834 // 2835 template <typename T1, typename T2> 2836 class CartesianProductGenerator2 2837 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > { 2838 public: 2839 typedef ::std::tr1::tuple<T1, T2> ParamType; 2840 2841 CartesianProductGenerator2(const ParamGenerator<T1>& g1, 2842 const ParamGenerator<T2>& g2) 2843 : g1_(g1), g2_(g2) {} 2844 virtual ~CartesianProductGenerator2() {} 2845 2846 virtual ParamIteratorInterface<ParamType>* Begin() const { 2847 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin()); 2848 } 2849 virtual ParamIteratorInterface<ParamType>* End() const { 2850 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end()); 2851 } 2852 2853 private: 2854 class Iterator : public ParamIteratorInterface<ParamType> { 2855 public: 2856 Iterator(const ParamGeneratorInterface<ParamType>* base, 2857 const ParamGenerator<T1>& g1, 2858 const typename ParamGenerator<T1>::iterator& current1, 2859 const ParamGenerator<T2>& g2, 2860 const typename ParamGenerator<T2>::iterator& current2) 2861 : base_(base), 2862 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 2863 begin2_(g2.begin()), end2_(g2.end()), current2_(current2) { 2864 ComputeCurrentValue(); 2865 } 2866 virtual ~Iterator() {} 2867 2868 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 2869 return base_; 2870 } 2871 // Advance should not be called on beyond-of-range iterators 2872 // so no component iterators must be beyond end of range, either. 2873 virtual void Advance() { 2874 assert(!AtEnd()); 2875 ++current2_; 2876 if (current2_ == end2_) { 2877 current2_ = begin2_; 2878 ++current1_; 2879 } 2880 ComputeCurrentValue(); 2881 } 2882 virtual ParamIteratorInterface<ParamType>* Clone() const { 2883 return new Iterator(*this); 2884 } 2885 virtual const ParamType* Current() const { return ¤t_value_; } 2886 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 2887 // Having the same base generator guarantees that the other 2888 // iterator is of the same type and we can downcast. 2889 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 2890 << "The program attempted to compare iterators " 2891 << "from different generators." << std::endl; 2892 const Iterator* typed_other = 2893 CheckedDowncastToActualType<const Iterator>(&other); 2894 // We must report iterators equal if they both point beyond their 2895 // respective ranges. That can happen in a variety of fashions, 2896 // so we have to consult AtEnd(). 2897 return (AtEnd() && typed_other->AtEnd()) || 2898 ( 2899 current1_ == typed_other->current1_ && 2900 current2_ == typed_other->current2_); 2901 } 2902 2903 private: 2904 Iterator(const Iterator& other) 2905 : base_(other.base_), 2906 begin1_(other.begin1_), 2907 end1_(other.end1_), 2908 current1_(other.current1_), 2909 begin2_(other.begin2_), 2910 end2_(other.end2_), 2911 current2_(other.current2_) { 2912 ComputeCurrentValue(); 2913 } 2914 2915 void ComputeCurrentValue() { 2916 if (!AtEnd()) 2917 current_value_ = ParamType(*current1_, *current2_); 2918 } 2919 bool AtEnd() const { 2920 // We must report iterator past the end of the range when either of the 2921 // component iterators has reached the end of its range. 2922 return 2923 current1_ == end1_ || 2924 current2_ == end2_; 2925 } 2926 2927 // No implementation - assignment is unsupported. 2928 void operator=(const Iterator& other); 2929 2930 const ParamGeneratorInterface<ParamType>* const base_; 2931 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 2932 // current[i]_ is the actual traversing iterator. 2933 const typename ParamGenerator<T1>::iterator begin1_; 2934 const typename ParamGenerator<T1>::iterator end1_; 2935 typename ParamGenerator<T1>::iterator current1_; 2936 const typename ParamGenerator<T2>::iterator begin2_; 2937 const typename ParamGenerator<T2>::iterator end2_; 2938 typename ParamGenerator<T2>::iterator current2_; 2939 ParamType current_value_; 2940 }; // class CartesianProductGenerator2::Iterator 2941 2942 // No implementation - assignment is unsupported. 2943 void operator=(const CartesianProductGenerator2& other); 2944 2945 const ParamGenerator<T1> g1_; 2946 const ParamGenerator<T2> g2_; 2947 }; // class CartesianProductGenerator2 2948 2949 2950 template <typename T1, typename T2, typename T3> 2951 class CartesianProductGenerator3 2952 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > { 2953 public: 2954 typedef ::std::tr1::tuple<T1, T2, T3> ParamType; 2955 2956 CartesianProductGenerator3(const ParamGenerator<T1>& g1, 2957 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3) 2958 : g1_(g1), g2_(g2), g3_(g3) {} 2959 virtual ~CartesianProductGenerator3() {} 2960 2961 virtual ParamIteratorInterface<ParamType>* Begin() const { 2962 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 2963 g3_.begin()); 2964 } 2965 virtual ParamIteratorInterface<ParamType>* End() const { 2966 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end()); 2967 } 2968 2969 private: 2970 class Iterator : public ParamIteratorInterface<ParamType> { 2971 public: 2972 Iterator(const ParamGeneratorInterface<ParamType>* base, 2973 const ParamGenerator<T1>& g1, 2974 const typename ParamGenerator<T1>::iterator& current1, 2975 const ParamGenerator<T2>& g2, 2976 const typename ParamGenerator<T2>::iterator& current2, 2977 const ParamGenerator<T3>& g3, 2978 const typename ParamGenerator<T3>::iterator& current3) 2979 : base_(base), 2980 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 2981 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 2982 begin3_(g3.begin()), end3_(g3.end()), current3_(current3) { 2983 ComputeCurrentValue(); 2984 } 2985 virtual ~Iterator() {} 2986 2987 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 2988 return base_; 2989 } 2990 // Advance should not be called on beyond-of-range iterators 2991 // so no component iterators must be beyond end of range, either. 2992 virtual void Advance() { 2993 assert(!AtEnd()); 2994 ++current3_; 2995 if (current3_ == end3_) { 2996 current3_ = begin3_; 2997 ++current2_; 2998 } 2999 if (current2_ == end2_) { 3000 current2_ = begin2_; 3001 ++current1_; 3002 } 3003 ComputeCurrentValue(); 3004 } 3005 virtual ParamIteratorInterface<ParamType>* Clone() const { 3006 return new Iterator(*this); 3007 } 3008 virtual const ParamType* Current() const { return ¤t_value_; } 3009 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 3010 // Having the same base generator guarantees that the other 3011 // iterator is of the same type and we can downcast. 3012 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 3013 << "The program attempted to compare iterators " 3014 << "from different generators." << std::endl; 3015 const Iterator* typed_other = 3016 CheckedDowncastToActualType<const Iterator>(&other); 3017 // We must report iterators equal if they both point beyond their 3018 // respective ranges. That can happen in a variety of fashions, 3019 // so we have to consult AtEnd(). 3020 return (AtEnd() && typed_other->AtEnd()) || 3021 ( 3022 current1_ == typed_other->current1_ && 3023 current2_ == typed_other->current2_ && 3024 current3_ == typed_other->current3_); 3025 } 3026 3027 private: 3028 Iterator(const Iterator& other) 3029 : base_(other.base_), 3030 begin1_(other.begin1_), 3031 end1_(other.end1_), 3032 current1_(other.current1_), 3033 begin2_(other.begin2_), 3034 end2_(other.end2_), 3035 current2_(other.current2_), 3036 begin3_(other.begin3_), 3037 end3_(other.end3_), 3038 current3_(other.current3_) { 3039 ComputeCurrentValue(); 3040 } 3041 3042 void ComputeCurrentValue() { 3043 if (!AtEnd()) 3044 current_value_ = ParamType(*current1_, *current2_, *current3_); 3045 } 3046 bool AtEnd() const { 3047 // We must report iterator past the end of the range when either of the 3048 // component iterators has reached the end of its range. 3049 return 3050 current1_ == end1_ || 3051 current2_ == end2_ || 3052 current3_ == end3_; 3053 } 3054 3055 // No implementation - assignment is unsupported. 3056 void operator=(const Iterator& other); 3057 3058 const ParamGeneratorInterface<ParamType>* const base_; 3059 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 3060 // current[i]_ is the actual traversing iterator. 3061 const typename ParamGenerator<T1>::iterator begin1_; 3062 const typename ParamGenerator<T1>::iterator end1_; 3063 typename ParamGenerator<T1>::iterator current1_; 3064 const typename ParamGenerator<T2>::iterator begin2_; 3065 const typename ParamGenerator<T2>::iterator end2_; 3066 typename ParamGenerator<T2>::iterator current2_; 3067 const typename ParamGenerator<T3>::iterator begin3_; 3068 const typename ParamGenerator<T3>::iterator end3_; 3069 typename ParamGenerator<T3>::iterator current3_; 3070 ParamType current_value_; 3071 }; // class CartesianProductGenerator3::Iterator 3072 3073 // No implementation - assignment is unsupported. 3074 void operator=(const CartesianProductGenerator3& other); 3075 3076 const ParamGenerator<T1> g1_; 3077 const ParamGenerator<T2> g2_; 3078 const ParamGenerator<T3> g3_; 3079 }; // class CartesianProductGenerator3 3080 3081 3082 template <typename T1, typename T2, typename T3, typename T4> 3083 class CartesianProductGenerator4 3084 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > { 3085 public: 3086 typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType; 3087 3088 CartesianProductGenerator4(const ParamGenerator<T1>& g1, 3089 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 3090 const ParamGenerator<T4>& g4) 3091 : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} 3092 virtual ~CartesianProductGenerator4() {} 3093 3094 virtual ParamIteratorInterface<ParamType>* Begin() const { 3095 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 3096 g3_.begin(), g4_, g4_.begin()); 3097 } 3098 virtual ParamIteratorInterface<ParamType>* End() const { 3099 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 3100 g4_, g4_.end()); 3101 } 3102 3103 private: 3104 class Iterator : public ParamIteratorInterface<ParamType> { 3105 public: 3106 Iterator(const ParamGeneratorInterface<ParamType>* base, 3107 const ParamGenerator<T1>& g1, 3108 const typename ParamGenerator<T1>::iterator& current1, 3109 const ParamGenerator<T2>& g2, 3110 const typename ParamGenerator<T2>::iterator& current2, 3111 const ParamGenerator<T3>& g3, 3112 const typename ParamGenerator<T3>::iterator& current3, 3113 const ParamGenerator<T4>& g4, 3114 const typename ParamGenerator<T4>::iterator& current4) 3115 : base_(base), 3116 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 3117 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 3118 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 3119 begin4_(g4.begin()), end4_(g4.end()), current4_(current4) { 3120 ComputeCurrentValue(); 3121 } 3122 virtual ~Iterator() {} 3123 3124 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 3125 return base_; 3126 } 3127 // Advance should not be called on beyond-of-range iterators 3128 // so no component iterators must be beyond end of range, either. 3129 virtual void Advance() { 3130 assert(!AtEnd()); 3131 ++current4_; 3132 if (current4_ == end4_) { 3133 current4_ = begin4_; 3134 ++current3_; 3135 } 3136 if (current3_ == end3_) { 3137 current3_ = begin3_; 3138 ++current2_; 3139 } 3140 if (current2_ == end2_) { 3141 current2_ = begin2_; 3142 ++current1_; 3143 } 3144 ComputeCurrentValue(); 3145 } 3146 virtual ParamIteratorInterface<ParamType>* Clone() const { 3147 return new Iterator(*this); 3148 } 3149 virtual const ParamType* Current() const { return ¤t_value_; } 3150 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 3151 // Having the same base generator guarantees that the other 3152 // iterator is of the same type and we can downcast. 3153 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 3154 << "The program attempted to compare iterators " 3155 << "from different generators." << std::endl; 3156 const Iterator* typed_other = 3157 CheckedDowncastToActualType<const Iterator>(&other); 3158 // We must report iterators equal if they both point beyond their 3159 // respective ranges. That can happen in a variety of fashions, 3160 // so we have to consult AtEnd(). 3161 return (AtEnd() && typed_other->AtEnd()) || 3162 ( 3163 current1_ == typed_other->current1_ && 3164 current2_ == typed_other->current2_ && 3165 current3_ == typed_other->current3_ && 3166 current4_ == typed_other->current4_); 3167 } 3168 3169 private: 3170 Iterator(const Iterator& other) 3171 : base_(other.base_), 3172 begin1_(other.begin1_), 3173 end1_(other.end1_), 3174 current1_(other.current1_), 3175 begin2_(other.begin2_), 3176 end2_(other.end2_), 3177 current2_(other.current2_), 3178 begin3_(other.begin3_), 3179 end3_(other.end3_), 3180 current3_(other.current3_), 3181 begin4_(other.begin4_), 3182 end4_(other.end4_), 3183 current4_(other.current4_) { 3184 ComputeCurrentValue(); 3185 } 3186 3187 void ComputeCurrentValue() { 3188 if (!AtEnd()) 3189 current_value_ = ParamType(*current1_, *current2_, *current3_, 3190 *current4_); 3191 } 3192 bool AtEnd() const { 3193 // We must report iterator past the end of the range when either of the 3194 // component iterators has reached the end of its range. 3195 return 3196 current1_ == end1_ || 3197 current2_ == end2_ || 3198 current3_ == end3_ || 3199 current4_ == end4_; 3200 } 3201 3202 // No implementation - assignment is unsupported. 3203 void operator=(const Iterator& other); 3204 3205 const ParamGeneratorInterface<ParamType>* const base_; 3206 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 3207 // current[i]_ is the actual traversing iterator. 3208 const typename ParamGenerator<T1>::iterator begin1_; 3209 const typename ParamGenerator<T1>::iterator end1_; 3210 typename ParamGenerator<T1>::iterator current1_; 3211 const typename ParamGenerator<T2>::iterator begin2_; 3212 const typename ParamGenerator<T2>::iterator end2_; 3213 typename ParamGenerator<T2>::iterator current2_; 3214 const typename ParamGenerator<T3>::iterator begin3_; 3215 const typename ParamGenerator<T3>::iterator end3_; 3216 typename ParamGenerator<T3>::iterator current3_; 3217 const typename ParamGenerator<T4>::iterator begin4_; 3218 const typename ParamGenerator<T4>::iterator end4_; 3219 typename ParamGenerator<T4>::iterator current4_; 3220 ParamType current_value_; 3221 }; // class CartesianProductGenerator4::Iterator 3222 3223 // No implementation - assignment is unsupported. 3224 void operator=(const CartesianProductGenerator4& other); 3225 3226 const ParamGenerator<T1> g1_; 3227 const ParamGenerator<T2> g2_; 3228 const ParamGenerator<T3> g3_; 3229 const ParamGenerator<T4> g4_; 3230 }; // class CartesianProductGenerator4 3231 3232 3233 template <typename T1, typename T2, typename T3, typename T4, typename T5> 3234 class CartesianProductGenerator5 3235 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > { 3236 public: 3237 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType; 3238 3239 CartesianProductGenerator5(const ParamGenerator<T1>& g1, 3240 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 3241 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5) 3242 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} 3243 virtual ~CartesianProductGenerator5() {} 3244 3245 virtual ParamIteratorInterface<ParamType>* Begin() const { 3246 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 3247 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin()); 3248 } 3249 virtual ParamIteratorInterface<ParamType>* End() const { 3250 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 3251 g4_, g4_.end(), g5_, g5_.end()); 3252 } 3253 3254 private: 3255 class Iterator : public ParamIteratorInterface<ParamType> { 3256 public: 3257 Iterator(const ParamGeneratorInterface<ParamType>* base, 3258 const ParamGenerator<T1>& g1, 3259 const typename ParamGenerator<T1>::iterator& current1, 3260 const ParamGenerator<T2>& g2, 3261 const typename ParamGenerator<T2>::iterator& current2, 3262 const ParamGenerator<T3>& g3, 3263 const typename ParamGenerator<T3>::iterator& current3, 3264 const ParamGenerator<T4>& g4, 3265 const typename ParamGenerator<T4>::iterator& current4, 3266 const ParamGenerator<T5>& g5, 3267 const typename ParamGenerator<T5>::iterator& current5) 3268 : base_(base), 3269 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 3270 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 3271 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 3272 begin4_(g4.begin()), end4_(g4.end()), current4_(current4), 3273 begin5_(g5.begin()), end5_(g5.end()), current5_(current5) { 3274 ComputeCurrentValue(); 3275 } 3276 virtual ~Iterator() {} 3277 3278 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 3279 return base_; 3280 } 3281 // Advance should not be called on beyond-of-range iterators 3282 // so no component iterators must be beyond end of range, either. 3283 virtual void Advance() { 3284 assert(!AtEnd()); 3285 ++current5_; 3286 if (current5_ == end5_) { 3287 current5_ = begin5_; 3288 ++current4_; 3289 } 3290 if (current4_ == end4_) { 3291 current4_ = begin4_; 3292 ++current3_; 3293 } 3294 if (current3_ == end3_) { 3295 current3_ = begin3_; 3296 ++current2_; 3297 } 3298 if (current2_ == end2_) { 3299 current2_ = begin2_; 3300 ++current1_; 3301 } 3302 ComputeCurrentValue(); 3303 } 3304 virtual ParamIteratorInterface<ParamType>* Clone() const { 3305 return new Iterator(*this); 3306 } 3307 virtual const ParamType* Current() const { return ¤t_value_; } 3308 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 3309 // Having the same base generator guarantees that the other 3310 // iterator is of the same type and we can downcast. 3311 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 3312 << "The program attempted to compare iterators " 3313 << "from different generators." << std::endl; 3314 const Iterator* typed_other = 3315 CheckedDowncastToActualType<const Iterator>(&other); 3316 // We must report iterators equal if they both point beyond their 3317 // respective ranges. That can happen in a variety of fashions, 3318 // so we have to consult AtEnd(). 3319 return (AtEnd() && typed_other->AtEnd()) || 3320 ( 3321 current1_ == typed_other->current1_ && 3322 current2_ == typed_other->current2_ && 3323 current3_ == typed_other->current3_ && 3324 current4_ == typed_other->current4_ && 3325 current5_ == typed_other->current5_); 3326 } 3327 3328 private: 3329 Iterator(const Iterator& other) 3330 : base_(other.base_), 3331 begin1_(other.begin1_), 3332 end1_(other.end1_), 3333 current1_(other.current1_), 3334 begin2_(other.begin2_), 3335 end2_(other.end2_), 3336 current2_(other.current2_), 3337 begin3_(other.begin3_), 3338 end3_(other.end3_), 3339 current3_(other.current3_), 3340 begin4_(other.begin4_), 3341 end4_(other.end4_), 3342 current4_(other.current4_), 3343 begin5_(other.begin5_), 3344 end5_(other.end5_), 3345 current5_(other.current5_) { 3346 ComputeCurrentValue(); 3347 } 3348 3349 void ComputeCurrentValue() { 3350 if (!AtEnd()) 3351 current_value_ = ParamType(*current1_, *current2_, *current3_, 3352 *current4_, *current5_); 3353 } 3354 bool AtEnd() const { 3355 // We must report iterator past the end of the range when either of the 3356 // component iterators has reached the end of its range. 3357 return 3358 current1_ == end1_ || 3359 current2_ == end2_ || 3360 current3_ == end3_ || 3361 current4_ == end4_ || 3362 current5_ == end5_; 3363 } 3364 3365 // No implementation - assignment is unsupported. 3366 void operator=(const Iterator& other); 3367 3368 const ParamGeneratorInterface<ParamType>* const base_; 3369 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 3370 // current[i]_ is the actual traversing iterator. 3371 const typename ParamGenerator<T1>::iterator begin1_; 3372 const typename ParamGenerator<T1>::iterator end1_; 3373 typename ParamGenerator<T1>::iterator current1_; 3374 const typename ParamGenerator<T2>::iterator begin2_; 3375 const typename ParamGenerator<T2>::iterator end2_; 3376 typename ParamGenerator<T2>::iterator current2_; 3377 const typename ParamGenerator<T3>::iterator begin3_; 3378 const typename ParamGenerator<T3>::iterator end3_; 3379 typename ParamGenerator<T3>::iterator current3_; 3380 const typename ParamGenerator<T4>::iterator begin4_; 3381 const typename ParamGenerator<T4>::iterator end4_; 3382 typename ParamGenerator<T4>::iterator current4_; 3383 const typename ParamGenerator<T5>::iterator begin5_; 3384 const typename ParamGenerator<T5>::iterator end5_; 3385 typename ParamGenerator<T5>::iterator current5_; 3386 ParamType current_value_; 3387 }; // class CartesianProductGenerator5::Iterator 3388 3389 // No implementation - assignment is unsupported. 3390 void operator=(const CartesianProductGenerator5& other); 3391 3392 const ParamGenerator<T1> g1_; 3393 const ParamGenerator<T2> g2_; 3394 const ParamGenerator<T3> g3_; 3395 const ParamGenerator<T4> g4_; 3396 const ParamGenerator<T5> g5_; 3397 }; // class CartesianProductGenerator5 3398 3399 3400 template <typename T1, typename T2, typename T3, typename T4, typename T5, 3401 typename T6> 3402 class CartesianProductGenerator6 3403 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, 3404 T6> > { 3405 public: 3406 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType; 3407 3408 CartesianProductGenerator6(const ParamGenerator<T1>& g1, 3409 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 3410 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, 3411 const ParamGenerator<T6>& g6) 3412 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} 3413 virtual ~CartesianProductGenerator6() {} 3414 3415 virtual ParamIteratorInterface<ParamType>* Begin() const { 3416 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 3417 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin()); 3418 } 3419 virtual ParamIteratorInterface<ParamType>* End() const { 3420 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 3421 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end()); 3422 } 3423 3424 private: 3425 class Iterator : public ParamIteratorInterface<ParamType> { 3426 public: 3427 Iterator(const ParamGeneratorInterface<ParamType>* base, 3428 const ParamGenerator<T1>& g1, 3429 const typename ParamGenerator<T1>::iterator& current1, 3430 const ParamGenerator<T2>& g2, 3431 const typename ParamGenerator<T2>::iterator& current2, 3432 const ParamGenerator<T3>& g3, 3433 const typename ParamGenerator<T3>::iterator& current3, 3434 const ParamGenerator<T4>& g4, 3435 const typename ParamGenerator<T4>::iterator& current4, 3436 const ParamGenerator<T5>& g5, 3437 const typename ParamGenerator<T5>::iterator& current5, 3438 const ParamGenerator<T6>& g6, 3439 const typename ParamGenerator<T6>::iterator& current6) 3440 : base_(base), 3441 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 3442 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 3443 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 3444 begin4_(g4.begin()), end4_(g4.end()), current4_(current4), 3445 begin5_(g5.begin()), end5_(g5.end()), current5_(current5), 3446 begin6_(g6.begin()), end6_(g6.end()), current6_(current6) { 3447 ComputeCurrentValue(); 3448 } 3449 virtual ~Iterator() {} 3450 3451 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 3452 return base_; 3453 } 3454 // Advance should not be called on beyond-of-range iterators 3455 // so no component iterators must be beyond end of range, either. 3456 virtual void Advance() { 3457 assert(!AtEnd()); 3458 ++current6_; 3459 if (current6_ == end6_) { 3460 current6_ = begin6_; 3461 ++current5_; 3462 } 3463 if (current5_ == end5_) { 3464 current5_ = begin5_; 3465 ++current4_; 3466 } 3467 if (current4_ == end4_) { 3468 current4_ = begin4_; 3469 ++current3_; 3470 } 3471 if (current3_ == end3_) { 3472 current3_ = begin3_; 3473 ++current2_; 3474 } 3475 if (current2_ == end2_) { 3476 current2_ = begin2_; 3477 ++current1_; 3478 } 3479 ComputeCurrentValue(); 3480 } 3481 virtual ParamIteratorInterface<ParamType>* Clone() const { 3482 return new Iterator(*this); 3483 } 3484 virtual const ParamType* Current() const { return ¤t_value_; } 3485 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 3486 // Having the same base generator guarantees that the other 3487 // iterator is of the same type and we can downcast. 3488 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 3489 << "The program attempted to compare iterators " 3490 << "from different generators." << std::endl; 3491 const Iterator* typed_other = 3492 CheckedDowncastToActualType<const Iterator>(&other); 3493 // We must report iterators equal if they both point beyond their 3494 // respective ranges. That can happen in a variety of fashions, 3495 // so we have to consult AtEnd(). 3496 return (AtEnd() && typed_other->AtEnd()) || 3497 ( 3498 current1_ == typed_other->current1_ && 3499 current2_ == typed_other->current2_ && 3500 current3_ == typed_other->current3_ && 3501 current4_ == typed_other->current4_ && 3502 current5_ == typed_other->current5_ && 3503 current6_ == typed_other->current6_); 3504 } 3505 3506 private: 3507 Iterator(const Iterator& other) 3508 : base_(other.base_), 3509 begin1_(other.begin1_), 3510 end1_(other.end1_), 3511 current1_(other.current1_), 3512 begin2_(other.begin2_), 3513 end2_(other.end2_), 3514 current2_(other.current2_), 3515 begin3_(other.begin3_), 3516 end3_(other.end3_), 3517 current3_(other.current3_), 3518 begin4_(other.begin4_), 3519 end4_(other.end4_), 3520 current4_(other.current4_), 3521 begin5_(other.begin5_), 3522 end5_(other.end5_), 3523 current5_(other.current5_), 3524 begin6_(other.begin6_), 3525 end6_(other.end6_), 3526 current6_(other.current6_) { 3527 ComputeCurrentValue(); 3528 } 3529 3530 void ComputeCurrentValue() { 3531 if (!AtEnd()) 3532 current_value_ = ParamType(*current1_, *current2_, *current3_, 3533 *current4_, *current5_, *current6_); 3534 } 3535 bool AtEnd() const { 3536 // We must report iterator past the end of the range when either of the 3537 // component iterators has reached the end of its range. 3538 return 3539 current1_ == end1_ || 3540 current2_ == end2_ || 3541 current3_ == end3_ || 3542 current4_ == end4_ || 3543 current5_ == end5_ || 3544 current6_ == end6_; 3545 } 3546 3547 // No implementation - assignment is unsupported. 3548 void operator=(const Iterator& other); 3549 3550 const ParamGeneratorInterface<ParamType>* const base_; 3551 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 3552 // current[i]_ is the actual traversing iterator. 3553 const typename ParamGenerator<T1>::iterator begin1_; 3554 const typename ParamGenerator<T1>::iterator end1_; 3555 typename ParamGenerator<T1>::iterator current1_; 3556 const typename ParamGenerator<T2>::iterator begin2_; 3557 const typename ParamGenerator<T2>::iterator end2_; 3558 typename ParamGenerator<T2>::iterator current2_; 3559 const typename ParamGenerator<T3>::iterator begin3_; 3560 const typename ParamGenerator<T3>::iterator end3_; 3561 typename ParamGenerator<T3>::iterator current3_; 3562 const typename ParamGenerator<T4>::iterator begin4_; 3563 const typename ParamGenerator<T4>::iterator end4_; 3564 typename ParamGenerator<T4>::iterator current4_; 3565 const typename ParamGenerator<T5>::iterator begin5_; 3566 const typename ParamGenerator<T5>::iterator end5_; 3567 typename ParamGenerator<T5>::iterator current5_; 3568 const typename ParamGenerator<T6>::iterator begin6_; 3569 const typename ParamGenerator<T6>::iterator end6_; 3570 typename ParamGenerator<T6>::iterator current6_; 3571 ParamType current_value_; 3572 }; // class CartesianProductGenerator6::Iterator 3573 3574 // No implementation - assignment is unsupported. 3575 void operator=(const CartesianProductGenerator6& other); 3576 3577 const ParamGenerator<T1> g1_; 3578 const ParamGenerator<T2> g2_; 3579 const ParamGenerator<T3> g3_; 3580 const ParamGenerator<T4> g4_; 3581 const ParamGenerator<T5> g5_; 3582 const ParamGenerator<T6> g6_; 3583 }; // class CartesianProductGenerator6 3584 3585 3586 template <typename T1, typename T2, typename T3, typename T4, typename T5, 3587 typename T6, typename T7> 3588 class CartesianProductGenerator7 3589 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, 3590 T7> > { 3591 public: 3592 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType; 3593 3594 CartesianProductGenerator7(const ParamGenerator<T1>& g1, 3595 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 3596 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, 3597 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7) 3598 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} 3599 virtual ~CartesianProductGenerator7() {} 3600 3601 virtual ParamIteratorInterface<ParamType>* Begin() const { 3602 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 3603 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, 3604 g7_.begin()); 3605 } 3606 virtual ParamIteratorInterface<ParamType>* End() const { 3607 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 3608 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end()); 3609 } 3610 3611 private: 3612 class Iterator : public ParamIteratorInterface<ParamType> { 3613 public: 3614 Iterator(const ParamGeneratorInterface<ParamType>* base, 3615 const ParamGenerator<T1>& g1, 3616 const typename ParamGenerator<T1>::iterator& current1, 3617 const ParamGenerator<T2>& g2, 3618 const typename ParamGenerator<T2>::iterator& current2, 3619 const ParamGenerator<T3>& g3, 3620 const typename ParamGenerator<T3>::iterator& current3, 3621 const ParamGenerator<T4>& g4, 3622 const typename ParamGenerator<T4>::iterator& current4, 3623 const ParamGenerator<T5>& g5, 3624 const typename ParamGenerator<T5>::iterator& current5, 3625 const ParamGenerator<T6>& g6, 3626 const typename ParamGenerator<T6>::iterator& current6, 3627 const ParamGenerator<T7>& g7, 3628 const typename ParamGenerator<T7>::iterator& current7) 3629 : base_(base), 3630 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 3631 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 3632 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 3633 begin4_(g4.begin()), end4_(g4.end()), current4_(current4), 3634 begin5_(g5.begin()), end5_(g5.end()), current5_(current5), 3635 begin6_(g6.begin()), end6_(g6.end()), current6_(current6), 3636 begin7_(g7.begin()), end7_(g7.end()), current7_(current7) { 3637 ComputeCurrentValue(); 3638 } 3639 virtual ~Iterator() {} 3640 3641 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 3642 return base_; 3643 } 3644 // Advance should not be called on beyond-of-range iterators 3645 // so no component iterators must be beyond end of range, either. 3646 virtual void Advance() { 3647 assert(!AtEnd()); 3648 ++current7_; 3649 if (current7_ == end7_) { 3650 current7_ = begin7_; 3651 ++current6_; 3652 } 3653 if (current6_ == end6_) { 3654 current6_ = begin6_; 3655 ++current5_; 3656 } 3657 if (current5_ == end5_) { 3658 current5_ = begin5_; 3659 ++current4_; 3660 } 3661 if (current4_ == end4_) { 3662 current4_ = begin4_; 3663 ++current3_; 3664 } 3665 if (current3_ == end3_) { 3666 current3_ = begin3_; 3667 ++current2_; 3668 } 3669 if (current2_ == end2_) { 3670 current2_ = begin2_; 3671 ++current1_; 3672 } 3673 ComputeCurrentValue(); 3674 } 3675 virtual ParamIteratorInterface<ParamType>* Clone() const { 3676 return new Iterator(*this); 3677 } 3678 virtual const ParamType* Current() const { return ¤t_value_; } 3679 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 3680 // Having the same base generator guarantees that the other 3681 // iterator is of the same type and we can downcast. 3682 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 3683 << "The program attempted to compare iterators " 3684 << "from different generators." << std::endl; 3685 const Iterator* typed_other = 3686 CheckedDowncastToActualType<const Iterator>(&other); 3687 // We must report iterators equal if they both point beyond their 3688 // respective ranges. That can happen in a variety of fashions, 3689 // so we have to consult AtEnd(). 3690 return (AtEnd() && typed_other->AtEnd()) || 3691 ( 3692 current1_ == typed_other->current1_ && 3693 current2_ == typed_other->current2_ && 3694 current3_ == typed_other->current3_ && 3695 current4_ == typed_other->current4_ && 3696 current5_ == typed_other->current5_ && 3697 current6_ == typed_other->current6_ && 3698 current7_ == typed_other->current7_); 3699 } 3700 3701 private: 3702 Iterator(const Iterator& other) 3703 : base_(other.base_), 3704 begin1_(other.begin1_), 3705 end1_(other.end1_), 3706 current1_(other.current1_), 3707 begin2_(other.begin2_), 3708 end2_(other.end2_), 3709 current2_(other.current2_), 3710 begin3_(other.begin3_), 3711 end3_(other.end3_), 3712 current3_(other.current3_), 3713 begin4_(other.begin4_), 3714 end4_(other.end4_), 3715 current4_(other.current4_), 3716 begin5_(other.begin5_), 3717 end5_(other.end5_), 3718 current5_(other.current5_), 3719 begin6_(other.begin6_), 3720 end6_(other.end6_), 3721 current6_(other.current6_), 3722 begin7_(other.begin7_), 3723 end7_(other.end7_), 3724 current7_(other.current7_) { 3725 ComputeCurrentValue(); 3726 } 3727 3728 void ComputeCurrentValue() { 3729 if (!AtEnd()) 3730 current_value_ = ParamType(*current1_, *current2_, *current3_, 3731 *current4_, *current5_, *current6_, *current7_); 3732 } 3733 bool AtEnd() const { 3734 // We must report iterator past the end of the range when either of the 3735 // component iterators has reached the end of its range. 3736 return 3737 current1_ == end1_ || 3738 current2_ == end2_ || 3739 current3_ == end3_ || 3740 current4_ == end4_ || 3741 current5_ == end5_ || 3742 current6_ == end6_ || 3743 current7_ == end7_; 3744 } 3745 3746 // No implementation - assignment is unsupported. 3747 void operator=(const Iterator& other); 3748 3749 const ParamGeneratorInterface<ParamType>* const base_; 3750 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 3751 // current[i]_ is the actual traversing iterator. 3752 const typename ParamGenerator<T1>::iterator begin1_; 3753 const typename ParamGenerator<T1>::iterator end1_; 3754 typename ParamGenerator<T1>::iterator current1_; 3755 const typename ParamGenerator<T2>::iterator begin2_; 3756 const typename ParamGenerator<T2>::iterator end2_; 3757 typename ParamGenerator<T2>::iterator current2_; 3758 const typename ParamGenerator<T3>::iterator begin3_; 3759 const typename ParamGenerator<T3>::iterator end3_; 3760 typename ParamGenerator<T3>::iterator current3_; 3761 const typename ParamGenerator<T4>::iterator begin4_; 3762 const typename ParamGenerator<T4>::iterator end4_; 3763 typename ParamGenerator<T4>::iterator current4_; 3764 const typename ParamGenerator<T5>::iterator begin5_; 3765 const typename ParamGenerator<T5>::iterator end5_; 3766 typename ParamGenerator<T5>::iterator current5_; 3767 const typename ParamGenerator<T6>::iterator begin6_; 3768 const typename ParamGenerator<T6>::iterator end6_; 3769 typename ParamGenerator<T6>::iterator current6_; 3770 const typename ParamGenerator<T7>::iterator begin7_; 3771 const typename ParamGenerator<T7>::iterator end7_; 3772 typename ParamGenerator<T7>::iterator current7_; 3773 ParamType current_value_; 3774 }; // class CartesianProductGenerator7::Iterator 3775 3776 // No implementation - assignment is unsupported. 3777 void operator=(const CartesianProductGenerator7& other); 3778 3779 const ParamGenerator<T1> g1_; 3780 const ParamGenerator<T2> g2_; 3781 const ParamGenerator<T3> g3_; 3782 const ParamGenerator<T4> g4_; 3783 const ParamGenerator<T5> g5_; 3784 const ParamGenerator<T6> g6_; 3785 const ParamGenerator<T7> g7_; 3786 }; // class CartesianProductGenerator7 3787 3788 3789 template <typename T1, typename T2, typename T3, typename T4, typename T5, 3790 typename T6, typename T7, typename T8> 3791 class CartesianProductGenerator8 3792 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, 3793 T7, T8> > { 3794 public: 3795 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType; 3796 3797 CartesianProductGenerator8(const ParamGenerator<T1>& g1, 3798 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 3799 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, 3800 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7, 3801 const ParamGenerator<T8>& g8) 3802 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), 3803 g8_(g8) {} 3804 virtual ~CartesianProductGenerator8() {} 3805 3806 virtual ParamIteratorInterface<ParamType>* Begin() const { 3807 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 3808 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, 3809 g7_.begin(), g8_, g8_.begin()); 3810 } 3811 virtual ParamIteratorInterface<ParamType>* End() const { 3812 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 3813 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, 3814 g8_.end()); 3815 } 3816 3817 private: 3818 class Iterator : public ParamIteratorInterface<ParamType> { 3819 public: 3820 Iterator(const ParamGeneratorInterface<ParamType>* base, 3821 const ParamGenerator<T1>& g1, 3822 const typename ParamGenerator<T1>::iterator& current1, 3823 const ParamGenerator<T2>& g2, 3824 const typename ParamGenerator<T2>::iterator& current2, 3825 const ParamGenerator<T3>& g3, 3826 const typename ParamGenerator<T3>::iterator& current3, 3827 const ParamGenerator<T4>& g4, 3828 const typename ParamGenerator<T4>::iterator& current4, 3829 const ParamGenerator<T5>& g5, 3830 const typename ParamGenerator<T5>::iterator& current5, 3831 const ParamGenerator<T6>& g6, 3832 const typename ParamGenerator<T6>::iterator& current6, 3833 const ParamGenerator<T7>& g7, 3834 const typename ParamGenerator<T7>::iterator& current7, 3835 const ParamGenerator<T8>& g8, 3836 const typename ParamGenerator<T8>::iterator& current8) 3837 : base_(base), 3838 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 3839 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 3840 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 3841 begin4_(g4.begin()), end4_(g4.end()), current4_(current4), 3842 begin5_(g5.begin()), end5_(g5.end()), current5_(current5), 3843 begin6_(g6.begin()), end6_(g6.end()), current6_(current6), 3844 begin7_(g7.begin()), end7_(g7.end()), current7_(current7), 3845 begin8_(g8.begin()), end8_(g8.end()), current8_(current8) { 3846 ComputeCurrentValue(); 3847 } 3848 virtual ~Iterator() {} 3849 3850 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 3851 return base_; 3852 } 3853 // Advance should not be called on beyond-of-range iterators 3854 // so no component iterators must be beyond end of range, either. 3855 virtual void Advance() { 3856 assert(!AtEnd()); 3857 ++current8_; 3858 if (current8_ == end8_) { 3859 current8_ = begin8_; 3860 ++current7_; 3861 } 3862 if (current7_ == end7_) { 3863 current7_ = begin7_; 3864 ++current6_; 3865 } 3866 if (current6_ == end6_) { 3867 current6_ = begin6_; 3868 ++current5_; 3869 } 3870 if (current5_ == end5_) { 3871 current5_ = begin5_; 3872 ++current4_; 3873 } 3874 if (current4_ == end4_) { 3875 current4_ = begin4_; 3876 ++current3_; 3877 } 3878 if (current3_ == end3_) { 3879 current3_ = begin3_; 3880 ++current2_; 3881 } 3882 if (current2_ == end2_) { 3883 current2_ = begin2_; 3884 ++current1_; 3885 } 3886 ComputeCurrentValue(); 3887 } 3888 virtual ParamIteratorInterface<ParamType>* Clone() const { 3889 return new Iterator(*this); 3890 } 3891 virtual const ParamType* Current() const { return ¤t_value_; } 3892 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 3893 // Having the same base generator guarantees that the other 3894 // iterator is of the same type and we can downcast. 3895 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 3896 << "The program attempted to compare iterators " 3897 << "from different generators." << std::endl; 3898 const Iterator* typed_other = 3899 CheckedDowncastToActualType<const Iterator>(&other); 3900 // We must report iterators equal if they both point beyond their 3901 // respective ranges. That can happen in a variety of fashions, 3902 // so we have to consult AtEnd(). 3903 return (AtEnd() && typed_other->AtEnd()) || 3904 ( 3905 current1_ == typed_other->current1_ && 3906 current2_ == typed_other->current2_ && 3907 current3_ == typed_other->current3_ && 3908 current4_ == typed_other->current4_ && 3909 current5_ == typed_other->current5_ && 3910 current6_ == typed_other->current6_ && 3911 current7_ == typed_other->current7_ && 3912 current8_ == typed_other->current8_); 3913 } 3914 3915 private: 3916 Iterator(const Iterator& other) 3917 : base_(other.base_), 3918 begin1_(other.begin1_), 3919 end1_(other.end1_), 3920 current1_(other.current1_), 3921 begin2_(other.begin2_), 3922 end2_(other.end2_), 3923 current2_(other.current2_), 3924 begin3_(other.begin3_), 3925 end3_(other.end3_), 3926 current3_(other.current3_), 3927 begin4_(other.begin4_), 3928 end4_(other.end4_), 3929 current4_(other.current4_), 3930 begin5_(other.begin5_), 3931 end5_(other.end5_), 3932 current5_(other.current5_), 3933 begin6_(other.begin6_), 3934 end6_(other.end6_), 3935 current6_(other.current6_), 3936 begin7_(other.begin7_), 3937 end7_(other.end7_), 3938 current7_(other.current7_), 3939 begin8_(other.begin8_), 3940 end8_(other.end8_), 3941 current8_(other.current8_) { 3942 ComputeCurrentValue(); 3943 } 3944 3945 void ComputeCurrentValue() { 3946 if (!AtEnd()) 3947 current_value_ = ParamType(*current1_, *current2_, *current3_, 3948 *current4_, *current5_, *current6_, *current7_, *current8_); 3949 } 3950 bool AtEnd() const { 3951 // We must report iterator past the end of the range when either of the 3952 // component iterators has reached the end of its range. 3953 return 3954 current1_ == end1_ || 3955 current2_ == end2_ || 3956 current3_ == end3_ || 3957 current4_ == end4_ || 3958 current5_ == end5_ || 3959 current6_ == end6_ || 3960 current7_ == end7_ || 3961 current8_ == end8_; 3962 } 3963 3964 // No implementation - assignment is unsupported. 3965 void operator=(const Iterator& other); 3966 3967 const ParamGeneratorInterface<ParamType>* const base_; 3968 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 3969 // current[i]_ is the actual traversing iterator. 3970 const typename ParamGenerator<T1>::iterator begin1_; 3971 const typename ParamGenerator<T1>::iterator end1_; 3972 typename ParamGenerator<T1>::iterator current1_; 3973 const typename ParamGenerator<T2>::iterator begin2_; 3974 const typename ParamGenerator<T2>::iterator end2_; 3975 typename ParamGenerator<T2>::iterator current2_; 3976 const typename ParamGenerator<T3>::iterator begin3_; 3977 const typename ParamGenerator<T3>::iterator end3_; 3978 typename ParamGenerator<T3>::iterator current3_; 3979 const typename ParamGenerator<T4>::iterator begin4_; 3980 const typename ParamGenerator<T4>::iterator end4_; 3981 typename ParamGenerator<T4>::iterator current4_; 3982 const typename ParamGenerator<T5>::iterator begin5_; 3983 const typename ParamGenerator<T5>::iterator end5_; 3984 typename ParamGenerator<T5>::iterator current5_; 3985 const typename ParamGenerator<T6>::iterator begin6_; 3986 const typename ParamGenerator<T6>::iterator end6_; 3987 typename ParamGenerator<T6>::iterator current6_; 3988 const typename ParamGenerator<T7>::iterator begin7_; 3989 const typename ParamGenerator<T7>::iterator end7_; 3990 typename ParamGenerator<T7>::iterator current7_; 3991 const typename ParamGenerator<T8>::iterator begin8_; 3992 const typename ParamGenerator<T8>::iterator end8_; 3993 typename ParamGenerator<T8>::iterator current8_; 3994 ParamType current_value_; 3995 }; // class CartesianProductGenerator8::Iterator 3996 3997 // No implementation - assignment is unsupported. 3998 void operator=(const CartesianProductGenerator8& other); 3999 4000 const ParamGenerator<T1> g1_; 4001 const ParamGenerator<T2> g2_; 4002 const ParamGenerator<T3> g3_; 4003 const ParamGenerator<T4> g4_; 4004 const ParamGenerator<T5> g5_; 4005 const ParamGenerator<T6> g6_; 4006 const ParamGenerator<T7> g7_; 4007 const ParamGenerator<T8> g8_; 4008 }; // class CartesianProductGenerator8 4009 4010 4011 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4012 typename T6, typename T7, typename T8, typename T9> 4013 class CartesianProductGenerator9 4014 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, 4015 T7, T8, T9> > { 4016 public: 4017 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType; 4018 4019 CartesianProductGenerator9(const ParamGenerator<T1>& g1, 4020 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 4021 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, 4022 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7, 4023 const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9) 4024 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), 4025 g9_(g9) {} 4026 virtual ~CartesianProductGenerator9() {} 4027 4028 virtual ParamIteratorInterface<ParamType>* Begin() const { 4029 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 4030 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, 4031 g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin()); 4032 } 4033 virtual ParamIteratorInterface<ParamType>* End() const { 4034 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 4035 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, 4036 g8_.end(), g9_, g9_.end()); 4037 } 4038 4039 private: 4040 class Iterator : public ParamIteratorInterface<ParamType> { 4041 public: 4042 Iterator(const ParamGeneratorInterface<ParamType>* base, 4043 const ParamGenerator<T1>& g1, 4044 const typename ParamGenerator<T1>::iterator& current1, 4045 const ParamGenerator<T2>& g2, 4046 const typename ParamGenerator<T2>::iterator& current2, 4047 const ParamGenerator<T3>& g3, 4048 const typename ParamGenerator<T3>::iterator& current3, 4049 const ParamGenerator<T4>& g4, 4050 const typename ParamGenerator<T4>::iterator& current4, 4051 const ParamGenerator<T5>& g5, 4052 const typename ParamGenerator<T5>::iterator& current5, 4053 const ParamGenerator<T6>& g6, 4054 const typename ParamGenerator<T6>::iterator& current6, 4055 const ParamGenerator<T7>& g7, 4056 const typename ParamGenerator<T7>::iterator& current7, 4057 const ParamGenerator<T8>& g8, 4058 const typename ParamGenerator<T8>::iterator& current8, 4059 const ParamGenerator<T9>& g9, 4060 const typename ParamGenerator<T9>::iterator& current9) 4061 : base_(base), 4062 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 4063 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 4064 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 4065 begin4_(g4.begin()), end4_(g4.end()), current4_(current4), 4066 begin5_(g5.begin()), end5_(g5.end()), current5_(current5), 4067 begin6_(g6.begin()), end6_(g6.end()), current6_(current6), 4068 begin7_(g7.begin()), end7_(g7.end()), current7_(current7), 4069 begin8_(g8.begin()), end8_(g8.end()), current8_(current8), 4070 begin9_(g9.begin()), end9_(g9.end()), current9_(current9) { 4071 ComputeCurrentValue(); 4072 } 4073 virtual ~Iterator() {} 4074 4075 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 4076 return base_; 4077 } 4078 // Advance should not be called on beyond-of-range iterators 4079 // so no component iterators must be beyond end of range, either. 4080 virtual void Advance() { 4081 assert(!AtEnd()); 4082 ++current9_; 4083 if (current9_ == end9_) { 4084 current9_ = begin9_; 4085 ++current8_; 4086 } 4087 if (current8_ == end8_) { 4088 current8_ = begin8_; 4089 ++current7_; 4090 } 4091 if (current7_ == end7_) { 4092 current7_ = begin7_; 4093 ++current6_; 4094 } 4095 if (current6_ == end6_) { 4096 current6_ = begin6_; 4097 ++current5_; 4098 } 4099 if (current5_ == end5_) { 4100 current5_ = begin5_; 4101 ++current4_; 4102 } 4103 if (current4_ == end4_) { 4104 current4_ = begin4_; 4105 ++current3_; 4106 } 4107 if (current3_ == end3_) { 4108 current3_ = begin3_; 4109 ++current2_; 4110 } 4111 if (current2_ == end2_) { 4112 current2_ = begin2_; 4113 ++current1_; 4114 } 4115 ComputeCurrentValue(); 4116 } 4117 virtual ParamIteratorInterface<ParamType>* Clone() const { 4118 return new Iterator(*this); 4119 } 4120 virtual const ParamType* Current() const { return ¤t_value_; } 4121 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 4122 // Having the same base generator guarantees that the other 4123 // iterator is of the same type and we can downcast. 4124 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 4125 << "The program attempted to compare iterators " 4126 << "from different generators." << std::endl; 4127 const Iterator* typed_other = 4128 CheckedDowncastToActualType<const Iterator>(&other); 4129 // We must report iterators equal if they both point beyond their 4130 // respective ranges. That can happen in a variety of fashions, 4131 // so we have to consult AtEnd(). 4132 return (AtEnd() && typed_other->AtEnd()) || 4133 ( 4134 current1_ == typed_other->current1_ && 4135 current2_ == typed_other->current2_ && 4136 current3_ == typed_other->current3_ && 4137 current4_ == typed_other->current4_ && 4138 current5_ == typed_other->current5_ && 4139 current6_ == typed_other->current6_ && 4140 current7_ == typed_other->current7_ && 4141 current8_ == typed_other->current8_ && 4142 current9_ == typed_other->current9_); 4143 } 4144 4145 private: 4146 Iterator(const Iterator& other) 4147 : base_(other.base_), 4148 begin1_(other.begin1_), 4149 end1_(other.end1_), 4150 current1_(other.current1_), 4151 begin2_(other.begin2_), 4152 end2_(other.end2_), 4153 current2_(other.current2_), 4154 begin3_(other.begin3_), 4155 end3_(other.end3_), 4156 current3_(other.current3_), 4157 begin4_(other.begin4_), 4158 end4_(other.end4_), 4159 current4_(other.current4_), 4160 begin5_(other.begin5_), 4161 end5_(other.end5_), 4162 current5_(other.current5_), 4163 begin6_(other.begin6_), 4164 end6_(other.end6_), 4165 current6_(other.current6_), 4166 begin7_(other.begin7_), 4167 end7_(other.end7_), 4168 current7_(other.current7_), 4169 begin8_(other.begin8_), 4170 end8_(other.end8_), 4171 current8_(other.current8_), 4172 begin9_(other.begin9_), 4173 end9_(other.end9_), 4174 current9_(other.current9_) { 4175 ComputeCurrentValue(); 4176 } 4177 4178 void ComputeCurrentValue() { 4179 if (!AtEnd()) 4180 current_value_ = ParamType(*current1_, *current2_, *current3_, 4181 *current4_, *current5_, *current6_, *current7_, *current8_, 4182 *current9_); 4183 } 4184 bool AtEnd() const { 4185 // We must report iterator past the end of the range when either of the 4186 // component iterators has reached the end of its range. 4187 return 4188 current1_ == end1_ || 4189 current2_ == end2_ || 4190 current3_ == end3_ || 4191 current4_ == end4_ || 4192 current5_ == end5_ || 4193 current6_ == end6_ || 4194 current7_ == end7_ || 4195 current8_ == end8_ || 4196 current9_ == end9_; 4197 } 4198 4199 // No implementation - assignment is unsupported. 4200 void operator=(const Iterator& other); 4201 4202 const ParamGeneratorInterface<ParamType>* const base_; 4203 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 4204 // current[i]_ is the actual traversing iterator. 4205 const typename ParamGenerator<T1>::iterator begin1_; 4206 const typename ParamGenerator<T1>::iterator end1_; 4207 typename ParamGenerator<T1>::iterator current1_; 4208 const typename ParamGenerator<T2>::iterator begin2_; 4209 const typename ParamGenerator<T2>::iterator end2_; 4210 typename ParamGenerator<T2>::iterator current2_; 4211 const typename ParamGenerator<T3>::iterator begin3_; 4212 const typename ParamGenerator<T3>::iterator end3_; 4213 typename ParamGenerator<T3>::iterator current3_; 4214 const typename ParamGenerator<T4>::iterator begin4_; 4215 const typename ParamGenerator<T4>::iterator end4_; 4216 typename ParamGenerator<T4>::iterator current4_; 4217 const typename ParamGenerator<T5>::iterator begin5_; 4218 const typename ParamGenerator<T5>::iterator end5_; 4219 typename ParamGenerator<T5>::iterator current5_; 4220 const typename ParamGenerator<T6>::iterator begin6_; 4221 const typename ParamGenerator<T6>::iterator end6_; 4222 typename ParamGenerator<T6>::iterator current6_; 4223 const typename ParamGenerator<T7>::iterator begin7_; 4224 const typename ParamGenerator<T7>::iterator end7_; 4225 typename ParamGenerator<T7>::iterator current7_; 4226 const typename ParamGenerator<T8>::iterator begin8_; 4227 const typename ParamGenerator<T8>::iterator end8_; 4228 typename ParamGenerator<T8>::iterator current8_; 4229 const typename ParamGenerator<T9>::iterator begin9_; 4230 const typename ParamGenerator<T9>::iterator end9_; 4231 typename ParamGenerator<T9>::iterator current9_; 4232 ParamType current_value_; 4233 }; // class CartesianProductGenerator9::Iterator 4234 4235 // No implementation - assignment is unsupported. 4236 void operator=(const CartesianProductGenerator9& other); 4237 4238 const ParamGenerator<T1> g1_; 4239 const ParamGenerator<T2> g2_; 4240 const ParamGenerator<T3> g3_; 4241 const ParamGenerator<T4> g4_; 4242 const ParamGenerator<T5> g5_; 4243 const ParamGenerator<T6> g6_; 4244 const ParamGenerator<T7> g7_; 4245 const ParamGenerator<T8> g8_; 4246 const ParamGenerator<T9> g9_; 4247 }; // class CartesianProductGenerator9 4248 4249 4250 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4251 typename T6, typename T7, typename T8, typename T9, typename T10> 4252 class CartesianProductGenerator10 4253 : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, 4254 T7, T8, T9, T10> > { 4255 public: 4256 typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType; 4257 4258 CartesianProductGenerator10(const ParamGenerator<T1>& g1, 4259 const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3, 4260 const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5, 4261 const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7, 4262 const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9, 4263 const ParamGenerator<T10>& g10) 4264 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), 4265 g9_(g9), g10_(g10) {} 4266 virtual ~CartesianProductGenerator10() {} 4267 4268 virtual ParamIteratorInterface<ParamType>* Begin() const { 4269 return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, 4270 g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, 4271 g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin()); 4272 } 4273 virtual ParamIteratorInterface<ParamType>* End() const { 4274 return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), 4275 g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, 4276 g8_.end(), g9_, g9_.end(), g10_, g10_.end()); 4277 } 4278 4279 private: 4280 class Iterator : public ParamIteratorInterface<ParamType> { 4281 public: 4282 Iterator(const ParamGeneratorInterface<ParamType>* base, 4283 const ParamGenerator<T1>& g1, 4284 const typename ParamGenerator<T1>::iterator& current1, 4285 const ParamGenerator<T2>& g2, 4286 const typename ParamGenerator<T2>::iterator& current2, 4287 const ParamGenerator<T3>& g3, 4288 const typename ParamGenerator<T3>::iterator& current3, 4289 const ParamGenerator<T4>& g4, 4290 const typename ParamGenerator<T4>::iterator& current4, 4291 const ParamGenerator<T5>& g5, 4292 const typename ParamGenerator<T5>::iterator& current5, 4293 const ParamGenerator<T6>& g6, 4294 const typename ParamGenerator<T6>::iterator& current6, 4295 const ParamGenerator<T7>& g7, 4296 const typename ParamGenerator<T7>::iterator& current7, 4297 const ParamGenerator<T8>& g8, 4298 const typename ParamGenerator<T8>::iterator& current8, 4299 const ParamGenerator<T9>& g9, 4300 const typename ParamGenerator<T9>::iterator& current9, 4301 const ParamGenerator<T10>& g10, 4302 const typename ParamGenerator<T10>::iterator& current10) 4303 : base_(base), 4304 begin1_(g1.begin()), end1_(g1.end()), current1_(current1), 4305 begin2_(g2.begin()), end2_(g2.end()), current2_(current2), 4306 begin3_(g3.begin()), end3_(g3.end()), current3_(current3), 4307 begin4_(g4.begin()), end4_(g4.end()), current4_(current4), 4308 begin5_(g5.begin()), end5_(g5.end()), current5_(current5), 4309 begin6_(g6.begin()), end6_(g6.end()), current6_(current6), 4310 begin7_(g7.begin()), end7_(g7.end()), current7_(current7), 4311 begin8_(g8.begin()), end8_(g8.end()), current8_(current8), 4312 begin9_(g9.begin()), end9_(g9.end()), current9_(current9), 4313 begin10_(g10.begin()), end10_(g10.end()), current10_(current10) { 4314 ComputeCurrentValue(); 4315 } 4316 virtual ~Iterator() {} 4317 4318 virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const { 4319 return base_; 4320 } 4321 // Advance should not be called on beyond-of-range iterators 4322 // so no component iterators must be beyond end of range, either. 4323 virtual void Advance() { 4324 assert(!AtEnd()); 4325 ++current10_; 4326 if (current10_ == end10_) { 4327 current10_ = begin10_; 4328 ++current9_; 4329 } 4330 if (current9_ == end9_) { 4331 current9_ = begin9_; 4332 ++current8_; 4333 } 4334 if (current8_ == end8_) { 4335 current8_ = begin8_; 4336 ++current7_; 4337 } 4338 if (current7_ == end7_) { 4339 current7_ = begin7_; 4340 ++current6_; 4341 } 4342 if (current6_ == end6_) { 4343 current6_ = begin6_; 4344 ++current5_; 4345 } 4346 if (current5_ == end5_) { 4347 current5_ = begin5_; 4348 ++current4_; 4349 } 4350 if (current4_ == end4_) { 4351 current4_ = begin4_; 4352 ++current3_; 4353 } 4354 if (current3_ == end3_) { 4355 current3_ = begin3_; 4356 ++current2_; 4357 } 4358 if (current2_ == end2_) { 4359 current2_ = begin2_; 4360 ++current1_; 4361 } 4362 ComputeCurrentValue(); 4363 } 4364 virtual ParamIteratorInterface<ParamType>* Clone() const { 4365 return new Iterator(*this); 4366 } 4367 virtual const ParamType* Current() const { return ¤t_value_; } 4368 virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const { 4369 // Having the same base generator guarantees that the other 4370 // iterator is of the same type and we can downcast. 4371 GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) 4372 << "The program attempted to compare iterators " 4373 << "from different generators." << std::endl; 4374 const Iterator* typed_other = 4375 CheckedDowncastToActualType<const Iterator>(&other); 4376 // We must report iterators equal if they both point beyond their 4377 // respective ranges. That can happen in a variety of fashions, 4378 // so we have to consult AtEnd(). 4379 return (AtEnd() && typed_other->AtEnd()) || 4380 ( 4381 current1_ == typed_other->current1_ && 4382 current2_ == typed_other->current2_ && 4383 current3_ == typed_other->current3_ && 4384 current4_ == typed_other->current4_ && 4385 current5_ == typed_other->current5_ && 4386 current6_ == typed_other->current6_ && 4387 current7_ == typed_other->current7_ && 4388 current8_ == typed_other->current8_ && 4389 current9_ == typed_other->current9_ && 4390 current10_ == typed_other->current10_); 4391 } 4392 4393 private: 4394 Iterator(const Iterator& other) 4395 : base_(other.base_), 4396 begin1_(other.begin1_), 4397 end1_(other.end1_), 4398 current1_(other.current1_), 4399 begin2_(other.begin2_), 4400 end2_(other.end2_), 4401 current2_(other.current2_), 4402 begin3_(other.begin3_), 4403 end3_(other.end3_), 4404 current3_(other.current3_), 4405 begin4_(other.begin4_), 4406 end4_(other.end4_), 4407 current4_(other.current4_), 4408 begin5_(other.begin5_), 4409 end5_(other.end5_), 4410 current5_(other.current5_), 4411 begin6_(other.begin6_), 4412 end6_(other.end6_), 4413 current6_(other.current6_), 4414 begin7_(other.begin7_), 4415 end7_(other.end7_), 4416 current7_(other.current7_), 4417 begin8_(other.begin8_), 4418 end8_(other.end8_), 4419 current8_(other.current8_), 4420 begin9_(other.begin9_), 4421 end9_(other.end9_), 4422 current9_(other.current9_), 4423 begin10_(other.begin10_), 4424 end10_(other.end10_), 4425 current10_(other.current10_) { 4426 ComputeCurrentValue(); 4427 } 4428 4429 void ComputeCurrentValue() { 4430 if (!AtEnd()) 4431 current_value_ = ParamType(*current1_, *current2_, *current3_, 4432 *current4_, *current5_, *current6_, *current7_, *current8_, 4433 *current9_, *current10_); 4434 } 4435 bool AtEnd() const { 4436 // We must report iterator past the end of the range when either of the 4437 // component iterators has reached the end of its range. 4438 return 4439 current1_ == end1_ || 4440 current2_ == end2_ || 4441 current3_ == end3_ || 4442 current4_ == end4_ || 4443 current5_ == end5_ || 4444 current6_ == end6_ || 4445 current7_ == end7_ || 4446 current8_ == end8_ || 4447 current9_ == end9_ || 4448 current10_ == end10_; 4449 } 4450 4451 // No implementation - assignment is unsupported. 4452 void operator=(const Iterator& other); 4453 4454 const ParamGeneratorInterface<ParamType>* const base_; 4455 // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. 4456 // current[i]_ is the actual traversing iterator. 4457 const typename ParamGenerator<T1>::iterator begin1_; 4458 const typename ParamGenerator<T1>::iterator end1_; 4459 typename ParamGenerator<T1>::iterator current1_; 4460 const typename ParamGenerator<T2>::iterator begin2_; 4461 const typename ParamGenerator<T2>::iterator end2_; 4462 typename ParamGenerator<T2>::iterator current2_; 4463 const typename ParamGenerator<T3>::iterator begin3_; 4464 const typename ParamGenerator<T3>::iterator end3_; 4465 typename ParamGenerator<T3>::iterator current3_; 4466 const typename ParamGenerator<T4>::iterator begin4_; 4467 const typename ParamGenerator<T4>::iterator end4_; 4468 typename ParamGenerator<T4>::iterator current4_; 4469 const typename ParamGenerator<T5>::iterator begin5_; 4470 const typename ParamGenerator<T5>::iterator end5_; 4471 typename ParamGenerator<T5>::iterator current5_; 4472 const typename ParamGenerator<T6>::iterator begin6_; 4473 const typename ParamGenerator<T6>::iterator end6_; 4474 typename ParamGenerator<T6>::iterator current6_; 4475 const typename ParamGenerator<T7>::iterator begin7_; 4476 const typename ParamGenerator<T7>::iterator end7_; 4477 typename ParamGenerator<T7>::iterator current7_; 4478 const typename ParamGenerator<T8>::iterator begin8_; 4479 const typename ParamGenerator<T8>::iterator end8_; 4480 typename ParamGenerator<T8>::iterator current8_; 4481 const typename ParamGenerator<T9>::iterator begin9_; 4482 const typename ParamGenerator<T9>::iterator end9_; 4483 typename ParamGenerator<T9>::iterator current9_; 4484 const typename ParamGenerator<T10>::iterator begin10_; 4485 const typename ParamGenerator<T10>::iterator end10_; 4486 typename ParamGenerator<T10>::iterator current10_; 4487 ParamType current_value_; 4488 }; // class CartesianProductGenerator10::Iterator 4489 4490 // No implementation - assignment is unsupported. 4491 void operator=(const CartesianProductGenerator10& other); 4492 4493 const ParamGenerator<T1> g1_; 4494 const ParamGenerator<T2> g2_; 4495 const ParamGenerator<T3> g3_; 4496 const ParamGenerator<T4> g4_; 4497 const ParamGenerator<T5> g5_; 4498 const ParamGenerator<T6> g6_; 4499 const ParamGenerator<T7> g7_; 4500 const ParamGenerator<T8> g8_; 4501 const ParamGenerator<T9> g9_; 4502 const ParamGenerator<T10> g10_; 4503 }; // class CartesianProductGenerator10 4504 4505 4506 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. 4507 // 4508 // Helper classes providing Combine() with polymorphic features. They allow 4509 // casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is 4510 // convertible to U. 4511 // 4512 template <class Generator1, class Generator2> 4513 class CartesianProductHolder2 { 4514 public: 4515 CartesianProductHolder2(const Generator1& g1, const Generator2& g2) 4516 : g1_(g1), g2_(g2) {} 4517 template <typename T1, typename T2> 4518 operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const { 4519 return ParamGenerator< ::std::tr1::tuple<T1, T2> >( 4520 new CartesianProductGenerator2<T1, T2>( 4521 static_cast<ParamGenerator<T1> >(g1_), 4522 static_cast<ParamGenerator<T2> >(g2_))); 4523 } 4524 4525 private: 4526 // No implementation - assignment is unsupported. 4527 void operator=(const CartesianProductHolder2& other); 4528 4529 const Generator1 g1_; 4530 const Generator2 g2_; 4531 }; // class CartesianProductHolder2 4532 4533 template <class Generator1, class Generator2, class Generator3> 4534 class CartesianProductHolder3 { 4535 public: 4536 CartesianProductHolder3(const Generator1& g1, const Generator2& g2, 4537 const Generator3& g3) 4538 : g1_(g1), g2_(g2), g3_(g3) {} 4539 template <typename T1, typename T2, typename T3> 4540 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const { 4541 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >( 4542 new CartesianProductGenerator3<T1, T2, T3>( 4543 static_cast<ParamGenerator<T1> >(g1_), 4544 static_cast<ParamGenerator<T2> >(g2_), 4545 static_cast<ParamGenerator<T3> >(g3_))); 4546 } 4547 4548 private: 4549 // No implementation - assignment is unsupported. 4550 void operator=(const CartesianProductHolder3& other); 4551 4552 const Generator1 g1_; 4553 const Generator2 g2_; 4554 const Generator3 g3_; 4555 }; // class CartesianProductHolder3 4556 4557 template <class Generator1, class Generator2, class Generator3, 4558 class Generator4> 4559 class CartesianProductHolder4 { 4560 public: 4561 CartesianProductHolder4(const Generator1& g1, const Generator2& g2, 4562 const Generator3& g3, const Generator4& g4) 4563 : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} 4564 template <typename T1, typename T2, typename T3, typename T4> 4565 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const { 4566 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >( 4567 new CartesianProductGenerator4<T1, T2, T3, T4>( 4568 static_cast<ParamGenerator<T1> >(g1_), 4569 static_cast<ParamGenerator<T2> >(g2_), 4570 static_cast<ParamGenerator<T3> >(g3_), 4571 static_cast<ParamGenerator<T4> >(g4_))); 4572 } 4573 4574 private: 4575 // No implementation - assignment is unsupported. 4576 void operator=(const CartesianProductHolder4& other); 4577 4578 const Generator1 g1_; 4579 const Generator2 g2_; 4580 const Generator3 g3_; 4581 const Generator4 g4_; 4582 }; // class CartesianProductHolder4 4583 4584 template <class Generator1, class Generator2, class Generator3, 4585 class Generator4, class Generator5> 4586 class CartesianProductHolder5 { 4587 public: 4588 CartesianProductHolder5(const Generator1& g1, const Generator2& g2, 4589 const Generator3& g3, const Generator4& g4, const Generator5& g5) 4590 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} 4591 template <typename T1, typename T2, typename T3, typename T4, typename T5> 4592 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const { 4593 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >( 4594 new CartesianProductGenerator5<T1, T2, T3, T4, T5>( 4595 static_cast<ParamGenerator<T1> >(g1_), 4596 static_cast<ParamGenerator<T2> >(g2_), 4597 static_cast<ParamGenerator<T3> >(g3_), 4598 static_cast<ParamGenerator<T4> >(g4_), 4599 static_cast<ParamGenerator<T5> >(g5_))); 4600 } 4601 4602 private: 4603 // No implementation - assignment is unsupported. 4604 void operator=(const CartesianProductHolder5& other); 4605 4606 const Generator1 g1_; 4607 const Generator2 g2_; 4608 const Generator3 g3_; 4609 const Generator4 g4_; 4610 const Generator5 g5_; 4611 }; // class CartesianProductHolder5 4612 4613 template <class Generator1, class Generator2, class Generator3, 4614 class Generator4, class Generator5, class Generator6> 4615 class CartesianProductHolder6 { 4616 public: 4617 CartesianProductHolder6(const Generator1& g1, const Generator2& g2, 4618 const Generator3& g3, const Generator4& g4, const Generator5& g5, 4619 const Generator6& g6) 4620 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} 4621 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4622 typename T6> 4623 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const { 4624 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >( 4625 new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>( 4626 static_cast<ParamGenerator<T1> >(g1_), 4627 static_cast<ParamGenerator<T2> >(g2_), 4628 static_cast<ParamGenerator<T3> >(g3_), 4629 static_cast<ParamGenerator<T4> >(g4_), 4630 static_cast<ParamGenerator<T5> >(g5_), 4631 static_cast<ParamGenerator<T6> >(g6_))); 4632 } 4633 4634 private: 4635 // No implementation - assignment is unsupported. 4636 void operator=(const CartesianProductHolder6& other); 4637 4638 const Generator1 g1_; 4639 const Generator2 g2_; 4640 const Generator3 g3_; 4641 const Generator4 g4_; 4642 const Generator5 g5_; 4643 const Generator6 g6_; 4644 }; // class CartesianProductHolder6 4645 4646 template <class Generator1, class Generator2, class Generator3, 4647 class Generator4, class Generator5, class Generator6, class Generator7> 4648 class CartesianProductHolder7 { 4649 public: 4650 CartesianProductHolder7(const Generator1& g1, const Generator2& g2, 4651 const Generator3& g3, const Generator4& g4, const Generator5& g5, 4652 const Generator6& g6, const Generator7& g7) 4653 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} 4654 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4655 typename T6, typename T7> 4656 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, 4657 T7> >() const { 4658 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >( 4659 new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>( 4660 static_cast<ParamGenerator<T1> >(g1_), 4661 static_cast<ParamGenerator<T2> >(g2_), 4662 static_cast<ParamGenerator<T3> >(g3_), 4663 static_cast<ParamGenerator<T4> >(g4_), 4664 static_cast<ParamGenerator<T5> >(g5_), 4665 static_cast<ParamGenerator<T6> >(g6_), 4666 static_cast<ParamGenerator<T7> >(g7_))); 4667 } 4668 4669 private: 4670 // No implementation - assignment is unsupported. 4671 void operator=(const CartesianProductHolder7& other); 4672 4673 const Generator1 g1_; 4674 const Generator2 g2_; 4675 const Generator3 g3_; 4676 const Generator4 g4_; 4677 const Generator5 g5_; 4678 const Generator6 g6_; 4679 const Generator7 g7_; 4680 }; // class CartesianProductHolder7 4681 4682 template <class Generator1, class Generator2, class Generator3, 4683 class Generator4, class Generator5, class Generator6, class Generator7, 4684 class Generator8> 4685 class CartesianProductHolder8 { 4686 public: 4687 CartesianProductHolder8(const Generator1& g1, const Generator2& g2, 4688 const Generator3& g3, const Generator4& g4, const Generator5& g5, 4689 const Generator6& g6, const Generator7& g7, const Generator8& g8) 4690 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), 4691 g8_(g8) {} 4692 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4693 typename T6, typename T7, typename T8> 4694 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, 4695 T8> >() const { 4696 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >( 4697 new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>( 4698 static_cast<ParamGenerator<T1> >(g1_), 4699 static_cast<ParamGenerator<T2> >(g2_), 4700 static_cast<ParamGenerator<T3> >(g3_), 4701 static_cast<ParamGenerator<T4> >(g4_), 4702 static_cast<ParamGenerator<T5> >(g5_), 4703 static_cast<ParamGenerator<T6> >(g6_), 4704 static_cast<ParamGenerator<T7> >(g7_), 4705 static_cast<ParamGenerator<T8> >(g8_))); 4706 } 4707 4708 private: 4709 // No implementation - assignment is unsupported. 4710 void operator=(const CartesianProductHolder8& other); 4711 4712 const Generator1 g1_; 4713 const Generator2 g2_; 4714 const Generator3 g3_; 4715 const Generator4 g4_; 4716 const Generator5 g5_; 4717 const Generator6 g6_; 4718 const Generator7 g7_; 4719 const Generator8 g8_; 4720 }; // class CartesianProductHolder8 4721 4722 template <class Generator1, class Generator2, class Generator3, 4723 class Generator4, class Generator5, class Generator6, class Generator7, 4724 class Generator8, class Generator9> 4725 class CartesianProductHolder9 { 4726 public: 4727 CartesianProductHolder9(const Generator1& g1, const Generator2& g2, 4728 const Generator3& g3, const Generator4& g4, const Generator5& g5, 4729 const Generator6& g6, const Generator7& g7, const Generator8& g8, 4730 const Generator9& g9) 4731 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), 4732 g9_(g9) {} 4733 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4734 typename T6, typename T7, typename T8, typename T9> 4735 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, 4736 T9> >() const { 4737 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, 4738 T9> >( 4739 new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>( 4740 static_cast<ParamGenerator<T1> >(g1_), 4741 static_cast<ParamGenerator<T2> >(g2_), 4742 static_cast<ParamGenerator<T3> >(g3_), 4743 static_cast<ParamGenerator<T4> >(g4_), 4744 static_cast<ParamGenerator<T5> >(g5_), 4745 static_cast<ParamGenerator<T6> >(g6_), 4746 static_cast<ParamGenerator<T7> >(g7_), 4747 static_cast<ParamGenerator<T8> >(g8_), 4748 static_cast<ParamGenerator<T9> >(g9_))); 4749 } 4750 4751 private: 4752 // No implementation - assignment is unsupported. 4753 void operator=(const CartesianProductHolder9& other); 4754 4755 const Generator1 g1_; 4756 const Generator2 g2_; 4757 const Generator3 g3_; 4758 const Generator4 g4_; 4759 const Generator5 g5_; 4760 const Generator6 g6_; 4761 const Generator7 g7_; 4762 const Generator8 g8_; 4763 const Generator9 g9_; 4764 }; // class CartesianProductHolder9 4765 4766 template <class Generator1, class Generator2, class Generator3, 4767 class Generator4, class Generator5, class Generator6, class Generator7, 4768 class Generator8, class Generator9, class Generator10> 4769 class CartesianProductHolder10 { 4770 public: 4771 CartesianProductHolder10(const Generator1& g1, const Generator2& g2, 4772 const Generator3& g3, const Generator4& g4, const Generator5& g5, 4773 const Generator6& g6, const Generator7& g7, const Generator8& g8, 4774 const Generator9& g9, const Generator10& g10) 4775 : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), 4776 g9_(g9), g10_(g10) {} 4777 template <typename T1, typename T2, typename T3, typename T4, typename T5, 4778 typename T6, typename T7, typename T8, typename T9, typename T10> 4779 operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, 4780 T9, T10> >() const { 4781 return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, 4782 T9, T10> >( 4783 new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9, 4784 T10>( 4785 static_cast<ParamGenerator<T1> >(g1_), 4786 static_cast<ParamGenerator<T2> >(g2_), 4787 static_cast<ParamGenerator<T3> >(g3_), 4788 static_cast<ParamGenerator<T4> >(g4_), 4789 static_cast<ParamGenerator<T5> >(g5_), 4790 static_cast<ParamGenerator<T6> >(g6_), 4791 static_cast<ParamGenerator<T7> >(g7_), 4792 static_cast<ParamGenerator<T8> >(g8_), 4793 static_cast<ParamGenerator<T9> >(g9_), 4794 static_cast<ParamGenerator<T10> >(g10_))); 4795 } 4796 4797 private: 4798 // No implementation - assignment is unsupported. 4799 void operator=(const CartesianProductHolder10& other); 4800 4801 const Generator1 g1_; 4802 const Generator2 g2_; 4803 const Generator3 g3_; 4804 const Generator4 g4_; 4805 const Generator5 g5_; 4806 const Generator6 g6_; 4807 const Generator7 g7_; 4808 const Generator8 g8_; 4809 const Generator9 g9_; 4810 const Generator10 g10_; 4811 }; // class CartesianProductHolder10 4812 4813 # endif // GTEST_HAS_COMBINE 4814 4815 } // namespace internal 4816 } // namespace testing 4817 4818 #endif // GTEST_HAS_PARAM_TEST 4819 4820 #endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ 4821