| |
ru:toolworks:docs:apparatus:filter [2021/06/15 14:46] – создано + переведено. Требует проверки. Статья кстати интересная, но непонятно, что такое загруженные сущности jispar | ru:toolworks:docs:apparatus:filter [2022/01/05 15:13] (текущий) – обновил в соответствии с англоязычной версией jispar |
---|
====== Фильтры ====== | ====== Фильтры ====== |
| |
Фильтры предоставляют возможность сужать процесс итерирования до сущностей и объектов типа "сущностный", обладающих только заданными комбинациями трейтов и деталей. Фильтрация может быть как включающей (позитивной), так и исключающей (негативной). Включение означает, что сущность (или объект сущностного типа) определённо должен содержать трейты (или детали) из списка. Исключение означает противоположное - сущность должна *не* иметь выбранные элементы. | //Примеч.: деталь или трейт сущности или сущностного объекта в этой статье будем называть Part (Компонентом).// |
| |
Оба указанных способа могут и должны быть использованы друг с другом. Помните, что Apparatus сильно оптимизирован для всех типов фильров, он не выполняет поэтапный поиск, а использует быстрые процедуры сравнения масок. Грубо говоря, тестирование одного фильтра, состоящего из 100 деталей, будет таким же, как если бы он содержал в себе одну. | Фильтры предоставляют возможность сужать процесс [[ru:toolworks:docs:apparatus:iterating|итерирования]] (или [[ru:toolworks:docs:apparatus:operating|оперирования]]) до сущностей и сущностных объектов, обладающих только заданными комбинациями компонентов. Спецификация фильтра представлена специальной структурой, называемой //Filter//. |
| Фильтрация может быть как включающей (позитивной), так и исключающей (негативной). В Аппарате вы можете комбинировать любые типы компонентов, т.е. как трейты, так и детали могут быть __одновременно использованы__ в одном фильтре. |
| |
===== Организация в C++ ===== | ===== Включение ===== |
| |
Вы создаёте инстанцию [[appi>struct_f_fingerprint.html|FFingerprint]]-а. Есть несколько разных конструкторов и методов, доступных для этой структуры, и вы можете использовать всё, что будет пригодно в конкретном случае. Например, давайте создадим фильтр одного трейта и одной детали, действительного только для загруженных (Booted /* не понял, что это такое, неплохо бы статью про это */) сущностей:<code cpp> | Включение означает, что сущность (или сущностный объект) определённо должен содержать указанный компонент, чтобы фильтр отобрал её (его) для обработки механикой. Фильтр по включению для деталей поддерживает наследование, поэтому если вы активируете включение базового класса детали в фильтре, то детали-потомки указанной детали будут включены в обработку механикой. |
#include "Filter.h" | |
| |
... | ===== Исключение ===== |
| |
FFilter MyFilter(EBootFilter::Booted); | Исключение означает противоположное. Сущность (или сущностный объект) должен __не__ содержать в себе указанный компонент, чтобы фильтр её (его) отобрал для обработки механикой. |
Filter += UMyDetail::StaticClass(); | |
Filter += FMyTrait::StaticStruct(); | |
</code> | |
| |
Теперь вы можете использовать собранный фильтр, чтобы объединять в цепи ремни и чанки и итерироваться по ним. | Оба указанных способа могут и должны быть использованы друг с другом. Помните, что Аппарат сильно оптимизирован для всех типов фильтров, он не выполняет поэтапный поиск, а использует быстрые процедуры сравнения масок. Грубо говоря, тестирование одного фильтра, состоящего из 100 деталей, будет таким же, как если бы он содержал в себе одну. |
| |
| ===== Организация в C++ ===== |
| |
| Вы создаёте инстанцию [[appi>struct_f_filter.html|FFilter]]-а. Есть несколько разных конструкторов и методов, доступных для этой структуры, и вы можете использовать всё, что будет пригодно в конкретном случае. Например, давайте создадим фильтр одного трейта и одной детали: |
| <code cpp> |
| FFilter MyFilter = FFilter::Make<UMyDetail, FMyTrait>(); |
| </code> |
| |
| Теперь вы можете использовать собранный фильтр, чтобы [[ru:toolworks:docs:apparatus:enchaining|объединять в цепи]] ремни и чанки и итерироваться по ним. |