Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 9a1e509e6ded571c2f6355253b2c7bfa0b4a2340)
+++ src/Common/utility.h	(revision 6d267ca6bdc59bcd82cb15c2629c927f34392457)
@@ -310,6 +310,6 @@
 template< typename T1, typename T2 >
 struct group_iterate_t {
-	group_iterate_t( const T1 & v1, const T2 & v2 ) : args(v1, v2) {
-		assertf(v1.size() == v2.size(), "group iteration requires containers of the same size.");
+	group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) {
+		assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%u, %u>.", v1.size(), v2.size());
 	};
 
@@ -336,7 +336,14 @@
 };
 
+/// performs bounds check to ensure that all arguments are of the same length.
 template< typename... Args >
 group_iterate_t<Args...> group_iterate( Args &&... args ) {
-	return group_iterate_t<Args...>(std::forward<Args>( args )...);
+	return group_iterate_t<Args...>(false, std::forward<Args>( args )...);
+}
+
+/// does not perform a bounds check - requires user to ensure that iteration terminates when appropriate.
+template< typename... Args >
+group_iterate_t<Args...> unsafe_group_iterate( Args &&... args ) {
+	return group_iterate_t<Args...>(true, std::forward<Args>( args )...);
 }
 
