Ignore:
Timestamp:
Nov 8, 2017, 5:43:33 PM (8 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
954908d
Parents:
78315272 (diff), e35f30a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r78315272 r3f7e12cb  
    1818#include <cctype>
    1919#include <algorithm>
     20#include <functional>
    2021#include <iostream>
    2122#include <iterator>
     
    2728
    2829#include <cassert>
     30
     31#include "Common/Indenter.h"
    2932
    3033template< typename T >
     
    7578
    7679template< typename Container >
    77 void printAll( const Container &container, std::ostream &os, int indent = 0 ) {
     80void printAll( const Container &container, std::ostream &os, Indenter indent = {} ) {
    7881        for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) {
    7982                if ( *i ) {
    80                         os << std::string( indent,  ' ' );
    81                         (*i)->print( os, indent + 2 );
     83                        os << indent;
     84                        (*i)->print( os, indent );
    8285                        // need an endl after each element because it's not easy to know when each individual item should end
    8386                        os << std::endl;
     
    351354template< typename T1, typename T2 >
    352355struct group_iterate_t {
     356private:
     357        std::tuple<T1, T2> args;
     358public:
    353359        group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) {
    354360                assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%zd, %zd>.", v1.size(), v2.size());
    355361        };
    356362
     363        typedef std::tuple<decltype(*std::get<0>(args).begin()), decltype(*std::get<1>(args).begin())> value_type;
     364        typedef decltype(std::get<0>(args).begin()) T1Iter;
     365        typedef decltype(std::get<1>(args).begin()) T2Iter;
     366
    357367        struct iterator {
    358                 typedef typename std::remove_reference<T1>::type T1val;
    359                 typedef typename std::remove_reference<T2>::type T2val;
    360                 typedef std::tuple<typename T1val::value_type &, typename T2val::value_type &> value_type;
    361                 typedef typename T1val::iterator T1Iter;
    362                 typedef typename T2val::iterator T2Iter;
    363368                typedef std::tuple<T1Iter, T2Iter> IterTuple;
    364369                IterTuple it;
     
    370375                value_type operator*() const { return std::tie( *std::get<0>(it), *std::get<1>(it) ); }
    371376        };
     377
    372378        iterator begin() { return iterator( std::get<0>(args).begin(), std::get<1>(args).begin() ); }
    373379        iterator end() { return iterator( std::get<0>(args).end(), std::get<1>(args).end() ); }
    374 
    375 private:
    376         std::tuple<T1, T2> args;
    377380};
    378381
Note: See TracChangeset for help on using the changeset viewer.