- Timestamp:
- Nov 9, 2022, 12:22:30 PM (18 months ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 271a5d3
- Parents:
- 4da152a
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/utility.h
r4da152a r6411b7d 457 457 // TODO: update to use variadic arguments 458 458 459 template< typename... > 460 struct group_iterate_t; 461 459 462 template< typename T1, typename T2 > 460 struct group_iterate_t {463 struct group_iterate_t<T1, T2> { 461 464 private: 462 465 std::tuple<T1, T2> args; 463 466 public: 464 group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) { 465 assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%zd, %zd>.", v1.size(), v2.size()); 466 }; 467 group_iterate_t( const T1 & v1, const T2 & v2 ) : args(v1, v2) {}; 467 468 468 469 typedef std::tuple<decltype(*std::get<0>(args).begin()), decltype(*std::get<1>(args).begin())> value_type; … … 485 486 }; 486 487 488 template< typename T1, typename T2, typename T3 > 489 struct group_iterate_t<T1, T2, T3> { 490 private: 491 std::tuple<T1, T2, T3> args; 492 public: 493 group_iterate_t( const T1 & v1, const T2 & v2, const T3 & v3 ) : args(v1, v2, v3) {}; 494 495 template<size_t I> using Iter = decltype(std::get<I>(args).begin()); 496 using value_type = std::tuple<decltype(*std::get<0>(args).begin()), decltype(*std::get<1>(args).begin()), decltype(*std::get<2>(args).begin())>; 497 498 struct iterator { 499 typedef std::tuple<Iter<0>, Iter<1>, Iter<2>> IterTuple; 500 IterTuple it; 501 iterator( Iter<0> i0, Iter<1> i1, Iter<2> i2 ) : it( i0, i1, i2 ) {} 502 iterator operator++() { 503 return iterator( ++std::get<0>(it), ++std::get<1>(it), ++std::get<2>(it) ); 504 } 505 bool operator!=( const iterator &other ) const { return it != other.it; } 506 value_type operator*() const { return std::tie( *std::get<0>(it), *std::get<1>(it), *std::get<2>(it) ); } 507 }; 508 509 iterator begin() { return iterator( std::get<0>(args).begin(), std::get<1>(args).begin(), std::get<2>(args).begin() ); } 510 iterator end() { return iterator( std::get<0>(args).end(), std::get<1>(args).end(), std::get<2>(args).end() ); } 511 }; 512 513 // Helpers for the bounds checks: 514 static inline void runGroupBoundsCheck(size_t size0, size_t size1) { 515 assertf( size0 == size1, 516 "group iteration requires containers of the same size: <%zd, %zd>.", 517 size0, size1 ); 518 } 519 520 static inline void runGroupBoundsCheck(size_t size0, size_t size1, size_t size2) { 521 assertf( size0 == size1 && size1 == size2, 522 "group iteration requires containers of the same size: <%zd, %zd, %zd>.", 523 size0, size1, size2 ); 524 } 525 487 526 /// performs bounds check to ensure that all arguments are of the same length. 488 527 template< typename... Args > 489 528 group_iterate_t<Args...> group_iterate( Args &&... args ) { 490 return group_iterate_t<Args...>(false, std::forward<Args>( args )...); 529 runGroupBoundsCheck( args.size()... ); 530 return group_iterate_t<Args...>( std::forward<Args>( args )... ); 491 531 } 492 532 … … 494 534 template< typename... Args > 495 535 group_iterate_t<Args...> unsafe_group_iterate( Args &&... args ) { 496 return group_iterate_t<Args...>( true, std::forward<Args>( args )...);536 return group_iterate_t<Args...>( std::forward<Args>( args )... ); 497 537 } 498 538
Note: See TracChangeset
for help on using the changeset viewer.