22 std::copy_n (s, N,
Chars_);
26 template<Literal RoleArg, auto GetterArg>
29 static constexpr auto Getter = GetterArg;
30 static constexpr auto Role = RoleArg;
33 template<Literal RoleArg, auto GetterArg>
43 const QVector<FieldGetter_t> Fields_;
44 const QHash<int, QByteArray> Roles_;
46 template<
typename... Fields>
49 ,
Fields_ { +[] (
const T& t) -> QVariant {
return t.*(Fields::Getter); }... }
50 , Roles_ { MakeRoles ({ QByteArray { Fields::Role.Chars_ }... }) }
59 QVariant
GetData (
int row,
int,
int role)
const override
61 if (
const auto getter =
Fields_.value (role - this->DataRole - 1))
62 return getter (this->
Items_.at (row));
66 QHash<int, QByteArray> MakeRoles (QVector<QByteArray> fields)
const
69 result.reserve (result.size () + fields.size ());
70 for (
int i = 0; i < fields.size (); ++i)
71 result [this->
DataRole + i + 1] = std::move (fields [i]);
QModelIndex parent(const QModelIndex &) const override
static constexpr auto DataRole
QVariant GetData(int row, int, int role) const override
QVariant(*)(const T &) FieldGetter_t
QHash< int, QByteArray > roleNames() const override
QVector< QPair< QByteArray, FieldGetter_t > > FieldsList_t
RoledItemsModel(QObject *parent, Fields...) noexcept
RoledMemberField< RoleArg, GetterArg > RoledMemberField_v
constexpr Literal(const char(&s)[N])
static constexpr auto Getter
static constexpr auto Role