#ifndef UTIL_FOREACH_H
#define UTIL_FOREACH_H

// defines a simple little foreach macro

#define foreach(ITERATOR, CONTAINER) \
for( typeof(CONTAINER.begin()) ITERATOR = CONTAINER.begin(), \
     FOREACH_END = CONTAINER.end(); \
     ITERATOR != FOREACH_END; \
     ++ITERATOR )

// foreachelt is similar to foreach but gives you the element to work with; however,
// you have to be aware that if you try to foreachelt() with the same ELTNAME in one
// block, you'll get variable redefine errors

template< class T >
bool foreachelt_assign( T& A, T& B ) { A = B; return 1; }

#define foreachelt(ELTNAME, CONTAINER) \
typeof(* CONTAINER.begin()) ELTNAME; \
for( typeof(CONTAINER.begin()) ITERATOR = CONTAINER.begin(), \
     FOREACH_END = CONTAINER.end(); \
     (ITERATOR != FOREACH_END) && (foreachelt_assign( ELTNAME, *ITERATOR )); \
     ++ITERATOR )

#endif
