Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r4639b0d r2e30d47  
    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;
     
    278281};
    279282
     283template< typename aT >
     284struct FuncGuard {
     285        aT m_after;
     286
     287        template< typename bT >
     288        FuncGuard( bT before, aT after ) : m_after( after ) {
     289                before();
     290        }
     291
     292        ~FuncGuard() {
     293                m_after();
     294        }
     295};
     296
     297template< typename bT, typename aT >
     298FuncGuard<aT> makeFuncGuard( bT && before, aT && after ) {
     299        return FuncGuard<aT>( std::forward<bT>(before), std::forward<aT>(after) );
     300}
     301
    280302template< typename T >
    281303struct ValueGuardPtr< std::list< T > > {
     
    332354template< typename T1, typename T2 >
    333355struct group_iterate_t {
     356private:
     357        std::tuple<T1, T2> args;
     358public:
    334359        group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) {
    335360                assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%zd, %zd>.", v1.size(), v2.size());
    336361        };
    337362
     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
    338367        struct iterator {
    339                 typedef typename std::remove_reference<T1>::type T1val;
    340                 typedef typename std::remove_reference<T2>::type T2val;
    341                 typedef std::tuple<typename T1val::value_type &, typename T2val::value_type &> value_type;
    342                 typedef typename T1val::iterator T1Iter;
    343                 typedef typename T2val::iterator T2Iter;
    344368                typedef std::tuple<T1Iter, T2Iter> IterTuple;
    345369                IterTuple it;
     
    351375                value_type operator*() const { return std::tie( *std::get<0>(it), *std::get<1>(it) ); }
    352376        };
     377
    353378        iterator begin() { return iterator( std::get<0>(args).begin(), std::get<1>(args).begin() ); }
    354379        iterator end() { return iterator( std::get<0>(args).end(), std::get<1>(args).end() ); }
    355 
    356 private:
    357         std::tuple<T1, T2> args;
    358380};
    359381
Note: See TracChangeset for help on using the changeset viewer.