Changeset 6411b7d for src


Ignore:
Timestamp:
Nov 9, 2022, 12:22:30 PM (18 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, ast-experimental, master
Children:
271a5d3
Parents:
4da152a
Message:

Modified group_iterate_t to accept three arguments. Also, there is some refactoring to make variadic instances easier, but doesn't make that change.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r4da152a r6411b7d  
    457457// TODO: update to use variadic arguments
    458458
     459template< typename... >
     460struct group_iterate_t;
     461
    459462template< typename T1, typename T2 >
    460 struct group_iterate_t {
     463struct group_iterate_t<T1, T2> {
    461464private:
    462465        std::tuple<T1, T2> args;
    463466public:
    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) {};
    467468
    468469        typedef std::tuple<decltype(*std::get<0>(args).begin()), decltype(*std::get<1>(args).begin())> value_type;
     
    485486};
    486487
     488template< typename T1, typename T2, typename T3 >
     489struct group_iterate_t<T1, T2, T3> {
     490private:
     491        std::tuple<T1, T2, T3> args;
     492public:
     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:
     514static 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
     520static 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
    487526/// performs bounds check to ensure that all arguments are of the same length.
    488527template< typename... Args >
    489528group_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 )... );
    491531}
    492532
     
    494534template< typename... Args >
    495535group_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 )... );
    497537}
    498538
Note: See TracChangeset for help on using the changeset viewer.