/// \file // Range v3 library // // Copyright Eric Niebler 2014-present // // Use, modification and distribution is subject to the // Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // Project home: https://github.com/ericniebler/range-v3 // #ifndef RANGES_V3_RANGE_FOR_HPP #define RANGES_V3_RANGE_FOR_HPP #include #include #if RANGES_CXX_RANGE_BASED_FOR < RANGES_CXX_RANGE_BASED_FOR_17 /// A range-based for macro, basically a hack until the built-in range-for can handle /// Ranges that have a different type for begin and end. \ingroup range-core #define RANGES_FOR(VAR_DECL, ...) \ if(bool CPP_PP_CAT(_range_v3_done, __LINE__) = false) {} \ else \ for(auto && CPP_PP_CAT(_range_v3_rng, __LINE__) = (__VA_ARGS__); \ !CPP_PP_CAT(_range_v3_done, __LINE__);) \ for(auto CPP_PP_CAT(_range_v3_begin, __LINE__) = \ ranges::begin(CPP_PP_CAT(_range_v3_rng, __LINE__)); \ !CPP_PP_CAT(_range_v3_done, __LINE__); \ CPP_PP_CAT(_range_v3_done, __LINE__) = true) \ for(auto CPP_PP_CAT(_range_v3_end, __LINE__) = \ ranges::end(CPP_PP_CAT(_range_v3_rng, __LINE__)); \ !CPP_PP_CAT(_range_v3_done, __LINE__) && \ CPP_PP_CAT(_range_v3_begin, __LINE__) != \ CPP_PP_CAT(_range_v3_end, __LINE__); \ ++CPP_PP_CAT(_range_v3_begin, __LINE__)) \ if(!(CPP_PP_CAT(_range_v3_done, __LINE__) = true)) {} \ else \ for(VAR_DECL = *CPP_PP_CAT(_range_v3_begin, __LINE__); \ CPP_PP_CAT(_range_v3_done, __LINE__); \ CPP_PP_CAT(_range_v3_done, __LINE__) = false) \ /**/ #else #define RANGES_FOR(VAR_DECL, ...) for(VAR_DECL : (__VA_ARGS__)) #endif #endif