Commit 513dbb6b by maarten

speed up iterators

git-svn-id: svn+ssh://gitlab/srv/svn-repos/pdb-redo/trunk@501 a1961a4f-ab94-4bcc-80e8-33b5a54de466
parent 77e0b3f7
...@@ -117,8 +117,6 @@ struct ItemValue; ...@@ -117,8 +117,6 @@ struct ItemValue;
class Item class Item
{ {
public: public:
typedef enum { notApplicable, notDefined, text, number } ItemContentType;
Item() {} Item() {}
template<typename T> template<typename T>
Item(const string& name, const T& value); Item(const string& name, const T& value);
...@@ -191,9 +189,9 @@ class Datablock ...@@ -191,9 +189,9 @@ class Datablock
public: public:
friend class File; friend class File;
typedef std::list<Category> CategoryList; using CategoryList = std::list<Category>;
typedef CategoryList::iterator iterator; using iterator = CategoryList::iterator;
typedef CategoryList::const_iterator const_iterator; using const_iterator = CategoryList::const_iterator;
Datablock(const string& name); Datablock(const string& name);
~Datablock(); ~Datablock();
...@@ -1042,7 +1040,7 @@ inline Condition Not(Condition&& cond) ...@@ -1042,7 +1040,7 @@ inline Condition Not(Condition&& cond)
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// iterators // iterators
template<typename RowType> template<typename RowType, typename ConditionType = void>
class iterator_impl class iterator_impl
{ {
public: public:
...@@ -1056,11 +1054,11 @@ class iterator_impl ...@@ -1056,11 +1054,11 @@ class iterator_impl
iterator_impl(ItemRow* data) : mCurrent(data) {} iterator_impl(ItemRow* data) : mCurrent(data) {}
iterator_impl(ItemRow* data, Category& cat, const Condition& cond) template<typename T, std::enable_if_t<std::is_same_v<ConditionType,T>, int> = 0>
iterator_impl(ItemRow* data, Category& cat, const T& cond)
: mCurrent(data), mCat(&cat), mCondition(&cond) : mCurrent(data), mCat(&cat), mCondition(&cond)
{ {
while (mCurrent and not cond(cat, mCurrent)) skip();
mCurrent.next();
} }
virtual ~iterator_impl() = default; virtual ~iterator_impl() = default;
...@@ -1070,10 +1068,8 @@ class iterator_impl ...@@ -1070,10 +1068,8 @@ class iterator_impl
iterator_impl& operator++() iterator_impl& operator++()
{ {
do mCurrent.next();
{ skip();
mCurrent.next();
} while (mCurrent and mCondition != nullptr and not mCondition->operator()(*mCat, mCurrent));
return *this; return *this;
} }
...@@ -1084,17 +1080,26 @@ class iterator_impl ...@@ -1084,17 +1080,26 @@ class iterator_impl
bool operator!=(const iterator_impl& rhs) const { return not (mCurrent == rhs.mCurrent); } bool operator!=(const iterator_impl& rhs) const { return not (mCurrent == rhs.mCurrent); }
private: private:
void skip()
{
if constexpr (not std::is_void_v<ConditionType>)
{
while (mCurrent and not (*mCondition)(*mCat, mCurrent))
mCurrent.next();
}
}
Row mCurrent; Row mCurrent;
Category* mCat = nullptr; Category* mCat = nullptr;
const Condition* mCondition = nullptr; const Condition* mCondition = nullptr;
}; };
template<typename RowType> template<typename RowType>
class conditional_iterator_proxy class conditional_iterator_proxy
{ {
public: public:
using iterator = iterator_impl<RowType>; using iterator = iterator_impl<RowType,Condition>;
using reference = typename iterator::reference; using reference = typename iterator::reference;
conditional_iterator_proxy(ItemRow* head, Category& cat, Condition&& cond) conditional_iterator_proxy(ItemRow* head, Category& cat, Condition&& cond)
...@@ -1149,8 +1154,6 @@ class RowSet : public vector<Row> ...@@ -1149,8 +1154,6 @@ class RowSet : public vector<Row>
Category* mCat; Category* mCat;
}; };
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// class Category acts as an STL container for Row objects // class Category acts as an STL container for Row objects
......
...@@ -88,7 +88,6 @@ void ItemValue::operator delete(void* p) ...@@ -88,7 +88,6 @@ void ItemValue::operator delete(void* p)
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------
// itemColumn contains info about a column or field in a Category // itemColumn contains info about a column or field in a Category
struct ItemColumn struct ItemColumn
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment