ru:toolworks:docs:apparatus:operating

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
ru:toolworks:docs:apparatus:operating [2021/09/01 23:24] – создано + переведено jisparru:toolworks:docs:apparatus:operating [2022/06/08 21:00] (текущий) – обновил в соответствии с англоязычной версией jispar
Строка 3: Строка 3:
 Более новый и функциональный способ оперировать над Цепями через процесс, называемый //оперирование// (operating). Более новый и функциональный способ оперировать над Цепями через процесс, называемый //оперирование// (operating).
  
-===== Написание кода в C++  =====+===== Организация в C++  =====
  
 ==== Использование лямбда-выражений ==== ==== Использование лямбда-выражений ====
Строка 9: Строка 9:
 Можно легко оперировать над Цепями через C++ лямбды и вот как следует это делать: Можно легко оперировать над Цепями через C++ лямбды и вот как следует это делать:
 <code cpp> <code cpp>
-Chain->Operate([](const FChain::FCursor& Cursor, FMyTrait Trait)+Chain->Operate([](FMyTrait Trait)
 { {
     ...     ...
Строка 15: Строка 15:
 </code> </code>
  
-Тип курсора должен соответствовать типу использованной цепи ([[ru:toolworks:docs:apparatus:solidity|твердотельность/текучесть]]). 
 Обратите внимание, что вам не позволяется получать ссылку на трейт, если вы итерируетесь по не-твердотельной цепи, - разрешено только копирование. Обратите внимание, что вам не позволяется получать ссылку на трейт, если вы итерируетесь по не-твердотельной цепи, - разрешено только копирование.
 Итак, оперировать над твердотельной Цепью вам следует следующим образом: Итак, оперировать над твердотельной Цепью вам следует следующим образом:
 <code cpp> <code cpp>
-SolidChain->Operate([](const FSolidChain::FCursor& Cursor, FMyTrait& Trait)+SolidChain->Operate([](FMyTrait& Trait)
 { {
     ...     ...
Строка 36: Строка 35:
  
 <code cpp> <code cpp>
-SolidChain->OperateConcurrently([](const FSolidChain::FCursor& Cursor, FMyTrait& Trait)+SolidChain->OperateConcurrently([](FMyTrait& Trait)
 { {
     ...     ...
Строка 43: Строка 42:
  
 Второй параметр помогает ограничить количество потоков. Если слишком мало доступных слотов, излишние потоки не понадобятся и они не будут помещены в очередь. Второй параметр помогает ограничить количество потоков. Если слишком мало доступных слотов, излишние потоки не понадобятся и они не будут помещены в очередь.
 +
 +==== Доставка аргументов ====
 +
 +Хорошая особенность оперирования - это то, что аргументы функции решаются и доставляются автоматически в вашу логику.
 +Например, если вы также модифицировали текущую сущность итерирования, то просто укажите хэндлер в самом начале кода:
 +<code cpp>
 +Chain->Operate([](FSubjectHandle Subject, FMyTrait Trait)
 +{
 +    ...
 +});
 +</code>
 +Это, конечно, должно соответствовать твердотельности цепи. Для твердотельной цепи код выглядит так:
 +<code cpp>
 +SolidChain->Operate([](FSolidSubjectHandle Subject, FMyTrait& Trait)
 +{
 +    ...
 +});
 +</code>
 +
 +Вы можете запрашивать разную информацию контекста внутри цикла. Например:
 +<code cpp>
 +Chain->Operate([](const FChain* Chain, const FChainCursor& Cursor, ISubjective* Subjective, FMyTrait Trait, UMyDetail* Detail)
 +{
 +    ...
 +});
 +</code>
 +
 +==== Индекс текущей итерации ====
 +
 +В случае, если надо получить номер текущего Слота в итерации (т.е. место сущности в цепи), используйте выделенный [[appi>struct_t_chain_1_1_f_cursor.html#a18005eddb3a624bdabb76475c3863751|GetChainSlotIndex()]] метод соответствующего типа курсора. Курсор можно получить так же, как было представлено в [[#доставка_аргументов|предыдущей секции]]:<code cpp>
 +SolidChain->Operate([](FPlacementTrait& Placement, const FSolidChainCursor& Cursor)
 +{
 + Placement.Number = Cursor.GetChainSlotIndex();
 +});
 +</code>
 +
 +==== Остановка ====
 +
 +Хотя и непонятно, зачем вдруг понадобится останавливать процесс итерирования над цепью вручную, но этого легко достичь при помощи выделенного [[appi>struct_t_chain.html#aec97fe73be3d6d9f4c279c7427ed99d6|метода]].
 +
 +Например:
 +<code cpp>
 +int32 Counter = 0;
 +Chain->Operate([&Counter](const FChain* Chain, FMyTrait Trait)
 +{
 +    if (Counter > 100)
 +    {
 +        Chain->StopIterating();
 +        // Досрочно возвращаем управление, чтобы не инкрементировать счётчик:
 +        return;
 +    }
 +    Counter += Trait.Value;
 +});
 +</code>
  • ru/toolworks/docs/apparatus/operating.1630527864.txt.gz
  • Последнее изменение: 2021/09/01 23:24
  • jispar