//********************************************************
// The following code example is taken from the book
//  C++23 - The Complete Guide
//  by Nicolai M. Josuttis (www.josuttis.com)
//  https://www.cppstd23.com
//
// The code is licensed under a
//  Creative Commons Attribution 4.0 International License
//  https://creativecommons.org/licenses/by/4.0/
//********************************************************


#include <print>
#include <vector>
#include <map>
#include <utility>   // for std::pair
#include <ranges>

void printPairRange(auto&& rg)
{
  std::println(" default:   {}", rg);
  std::println(" {{:m}} :     {:m}", rg);
  std::println(" {{::m}} :    {::m}", rg);
  std::println(" {{::n}} :    {::n}", rg);
  std::println(" {{:n}} :     {:n}", rg);
  std::println(" {{:n:m}} :   {:n:m}", rg);
  std::println(" {{:n:n}} :   {:n:n}", rg);
}

int main()
{
  // ranges of pairs:
  std::println("map<int, char>:");
  std::map<int, char> map{{1, 'a'}, {2, 'b'}, {3, 'c'}};
  printPairRange(map);

  std::println("\nView on map:<int, char>");
  printPairRange(map | std::views::all);

  std::println("\nvector<pair<int, char>>:");
  std::vector<std::pair<int, char>> vecp{{1, 'a'}, {2, 'b'}, {3, 'c'}};
  printPairRange(vecp);
}

