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


#include <print>
#include <string>
#include <vector>
#include <set>
#include <ranges>
#include <algorithm>

class Person
{
 private:
  std::string _name;
 public:
  Person(const std::string& s = {}) : _name{s} {}
  Person(const char* s) : _name{s} {}

  bool operator<(const Person& p) const {
    std::println("- compare {} with {}", _name, p._name);
    return _name < p._name;
  }

  auto name() const { return _name;}
  auto size() const { return _name.size();}
};

int main()
{
  std::vector<Person> coll{"Rome", "Berlin", "Kiev", "LA", "Tokyo", "Cairo"};

  std::println("*** init view:");
  auto v = coll
            | std::views::filter([] (auto p) { return p.size() > 2; })  // significant size
            | std::ranges::to<std::multiset>()                          // sorted
            | std::views::drop(1)                                       // skip first 
            ; 

  std::println("*** use view:"); 
  for (const auto& p : v) {
    std::print("{} ", p.name());
  };
  std::print("\n");
}

