Changes in src/Common/utility.h [6b0b624:b1bead1]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/utility.h
r6b0b624 rb1bead1 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jul 21 22:19:13 2017 13 // Update Count : 33 14 // 15 16 #pragma once 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri May 5 11:03:00 2017 13 // Update Count : 32 14 // 15 16 #ifndef _UTILITY_H 17 #define _UTILITY_H 17 18 18 19 #include <cctype> … … 24 25 #include <sstream> 25 26 #include <string> 27 #include <type_traits> 26 28 27 29 #include <cassert> … … 304 306 // for ( val : group_iterate( container1, container2, ... ) ) {} 305 307 // syntax to have a for each that iterates multiple containers of the same length 306 // TODO: update to use variadic arguments , perfect forwarding308 // TODO: update to use variadic arguments 307 309 308 310 template< typename T1, typename T2 > 309 311 struct group_iterate_t { 310 group_iterate_t( const T1 & v1, const T2 & v2 ) : args(v1, v2) {311 assertf( v1.size() == v2.size(), "group iteration requires containers of the same size.");312 group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) { 313 assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%lu, %lu>.", v1.size(), v2.size()); 312 314 }; 313 315 314 316 struct iterator { 315 typedef std::tuple<typename T1::value_type, typename T2::value_type> value_type; 316 typedef typename T1::iterator T1Iter; 317 typedef typename T2::iterator T2Iter; 317 typedef typename std::remove_reference<T1>::type T1val; 318 typedef typename std::remove_reference<T2>::type T2val; 319 typedef std::tuple<typename T1val::value_type &, typename T2val::value_type &> value_type; 320 typedef typename T1val::iterator T1Iter; 321 typedef typename T2val::iterator T2Iter; 318 322 typedef std::tuple<T1Iter, T2Iter> IterTuple; 319 323 IterTuple it; … … 323 327 } 324 328 bool operator!=( const iterator &other ) const { return it != other.it; } 325 value_type operator*() const { return std:: make_tuple( *std::get<0>(it), *std::get<1>(it) ); }329 value_type operator*() const { return std::tie( *std::get<0>(it), *std::get<1>(it) ); } 326 330 }; 327 331 iterator begin() { return iterator( std::get<0>(args).begin(), std::get<1>(args).begin() ); } … … 332 336 }; 333 337 338 /// performs bounds check to ensure that all arguments are of the same length. 334 339 template< typename... Args > 335 group_iterate_t<Args...> group_iterate( const Args &... args ) { 336 return group_iterate_t<Args...>(args...); 340 group_iterate_t<Args...> group_iterate( Args &&... args ) { 341 return group_iterate_t<Args...>(false, std::forward<Args>( args )...); 342 } 343 344 /// does not perform a bounds check - requires user to ensure that iteration terminates when appropriate. 345 template< typename... Args > 346 group_iterate_t<Args...> unsafe_group_iterate( Args &&... args ) { 347 return group_iterate_t<Args...>(true, std::forward<Args>( args )...); 337 348 } 338 349 … … 375 386 } 376 387 388 #endif // _UTILITY_H 389 377 390 // Local Variables: // 378 391 // tab-width: 4 //
Note: See TracChangeset
for help on using the changeset viewer.