diff options
author | Jonathan G Rennison <j.g.rennison@gmail.com> | 2020-01-06 17:19:24 +0000 |
---|---|---|
committer | Charles Pigott <charlespigott@googlemail.com> | 2020-01-07 09:00:45 +0000 |
commit | 150dfba95b9a6352b869804691aa6c07c83ef9df (patch) | |
tree | f187ba5bb7a393ba74cef5f08feba5b4e7656e32 | |
parent | 4cc1420beb0470ba076c5f30dbd57b05489b0b1b (diff) | |
download | openttd-150dfba95b9a6352b869804691aa6c07c83ef9df.tar.xz |
Codechange: Remove std::function from Pool iteration wrapper
Add a separate template wrapper for filtered iteration
-rw-r--r-- | src/core/pool_type.hpp | 54 | ||||
-rw-r--r-- | src/engine_base.h | 10 | ||||
-rw-r--r-- | src/network/network_admin.h | 9 |
3 files changed, 60 insertions, 13 deletions
diff --git a/src/core/pool_type.hpp b/src/core/pool_type.hpp index 035607a8f..9e6fc8fec 100644 --- a/src/core/pool_type.hpp +++ b/src/core/pool_type.hpp @@ -12,7 +12,6 @@ #include "smallvec_type.hpp" #include "enum_type.hpp" -#include <functional> /** Various types of a pool. */ enum PoolType { @@ -149,9 +148,8 @@ struct Pool : PoolBase { typedef size_t difference_type; typedef std::forward_iterator_tag iterator_category; - explicit PoolIterator(size_t index, std::function<bool(size_t)> filter = nullptr) : index(index), filter(filter) + explicit PoolIterator(size_t index) : index(index) { - if (this->filter == nullptr) this->filter = [](size_t) { return true; }; this->ValidateIndex(); }; @@ -162,8 +160,7 @@ struct Pool : PoolBase { private: size_t index; - std::function<bool(size_t)> filter; - void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index) && this->filter(this->index))) this->index++; } + void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index))) this->index++; } }; /* @@ -173,14 +170,55 @@ struct Pool : PoolBase { template <class T> struct IterateWrapper { size_t from; - std::function<bool(size_t)> filter; - IterateWrapper(size_t from = 0, std::function<bool(size_t)> filter = nullptr) : from(from), filter(filter) {} - PoolIterator<T> begin() { return PoolIterator<T>(this->from, this->filter); } + IterateWrapper(size_t from = 0) : from(from) {} + PoolIterator<T> begin() { return PoolIterator<T>(this->from); } PoolIterator<T> end() { return PoolIterator<T>(T::GetPoolSize()); } bool empty() { return this->begin() == this->end(); } }; /** + * Iterator to iterate all valid T of a pool + * @tparam T Type of the class/struct that is going to be iterated + */ + template <class T, class F> + struct PoolIteratorFiltered { + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef size_t difference_type; + typedef std::forward_iterator_tag iterator_category; + + explicit PoolIteratorFiltered(size_t index, F filter) : index(index), filter(filter) + { + this->ValidateIndex(); + }; + + bool operator==(const PoolIteratorFiltered &other) const { return this->index == other.index; } + bool operator!=(const PoolIteratorFiltered &other) const { return !(*this == other); } + T * operator*() const { return T::Get(this->index); } + PoolIteratorFiltered & operator++() { this->index++; this->ValidateIndex(); return *this; } + + private: + size_t index; + F filter; + void ValidateIndex() { while (this->index < T::GetPoolSize() && !(T::IsValidID(this->index) && this->filter(this->index))) this->index++; } + }; + + /* + * Iterable ensemble of all valid T + * @tparam T Type of the class/struct that is going to be iterated + */ + template <class T, class F> + struct IterateWrapperFiltered { + size_t from; + F filter; + IterateWrapperFiltered(size_t from, F filter) : from(from), filter(filter) {} + PoolIteratorFiltered<T, F> begin() { return PoolIteratorFiltered<T, F>(this->from, this->filter); } + PoolIteratorFiltered<T, F> end() { return PoolIteratorFiltered<T, F>(T::GetPoolSize(), this->filter); } + bool empty() { return this->begin() == this->end(); } + }; + + /** * Base class for all PoolItems * @tparam Tpool The pool this item is going to be part of */ diff --git a/src/engine_base.h b/src/engine_base.h index 1328f66a1..203d35f20 100644 --- a/src/engine_base.h +++ b/src/engine_base.h @@ -142,15 +142,21 @@ struct Engine : EnginePool::PoolItem<&_engine_pool> { uint32 GetGRFID() const; + struct EngineTypeFilter { + VehicleType vt; + + bool operator() (size_t index) { return Engine::Get(index)->type == this->vt; } + }; + /** * Returns an iterable ensemble of all valid engines of the given type * @param vt the VehicleType for engines to be valid * @param from index of the first engine to consider * @return an iterable ensemble of all valid engines of the given type */ - static Pool::IterateWrapper<Engine> IterateType(VehicleType vt, size_t from = 0) + static Pool::IterateWrapperFiltered<Engine, EngineTypeFilter> IterateType(VehicleType vt, size_t from = 0) { - return Pool::IterateWrapper<Engine>(from, [vt](size_t index) { return Engine::Get(index)->type == vt; }); + return Pool::IterateWrapperFiltered<Engine, EngineTypeFilter>(from, EngineTypeFilter{ vt }); } }; diff --git a/src/network/network_admin.h b/src/network/network_admin.h index 98dbab481..16bd57a4d 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -83,15 +83,18 @@ public: return "admin"; } + struct ServerNetworkAdminSocketHandlerFilter { + bool operator() (size_t index) { return ServerNetworkAdminSocketHandler::Get(index)->GetAdminStatus() == ADMIN_STATUS_ACTIVE; } + }; + /** * Returns an iterable ensemble of all active admin sockets * @param from index of the first socket to consider * @return an iterable ensemble of all active admin sockets */ - static Pool::IterateWrapper<ServerNetworkAdminSocketHandler> IterateActive(size_t from = 0) + static Pool::IterateWrapperFiltered<ServerNetworkAdminSocketHandler, ServerNetworkAdminSocketHandlerFilter> IterateActive(size_t from = 0) { - return Pool::IterateWrapper<ServerNetworkAdminSocketHandler>(from, - [](size_t index) { return ServerNetworkAdminSocketHandler::Get(index)->GetAdminStatus() == ADMIN_STATUS_ACTIVE; }); + return Pool::IterateWrapperFiltered<ServerNetworkAdminSocketHandler, ServerNetworkAdminSocketHandlerFilter>(from, ServerNetworkAdminSocketHandlerFilter{}); } }; |