Delegate parts of CSequence to a non-template implementation

To reduce build time.
This commit is contained in:
Mat Sutcliffe
2021-10-16 18:41:47 +01:00
parent 85dae5f8a4
commit 586f605d04
6 changed files with 83 additions and 9 deletions

View File

@@ -37,4 +37,14 @@
# define BLACKMISC_EXPORT_DECLARE_TEMPLATE
#endif
/*!
* \def BLACK_NO_INLINE
* Prevent function inlining
*/
#ifdef Q_CC_MSVC
#define BLACK_NO_INLINE __declspec(noinline)
#else
#define BLACK_NO_INLINE __attribute__((noinline))
#endif
#endif // guard

View File

@@ -0,0 +1,31 @@
/* Copyright (C) 2021
* swift project Community / Contributors
*
* This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level
* directory of this distribution. No part of swift project, including this file, may be copied, modified, propagated,
* or distributed except according to the terms contained in the LICENSE file.
*/
//! \file
#include "blackmisc/sequence.h"
#include <numeric>
namespace BlackMisc::Private
{
QVector<int> findIndices(int size, const std::function<bool(int)> &predicate)
{
QVector<int> result(size);
std::iota(result.begin(), result.end(), 0);
result.erase(std::remove_if(result.begin(), result.end(), std::not_fn(predicate)), result.end());
return result;
}
QVector<int> sortIndices(int size, const std::function<bool(int, int)> &cmp)
{
QVector<int> result(size);
std::iota(result.begin(), result.end(), 0);
std::sort(result.begin(), result.end(), cmp);
return result;
}
}

View File

@@ -14,12 +14,14 @@
#include "blackmisc/containerbase.h"
#include "blackmisc/mixin/mixinicon.h"
#include "blackmisc/mixin/mixindatastream.h"
#include "blackmisc/blackmiscexport.h"
#include <QVector>
#include <algorithm>
#include <type_traits>
#include <iterator>
#include <utility>
#include <initializer_list>
#include <functional>
//! \cond
#define BLACK_TEMPLATE_SEQUENCE_MIXINS(NS, T, List, Extern) \
@@ -63,6 +65,15 @@
namespace BlackMisc
{
namespace Private
{
//! \private Decouple finding from value type.
BLACKMISC_EXPORT BLACK_NO_INLINE QVector<int> findIndices(int size, const std::function<bool(int)> &predicate);
//! \private Decouple sorting from value type.
BLACKMISC_EXPORT BLACK_NO_INLINE QVector<int> sortIndices(int size, const std::function<bool(int, int)> &cmp);
}
/*!
* Generic sequential container with value semantics.
* \tparam T the type of elements contained.
@@ -306,6 +317,20 @@ namespace BlackMisc
//! Return an iterator to the first element equal to the given object, or the end iterator if not found. O(n).
const_iterator find(const T &object) const { return std::find(cbegin(), cend(), object); }
using CContainerBase<CSequence<T>>::findBy;
//! \copydoc BlackMisc::CRangeBase::findBy
template <class Predicate>
CSequence findBy(Predicate p) const
{
QVector<T> found;
for (int i : Private::findIndices(size(), [&p, this](int i) { return p((*this)[i]); }))
{
found.push_back((*this)[i]);
}
return found;
}
//! Modify by applying a value map to each element for which a given predicate returns true.
//! \return The number of elements modified.
template <class Predicate, class VariantMap>
@@ -460,7 +485,13 @@ namespace BlackMisc
//! In-place sort by a given comparator predicate.
template <class Predicate> void sort(Predicate p)
{
std::sort(begin(), end(), p);
QVector<T> temp;
temp.reserve(size());
for (int i : Private::sortIndices(size(), [&p, this](int a, int b) { return p((*this)[a], (*this)[b]); }))
{
temp.push_back(std::move((*this)[i]));
}
m_impl = std::move(temp);
}
//! In-place sort by some particular key(s).

View File

@@ -21,6 +21,10 @@ BLACK_DEFINE_SEQUENCE_MIXINS(BlackMisc::Simulation::FsCommon, CAircraftCfgEntrie
namespace BlackMisc::Simulation::FsCommon
{
CAircraftCfgEntriesList::CAircraftCfgEntriesList() = default;
CAircraftCfgEntriesList::CAircraftCfgEntriesList(const CSequence<CAircraftCfgEntries>& other) : CSequence(other) {}
bool CAircraftCfgEntriesList::containsModelWithTitle(const QString &title, Qt::CaseSensitivity caseSensitivity)
{
if (title.isEmpty()) { return false; }

View File

@@ -38,6 +38,12 @@ namespace BlackMisc::Simulation::FsCommon
BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CAircraftCfgEntriesList)
using CSequence::CSequence;
//! Default constructor.
CAircraftCfgEntriesList();
//! Construct from a base class object.
CAircraftCfgEntriesList(const CSequence<CAircraftCfgEntries> &other);
//! Contains model with title?
bool containsModelWithTitle(const QString &title, Qt::CaseSensitivity caseSensitivity = Qt::CaseInsensitive);

View File

@@ -13,14 +13,6 @@
#include "blackmisc/blackmiscexport.h"
//! \cond
#ifdef Q_CC_MSVC
#define BLACK_NO_INLINE __declspec(noinline)
#else
#define BLACK_NO_INLINE __attribute__((noinline))
#endif
//! \endcond
namespace BlackMisc::Private
{
//! \private Do nothing.