KUMI v5.0.0
Gorgeous Garnet
Loading...
Searching...
No Matches
The C++20 Compact Tuple Tools

KUMI is a fancy C++20 implementation of a tuple-like class. It tries to be as close to std::tuple as possible but also wants to compile faster, uses a better C++20 oriented interface, and new features like:

  • A fast to compile tuple implementation
  • Quality of life improvement over the standard tuple implementation
  • A protocol to adapt user-defined type to act as tuples
  • Algorithm on tuples
  • Record type handling

Examples

  • Tuple

    #include <iostream>
    #include <kumi/kumi.hpp>
    auto get_student(int id)
    {
    if (id == 0) return kumi::make_tuple(3.8, 'A', "Lisa Simpson");
    else if (id == 1) return kumi::make_tuple(2.9, 'C', "Milhouse Van Houten");
    else if (id == 2) return kumi::make_tuple(1.7, 'D', "Ralph Wiggum");
    else return kumi::make_tuple(0. , 'F', "Unknown");
    }
    int main()
    {
    auto student0 = get_student(0);
    std::cout << "ID: 0, "
    << "GPA: " << kumi::get<0>(student0) << ", "
    << "grade: " << kumi::get<1>(student0) << ", "
    << "name: " << kumi::get<2>(student0) << '\n';
    auto [ gpa1, grade1, name1 ] = get_student(1);
    std::cout << "ID: 1, "
    << "GPA: " << gpa1 << ", "
    << "grade: " << grade1 << ", "
    << "name: " << name1 << '\n';
    std::cout << "\n";
    auto all_students = kumi::make_tuple(get_student(0),get_student(1),get_student(2));
    kumi::for_each_index( [](auto i, auto const& m) {
    std::cout << "Data #" << i << " : " << m << "\n";
    }
    , all_students
    );
    std::cout << "\n";
    auto grades = kumi::get<0>(kumi::transpose(all_students));
    std::cout << grades << "\n";
    }
    constexpr transpose_t transpose
    Callable object transposing a product type of product types by shifting elements in their transposed ...
    Definition transpose.hpp:96
    constexpr for_each_index_t for_each_index
    Callable object applying the Callable object f on each element of a product type and its index.
    Definition for_each.hpp:177
    decltype(auto) constexpr get(record< Ts... > &r) noexcept
    Extracts the Ith field from a kumi::record.
    Definition record.hpp:766
  • Record

    #include <iostream>
    #include <kumi/kumi.hpp>
    using namespace kumi::literals;
    auto get_student(int id)
    {
    if (id == 0) return kumi::make_record("GPA"_id = 3.8, "grade"_id = 'A');
    else if (id == 1) return kumi::make_record("GPA"_id = 2.9, "grade"_id = 'C');
    else if (id == 2) return kumi::make_record("GPA"_id = 1.7, "grade"_id = 'D');
    else return kumi::make_record("GPA"_id = 0. , "grade"_id = 'F');
    }
    int main()
    {
    auto student0 = get_student(0);
    std::cout << "ID: 0, "
    << "GPA: " << kumi::get<"GPA">(student0) << ", "
    << "grade: " << kumi::get<"grade">(student0) << '\n';
    auto [ gpa1, grade1 ] = get_student(1);
    std::cout << "ID: 1, "
    << gpa1 << ", "
    << grade1 << '\n';
    std::cout << "\n";
    auto all_students = kumi::make_record(
    "Lisa Simpson"_id = get_student(0),
    "Milhouse Van Houten"_id = get_student(1),
    "Ralph Wiggum"_id = get_student(2)
    );
    kumi::for_each_field( [](auto name, auto const& m) {
    std::cout << "Student: " << name << ", Data : " << m << "\n";
    }
    , all_students
    );
    std::cout << "\n";
    }
    constexpr for_each_field_t for_each_field
    Callable object applying the Callable object f on each element of a product type and its field.
    Definition for_each.hpp:223
    Compile-time text based identifier.
    Definition identifier.hpp:162

Licence

This library is licensed under the Boost Software License. The full license text is available on the Licence page.