// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file tools.license for terms.

#ifndef tools_forit
#define tools_forit

#define tools_vforcit(a__T,a__v,a__it) \
  for(std::vector< a__T >::const_iterator a__it = (a__v).begin();(a__it)!=(a__v).end();++(a__it))

#define tools_vforcit_beg(a__T,a__v,a__beg,a__it) \
  for(std::vector< a__T >::const_iterator a__it = a__beg;(a__it)!=(a__v).end();++(a__it))

#define tools_vforit(a__T,a__v,a__it) \
  for(std::vector< a__T >::iterator a__it = (a__v).begin();(a__it)!=(a__v).end();++(a__it))

#define tools_vforcrit(a__T,a__v,a__it) \
  for(std::vector< a__T >::const_reverse_iterator a__it = (a__v).rbegin();(a__it)!=(a__v).rend();++(a__it))

#define tools_vforrit(a__T,a__v,a__it) \
  for(std::vector< a__T >::reverse_iterator a__it = (a__v).rbegin();(a__it)!=(a__v).rend();++(a__it))

#define tools_vforcit_npp(a__T,a__v,a__it) \
  for(std::vector< a__T >::const_iterator a__it = (a__v).begin();(a__it)!=(a__v).end();)

#define tools_vforit_npp(a__T,a__v,a__it) \
  for(std::vector< a__T >::iterator a__it = (a__v).begin();(a__it)!=(a__v).end();)

#define tools_typename_vforcit(a__T,a__v,a__it) \
  for(typename std::vector< a__T >::const_iterator a__it = (a__v).begin();(a__it)!=(a__v).end();++(a__it))

#define tools_typename_vforit(a__T,a__v,a__it) \
  for(typename std::vector< a__T >::iterator a__it = (a__v).begin();(a__it)!=(a__v).end();++(a__it))

#define tools_sforcit(a__s,a__it) \
  for(std::string::const_iterator a__it = (a__s).begin();(a__it)!=(a__s).end();++(a__it))

#define tools_sforit(a__s,a__it) \
  for(std::string::iterator a__it = (a__s).begin();(a__it)!=(a__s).end();++(a__it))

#define tools_lforcit(a__T,a__l,a__it) \
  for(std::list< a__T >::const_iterator a__it = (a__l).begin();(a__it)!=(a__l).end();++(a__it))

#define tools_lforit(a__T,a__l,a__it) \
  for(std::list< a__T >::iterator a__it = (a__l).begin();(a__it)!=(a__l).end();++(a__it))

#define tools_lforit_npp(a__T,a__v,a__it) \
  for(std::list< a__T >::iterator a__it = (a__v).begin();(a__it)!=(a__v).end();)

#define tools_mforcit(a__K,a__V,a__m,a__it) \
  for(std::map< a__K , a__V >::const_iterator a__it = (a__m).begin();(a__it)!=(a__m).end();++(a__it))

#define tools_mforit(a__K,a__V,a__m,a__it) \
  for(std::map< a__K , a__V >::iterator a__it = (a__m).begin();(a__it)!=(a__m).end();++(a__it))

#define tools_typename_mforcit(a__K,a__V,a__m,a__it) \
  for(typename std::map< a__K, a__V >::const_iterator a__it = (a__m).begin();(a__it)!=(a__m).end();++(a__it))

#define tools_typename_mforit(a__K,a__V,a__m,a__it) \
  for(typename std::map< a__K, a__V >::iterator a__it = (a__m).begin();(a__it)!=(a__m).end();++(a__it))

#endif

