Changeset 3f7e12cb for src/Common/utility.h
- Timestamp:
- Nov 8, 2017, 5:43:33 PM (8 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/utility.h
r78315272 r3f7e12cb 18 18 #include <cctype> 19 19 #include <algorithm> 20 #include <functional> 20 21 #include <iostream> 21 22 #include <iterator> … … 27 28 28 29 #include <cassert> 30 31 #include "Common/Indenter.h" 29 32 30 33 template< typename T > … … 75 78 76 79 template< typename Container > 77 void printAll( const Container &container, std::ostream &os, int indent = 0) {80 void printAll( const Container &container, std::ostream &os, Indenter indent = {} ) { 78 81 for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) { 79 82 if ( *i ) { 80 os << std::string( indent, ' ' );81 (*i)->print( os, indent + 2);83 os << indent; 84 (*i)->print( os, indent ); 82 85 // need an endl after each element because it's not easy to know when each individual item should end 83 86 os << std::endl; … … 351 354 template< typename T1, typename T2 > 352 355 struct group_iterate_t { 356 private: 357 std::tuple<T1, T2> args; 358 public: 353 359 group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) { 354 360 assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%zd, %zd>.", v1.size(), v2.size()); 355 361 }; 356 362 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 357 367 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;363 368 typedef std::tuple<T1Iter, T2Iter> IterTuple; 364 369 IterTuple it; … … 370 375 value_type operator*() const { return std::tie( *std::get<0>(it), *std::get<1>(it) ); } 371 376 }; 377 372 378 iterator begin() { return iterator( std::get<0>(args).begin(), std::get<1>(args).begin() ); } 373 379 iterator end() { return iterator( std::get<0>(args).end(), std::get<1>(args).end() ); } 374 375 private:376 std::tuple<T1, T2> args;377 380 }; 378 381
Note:
See TracChangeset
for help on using the changeset viewer.