// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma // de Barcelona (UAB). // // This work is licensed under the terms of the MIT license. // For a copy, see . #pragma once #include namespace carla { namespace iterator { /// Creates an iterator over non-const references to the keys of a map. template inline static auto make_map_keys_iterator(It it) { using first_value_type = typename It::value_type::first_type; using decay_first_value_type = typename std::remove_cv_t>; using ref_to_first = decay_first_value_type &; return boost::make_transform_iterator(it, [](auto &pair) -> ref_to_first { return pair.first; }); } /// Creates an iterator over const references to the keys of a map. template inline static auto make_map_keys_const_iterator(It it) { using first_value_type = typename It::value_type::first_type; using decay_first_value_type = typename std::remove_cv_t>; using const_ref_to_first = const decay_first_value_type &; return boost::make_transform_iterator(it, [](const auto &pair) -> const_ref_to_first { return pair.first; }); } /// Creates an iterator over non-const references to the values of a map. template inline static auto make_map_values_iterator(It it) { using second_value_type = typename It::value_type::second_type; using decay_second_value_type = typename std::remove_cv_t>; using ref_to_second = decay_second_value_type &; return boost::make_transform_iterator(it, [](auto &pair) -> ref_to_second { return pair.second; }); } /// Creates an iterator over const references to the values of a map. template inline static auto make_map_values_const_iterator(It it) { using second_value_type = typename It::value_type::second_type; using decay_second_value_type = typename std::remove_cv_t>; using const_ref_to_second = const decay_second_value_type &; return boost::make_transform_iterator(it, [](const auto &pair) -> const_ref_to_second { return pair.second; }); } } // namespace iterator } // namespace carla