File indexing completed on 2024-12-01 08:07:19

0001 /*
0002     SPDX-FileCopyrightText: 2020 Michail Vourlakos <mvourlakos@gmail.com>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 // local
0007 #include "generictable.h"
0008 #include "activitydata.h"
0009 #include "appletdata.h"
0010 #include "errorinformationdata.h"
0011 #include "layoutdata.h"
0012 #include "screendata.h"
0013 #include "viewdata.h"
0014 
0015 // Qt
0016 #include <QDebug>
0017 
0018 namespace Latte {
0019 namespace Data {
0020 
0021 template <class T>
0022 GenericTable<T>::GenericTable()
0023 {
0024 }
0025 
0026 template <class T>
0027 GenericTable<T>::GenericTable(GenericTable<T> &&o)
0028     : m_list(o.m_list)
0029 {
0030 
0031 }
0032 
0033 template <class T>
0034 GenericTable<T>::GenericTable(const GenericTable<T> &o)
0035     : m_list(o.m_list)
0036 {
0037 
0038 }
0039 
0040 //! Operators
0041 template <class T>
0042 GenericTable<T> &GenericTable<T>::operator=(const GenericTable<T> &rhs)
0043 {
0044     m_list = rhs.m_list;
0045 
0046     return (*this);
0047 }
0048 
0049 template <class T>
0050 GenericTable<T> &GenericTable<T>::operator=(GenericTable<T> &&rhs)
0051 {
0052     m_list = rhs.m_list;
0053     return (*this);
0054 }
0055 
0056 template <class T>
0057 GenericTable<T> &GenericTable<T>::operator<<(const T &rhs)
0058 {
0059     if (!rhs.id.isEmpty()) {
0060         m_list << rhs;
0061     }
0062 
0063     return (*this);
0064 }
0065 
0066 template <class T>
0067 GenericTable<T> &GenericTable<T>::operator<<(const GenericTable<T> &rhs)
0068 {
0069     m_list << rhs.m_list;
0070     return (*this);
0071 }
0072 
0073 template <class T>
0074 GenericTable<T> &GenericTable<T>::insert(const int &pos, const T &rhs)
0075 {
0076     m_list.insert(pos, rhs);
0077     return (*this);
0078 }
0079 
0080 template <class T>
0081 GenericTable<T> &GenericTable<T>::insertBasedOnName(const T &rhs)
0082 {
0083     return insert(sortedPosForName(rhs.name), rhs);
0084 }
0085 
0086 template <class T>
0087 GenericTable<T> &GenericTable<T>::insertBasedOnId(const T &rhs)
0088 {
0089     return insert(sortedPosForId(rhs.id), rhs);
0090 }
0091 
0092 template <class T>
0093 bool GenericTable<T>::operator==(const GenericTable<T> &rhs) const
0094 {
0095     if (m_list.count() == 0 && rhs.m_list.count() == 0) {
0096         return true;
0097     }
0098 
0099     if (m_list.count() != rhs.m_list.count()) {
0100         return false;
0101     }
0102 
0103     for(int i=0; i<m_list.count(); ++i) {
0104         QString id = m_list[i].id;
0105 
0106         if (!rhs.containsId(id) || (*this)[id] != rhs[id]){
0107             return false;
0108         }
0109     }
0110 
0111     return true;
0112 }
0113 
0114 template <class T>
0115 bool GenericTable<T>::operator!=(const GenericTable<T> &rhs) const
0116 {
0117     return !(*this == rhs);
0118 }
0119 
0120 template <class T>
0121 T &GenericTable<T>::operator[](const QString &id)
0122 {
0123     int pos{-1};
0124 
0125     for(int i=0; i<m_list.count(); ++i) {
0126         if (m_list[i].id == id){
0127             pos = i;
0128             break;
0129         }
0130     }
0131 
0132     return m_list[pos];
0133 }
0134 
0135 template <class T>
0136 const T GenericTable<T>::operator[](const QString &id) const
0137 {
0138     int pos{-1};
0139 
0140     for(int i=0; i<m_list.count(); ++i) {
0141         if (m_list[i].id == id){
0142             pos = i;
0143             break;
0144         }
0145     }
0146 
0147     return m_list[pos];
0148 }
0149 
0150 template <class T>
0151 T &GenericTable<T>::operator[](const uint &index)
0152 {
0153     return m_list[index];
0154 }
0155 
0156 template <class T>
0157 const T GenericTable<T>::operator[](const uint &index) const
0158 {
0159     return m_list[index];
0160 }
0161 
0162 template <class T>
0163 GenericTable<T>::operator QString() const
0164 {
0165     QString result;
0166 
0167     for(int i=0; i<m_list.count(); ++i) {
0168         result += m_list[i].id;
0169         if (i<(m_list.count()-1)) {
0170             result += ", ";
0171         }
0172     }
0173 
0174     return result;
0175 }
0176 
0177 template <class T>
0178 bool GenericTable<T>::containsId(const QString &id) const
0179 {
0180     for(int i=0; i<m_list.count(); ++i) {
0181         if (m_list[i].id == id){
0182             return true;
0183         }
0184     }
0185 
0186     return false;
0187 }
0188 
0189 template <class T>
0190 bool GenericTable<T>::containsName(const QString &name) const
0191 {
0192     for(int i=0; i<m_list.count(); ++i) {
0193         if (m_list[i].name == name){
0194             return true;
0195         }
0196     }
0197 
0198     return false;
0199 }
0200 
0201 template <class T>
0202 bool GenericTable<T>::isEmpty() const
0203 {
0204     return m_list.count() <= 0;
0205 }
0206 
0207 template <class T>
0208 bool GenericTable<T>::rowExists(const int &row) const
0209 {
0210     return (m_list.count()>=0 && row>=0 && row<rowCount());
0211 }
0212 
0213 template <class T>
0214 int GenericTable<T>::indexOf(const QString &id) const
0215 {
0216     for(int i=0; i<m_list.count(); ++i) {
0217         if (m_list[i].id == id){
0218             return i;
0219         }
0220     }
0221 
0222     return -1;
0223 }
0224 
0225 template <class T>
0226 int GenericTable<T>::rowCount() const
0227 {
0228     return m_list.count();
0229 }
0230 
0231 template <class T>
0232 int GenericTable<T>::sortedPosForId(const QString &id) const
0233 {
0234     int pos{0};
0235 
0236     for(int i=0; i<m_list.count(); ++i) {
0237         if (QString::compare(m_list[i].id, id, Qt::CaseInsensitive) <= 0) {
0238             pos++;
0239         } else {
0240             break;
0241         }
0242     }
0243 
0244     return pos;
0245 }
0246 
0247 template <class T>
0248 int GenericTable<T>::sortedPosForName(const QString &name) const
0249 {
0250     int pos{0};
0251 
0252     for(int i=0; i<m_list.count(); ++i) {
0253         if (QString::compare(m_list[i].name, name, Qt::CaseInsensitive) <= 0) {
0254             pos++;
0255         } else {
0256             break;
0257         }
0258     }
0259 
0260     return pos;
0261 }
0262 
0263 template <class T>
0264 QString GenericTable<T>::idForName(const QString &name) const
0265 {
0266     for(int  i=0; i<m_list.count(); ++i) {
0267         if (m_list[i].name == name) {
0268             return m_list[i].id;
0269         }
0270     }
0271 
0272     return QString();
0273 }
0274 
0275 template <class T>
0276 QStringList GenericTable<T>::ids() const
0277 {
0278     QStringList idlist;
0279 
0280     for(int i=0; i<m_list.count(); ++i) {
0281         idlist << m_list[i].id;
0282     }
0283 
0284     return idlist;
0285 }
0286 
0287 template <class T>
0288 QStringList GenericTable<T>::names() const
0289 {
0290     QStringList nms;
0291 
0292     for(int i=0; i<m_list.count(); ++i) {
0293         nms << m_list[i].name;
0294     }
0295 
0296     return nms;
0297 }
0298 
0299 template <class T>
0300 void GenericTable<T>::clear()
0301 {
0302     m_list.clear();
0303 }
0304 
0305 template <class T>
0306 void GenericTable<T>::remove(const QString &id)
0307 {
0308     const int pos = indexOf(id);
0309 
0310     if (pos >= 0) {
0311         m_list.removeAt(pos);
0312     }
0313 }
0314 
0315 template <class T>
0316 void GenericTable<T>::remove(const int &row)
0317 {
0318     if (rowExists(row)) {
0319         m_list.removeAt(row);
0320     }
0321 }
0322 
0323 //! Make linker happy and provide which table instances will be used.
0324 //! The alternative would be to move functions definitions in the header file
0325 //! but that would drop readability
0326 template class GenericTable<Data::Activity>;
0327 template class GenericTable<Data::Applet>;
0328 template class GenericTable<Data::ErrorInformation>;
0329 template class GenericTable<Data::Generic>;
0330 template class GenericTable<Data::Layout>;
0331 template class GenericTable<Data::Screen>;
0332 template class GenericTable<Data::View>;
0333 
0334 }
0335 }