\doxysection{abstract\+\_\+factory.\+hpp}
\hypertarget{abstract__factory_8hpp_source}{}\label{abstract__factory_8hpp_source}\index{ginkgo/core/base/abstract\_factory.hpp@{ginkgo/core/base/abstract\_factory.hpp}}

\begin{DoxyCode}{0}
\DoxyCodeLine{00001\ \textcolor{comment}{//\ SPDX-\/FileCopyrightText:\ 2017\ -\/\ 2024\ The\ Ginkgo\ authors}}
\DoxyCodeLine{00002\ \textcolor{comment}{//}}
\DoxyCodeLine{00003\ \textcolor{comment}{//\ SPDX-\/License-\/Identifier:\ BSD-\/3-\/Clause}}
\DoxyCodeLine{00004\ }
\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#ifndef\ GKO\_PUBLIC\_CORE\_BASE\_ABSTRACT\_FACTORY\_HPP\_}}
\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#define\ GKO\_PUBLIC\_CORE\_BASE\_ABSTRACT\_FACTORY\_HPP\_}}
\DoxyCodeLine{00007\ }
\DoxyCodeLine{00008\ }
\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ <type\_traits>}}
\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ <unordered\_map>}}
\DoxyCodeLine{00011\ }
\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ <ginkgo/core/base/polymorphic\_object.hpp>}}
\DoxyCodeLine{00013\ }
\DoxyCodeLine{00014\ }
\DoxyCodeLine{00020\ \textcolor{keyword}{namespace\ }\doxymbox{\hyperlink{namespacegko}{gko}}\ \{}
\DoxyCodeLine{00021\ }
\DoxyCodeLine{00022\ }
\DoxyCodeLine{00044\ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ AbstractProductType,\ \textcolor{keyword}{typename}\ ComponentsType>}
\DoxyCodeLine{00045\ \textcolor{keyword}{class\ }AbstractFactory}
\DoxyCodeLine{00046\ \ \ \ \ :\ \textcolor{keyword}{public}\ EnableAbstractPolymorphicObject<}
\DoxyCodeLine{00047\ \ \ \ \ \ \ \ \ \ \ AbstractFactory<AbstractProductType,\ ComponentsType>>\ \{}
\DoxyCodeLine{00048\ \textcolor{keyword}{public}:}
\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{using\ }abstract\_product\_type\ =\ AbstractProductType;}
\DoxyCodeLine{00050\ \ \ \ \ \textcolor{keyword}{using\ }components\_type\ =\ ComponentsType;}
\DoxyCodeLine{00051\ }
\DoxyCodeLine{00066\ \ \ \ \ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}...\ Args>}
\DoxyCodeLine{00067\ \ \ \ \ std::unique\_ptr<abstract\_product\_type>\ \doxymbox{\hyperlink{classgko_1_1AbstractFactory_a7287977ddcd747b4351b72be49a6c230}{generate}}(Args\&\&...\ args)\textcolor{keyword}{\ const}}
\DoxyCodeLine{00068\ \textcolor{keyword}{\ \ \ \ }\{}
\DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ \textcolor{keyword}{auto}\ product\ =}
\DoxyCodeLine{00070\ \ \ \ \ \ \ \ \ \ \ \ \ this-\/>generate\_impl(components\_type\{std::forward<Args>(args)...\});}
\DoxyCodeLine{00071\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keyword}{auto}\ logger\ :\ this-\/>loggers\_)\ \{}
\DoxyCodeLine{00072\ \ \ \ \ \ \ \ \ \ \ \ \ product-\/>add\_logger(logger);}
\DoxyCodeLine{00073\ \ \ \ \ \ \ \ \ \}}
\DoxyCodeLine{00074\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ product;}
\DoxyCodeLine{00075\ \ \ \ \ \}}
\DoxyCodeLine{00076\ }
\DoxyCodeLine{00077\ \textcolor{keyword}{protected}:}
\DoxyCodeLine{00083\ \ \ \ \ \doxymbox{\hyperlink{classgko_1_1AbstractFactory}{AbstractFactory}}(std::shared\_ptr<const\ Executor>\ exec)}
\DoxyCodeLine{00084\ \ \ \ \ \ \ \ \ :\ EnableAbstractPolymorphicObject<\doxymbox{\hyperlink{classgko_1_1AbstractFactory}{AbstractFactory}}>(\doxymbox{\hyperlink{namespacestd}{std}}::move(exec))}
\DoxyCodeLine{00085\ \ \ \ \ \{\}}
\DoxyCodeLine{00086\ }
\DoxyCodeLine{00094\ \ \ \ \ \textcolor{keyword}{virtual}\ std::unique\_ptr<abstract\_product\_type>\ generate\_impl(}
\DoxyCodeLine{00095\ \ \ \ \ \ \ \ \ ComponentsType\ args)\ \textcolor{keyword}{const}\ =\ 0;}
\DoxyCodeLine{00096\ \};}
\DoxyCodeLine{00097\ }
\DoxyCodeLine{00098\ }
\DoxyCodeLine{00122\ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ ConcreteFactory,\ \textcolor{keyword}{typename}\ ProductType,}
\DoxyCodeLine{00123\ \ \ \ \ \ \ \ \ \ \ \textcolor{keyword}{typename}\ ParametersType,\ \textcolor{keyword}{typename}\ PolymorphicBase>}
\DoxyCodeLine{00124\ \textcolor{keyword}{class\ }EnableDefaultFactory}
\DoxyCodeLine{00125\ \ \ \ \ :\ \textcolor{keyword}{public}\ \doxymbox{\hyperlink{classgko_1_1EnablePolymorphicObject}{EnablePolymorphicObject}}<ConcreteFactory,\ PolymorphicBase>,}
\DoxyCodeLine{00126\ \ \ \ \ \ \ \textcolor{keyword}{public}\ \doxymbox{\hyperlink{classgko_1_1EnablePolymorphicAssignment}{EnablePolymorphicAssignment}}<ConcreteFactory>\ \{}
\DoxyCodeLine{00127\ \textcolor{keyword}{public}:}
\DoxyCodeLine{00128\ \ \ \ \ \textcolor{keyword}{friend}\ \textcolor{keyword}{class\ }\doxymbox{\hyperlink{classgko_1_1EnablePolymorphicObject}{EnablePolymorphicObject}}<ConcreteFactory,\ PolymorphicBase>;}
\DoxyCodeLine{00129\ }
\DoxyCodeLine{00130\ \ \ \ \ \textcolor{keyword}{using\ }product\_type\ =\ ProductType;}
\DoxyCodeLine{00131\ \ \ \ \ \textcolor{keyword}{using\ }parameters\_type\ =\ ParametersType;}
\DoxyCodeLine{00132\ \ \ \ \ \textcolor{keyword}{using\ }polymorphic\_base\ =\ PolymorphicBase;}
\DoxyCodeLine{00133\ \ \ \ \ \textcolor{keyword}{using\ }abstract\_product\_type\ =}
\DoxyCodeLine{00134\ \ \ \ \ \ \ \ \ \textcolor{keyword}{typename}\ PolymorphicBase::abstract\_product\_type;}
\DoxyCodeLine{00135\ \ \ \ \ \textcolor{keyword}{using\ }components\_type\ =\ \textcolor{keyword}{typename}\ PolymorphicBase::components\_type;}
\DoxyCodeLine{00136\ }
\DoxyCodeLine{00137\ \ \ \ \ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}...\ Args>}
\DoxyCodeLine{00138\ \ \ \ \ std::unique\_ptr<product\_type>\ generate(Args\&\&...\ args)\textcolor{keyword}{\ const}}
\DoxyCodeLine{00139\ \textcolor{keyword}{\ \ \ \ }\{}
\DoxyCodeLine{00140\ \ \ \ \ \ \ \ \ \textcolor{keyword}{auto}\ product\ =\ std::unique\_ptr<product\_type>(\textcolor{keyword}{static\_cast<}product\_type*\textcolor{keyword}{>}(}
\DoxyCodeLine{00141\ \ \ \ \ \ \ \ \ \ \ \ \ this-\/>polymorphic\_base::generate(std::forward<Args>(args)...)}
\DoxyCodeLine{00142\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ .release()));}
\DoxyCodeLine{00143\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ product;}
\DoxyCodeLine{00144\ \ \ \ \ \}}
\DoxyCodeLine{00145\ }
\DoxyCodeLine{00151\ \ \ \ \ \textcolor{keyword}{const}\ parameters\_type\&\ \doxymbox{\hyperlink{classgko_1_1EnableDefaultFactory_aea318b407943e1773d2374d314130d22}{get\_parameters}}()\ const\ noexcept}
\DoxyCodeLine{00152\ \ \ \ \ \{}
\DoxyCodeLine{00153\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ parameters\_;}
\DoxyCodeLine{00154\ \ \ \ \ \};}
\DoxyCodeLine{00155\ }
\DoxyCodeLine{00168\ \ \ \ \ \textcolor{keyword}{static}\ parameters\_type\ \doxymbox{\hyperlink{classgko_1_1EnableDefaultFactory_a1d077101d9e788e6c65f088612d14cc3}{create}}()\ \{\ \textcolor{keywordflow}{return}\ \{\};\ \}}
\DoxyCodeLine{00169\ }
\DoxyCodeLine{00170\ \textcolor{keyword}{protected}:}
\DoxyCodeLine{00177\ \ \ \ \ \textcolor{keyword}{explicit}\ \doxymbox{\hyperlink{classgko_1_1EnableDefaultFactory}{EnableDefaultFactory}}(std::shared\_ptr<const\ Executor>\ exec,}
\DoxyCodeLine{00178\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keyword}{const}\ parameters\_type\&\ parameters\ =\ \{\})}
\DoxyCodeLine{00179\ \ \ \ \ \ \ \ \ :\ EnablePolymorphicObject<ConcreteFactory,\ PolymorphicBase>(}
\DoxyCodeLine{00180\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \doxymbox{\hyperlink{namespacestd}{std}}::move(exec)),}
\DoxyCodeLine{00181\ \ \ \ \ \ \ \ \ \ \ parameters\_\{parameters\}}
\DoxyCodeLine{00182\ \ \ \ \ \{\}}
\DoxyCodeLine{00183\ }
\DoxyCodeLine{00184\ \ \ \ \ std::unique\_ptr<abstract\_product\_type>\ generate\_impl(}
\DoxyCodeLine{00185\ \ \ \ \ \ \ \ \ components\_type\ args)\textcolor{keyword}{\ const\ override}}
\DoxyCodeLine{00186\ \textcolor{keyword}{\ \ \ \ }\{}
\DoxyCodeLine{00187\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ std::unique\_ptr<abstract\_product\_type>(}
\DoxyCodeLine{00188\ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keyword}{new}\ product\_type(self(),\ args));}
\DoxyCodeLine{00189\ \ \ \ \ \}}
\DoxyCodeLine{00190\ }
\DoxyCodeLine{00191\ \textcolor{keyword}{private}:}
\DoxyCodeLine{00192\ \ \ \ \ GKO\_ENABLE\_SELF(ConcreteFactory);}
\DoxyCodeLine{00193\ }
\DoxyCodeLine{00194\ \ \ \ \ ParametersType\ parameters\_;}
\DoxyCodeLine{00195\ \};}
\DoxyCodeLine{00196\ }
\DoxyCodeLine{00197\ }
\DoxyCodeLine{00210\ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ ConcreteParametersType,\ \textcolor{keyword}{typename}\ Factory>}
\DoxyCodeLine{00211\ \textcolor{keyword}{class\ }\doxymbox{\hyperlink{classgko_1_1enable__parameters__type}{enable\_parameters\_type}}\ \{}
\DoxyCodeLine{00212\ \textcolor{keyword}{public}:}
\DoxyCodeLine{00213\ \ \ \ \ \textcolor{keyword}{using\ }factory\ =\ Factory;}
\DoxyCodeLine{00214\ }
\DoxyCodeLine{00219\ \ \ \ \ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}...\ Args>}
\DoxyCodeLine{00220\ \ \ \ \ ConcreteParametersType\&\ \doxymbox{\hyperlink{classgko_1_1enable__parameters__type_a6ecac33b17246bfea802ebaf23c189b4}{with\_loggers}}(Args\&\&...\ \_value)}
\DoxyCodeLine{00221\ \ \ \ \ \{}
\DoxyCodeLine{00222\ \ \ \ \ \ \ \ \ this-\/>loggers\ =\ \{std::forward<Args>(\_value)...\};}
\DoxyCodeLine{00223\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ *self();}
\DoxyCodeLine{00224\ \ \ \ \ \}}
\DoxyCodeLine{00225\ }
\DoxyCodeLine{00233\ \ \ \ \ std::unique\_ptr<Factory>\ \doxymbox{\hyperlink{classgko_1_1enable__parameters__type_a65a5adc4eb7078475d26e7991efae64d}{on}}(std::shared\_ptr<const\ Executor>\ exec)\textcolor{keyword}{\ const}}
\DoxyCodeLine{00234\ \textcolor{keyword}{\ \ \ \ }\{}
\DoxyCodeLine{00235\ \ \ \ \ \ \ \ \ ConcreteParametersType\ copy\ =\ *self();}
\DoxyCodeLine{00236\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keyword}{const}\ \textcolor{keyword}{auto}\&\ item\ :\ deferred\_factories)\ \{}
\DoxyCodeLine{00237\ \ \ \ \ \ \ \ \ \ \ \ \ item.second(exec,\ copy);}
\DoxyCodeLine{00238\ \ \ \ \ \ \ \ \ \}}
\DoxyCodeLine{00239\ \ \ \ \ \ \ \ \ \textcolor{keyword}{auto}\ factory\ =\ std::unique\_ptr<Factory>(\textcolor{keyword}{new}\ Factory(exec,\ copy));}
\DoxyCodeLine{00240\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}\ (\textcolor{keyword}{auto}\&\ logger\ :\ loggers)\ \{}
\DoxyCodeLine{00241\ \ \ \ \ \ \ \ \ \ \ \ \ factory-\/>add\_logger(logger);}
\DoxyCodeLine{00242\ \ \ \ \ \ \ \ \ \};}
\DoxyCodeLine{00243\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ factory;}
\DoxyCodeLine{00244\ \ \ \ \ \}}
\DoxyCodeLine{00245\ }
\DoxyCodeLine{00246\ \textcolor{keyword}{protected}:}
\DoxyCodeLine{00247\ \ \ \ \ GKO\_ENABLE\_SELF(ConcreteParametersType);}
\DoxyCodeLine{00248\ }
\DoxyCodeLine{00252\ \ \ \ \ std::vector<std::shared\_ptr<const\ log::Logger>>\ loggers\{\};}
\DoxyCodeLine{00253\ }
\DoxyCodeLine{00260\ \ \ \ \ std::unordered\_map<std::string,}
\DoxyCodeLine{00261\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::function<void(std::shared\_ptr<const\ Executor>\ exec,}
\DoxyCodeLine{00262\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ConcreteParametersType\&)>>}
\DoxyCodeLine{00263\ \ \ \ \ \ \ \ \ deferred\_factories;}
\DoxyCodeLine{00264\ \};}
\DoxyCodeLine{00265\ }
\DoxyCodeLine{00266\ }
\DoxyCodeLine{00280\ \textcolor{preprocessor}{\#define\ GKO\_CREATE\_FACTORY\_PARAMETERS(\_parameters\_name,\ \_factory\_name)\ \ \(\backslash\)}}
\DoxyCodeLine{00281\ \textcolor{preprocessor}{public:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00282\ \textcolor{preprocessor}{\ \ \ \ class\ \_factory\_name;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00283\ \textcolor{preprocessor}{\ \ \ \ struct\ \_parameters\_name\#\#\_type\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00284\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ :\ public\ ::gko::enable\_parameters\_type<\_parameters\_name\#\#\_type,\ \(\backslash\)}}
\DoxyCodeLine{00285\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \_factory\_name>}}
\DoxyCodeLine{00286\ }
\DoxyCodeLine{00287\ }
\DoxyCodeLine{00288\ \textcolor{keyword}{namespace\ }detail\ \{}
\DoxyCodeLine{00289\ }
\DoxyCodeLine{00290\ }
\DoxyCodeLine{00291\ \textcolor{comment}{//\ Use\ pointer\ not\ the\ type\ because\ std::is\_convertible<const\ type,\ type>\ can\ be}}
\DoxyCodeLine{00292\ \textcolor{comment}{//\ true.}}
\DoxyCodeLine{00293\ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ From,\ \textcolor{keyword}{typename}\ To>}
\DoxyCodeLine{00294\ \textcolor{keyword}{struct\ }is\_pointer\_convertible\ :\ std::is\_convertible<From*,\ To*>\ \{\};}
\DoxyCodeLine{00295\ }
\DoxyCodeLine{00296\ }
\DoxyCodeLine{00297\ \}\ \ \textcolor{comment}{//\ namespace\ detail}}
\DoxyCodeLine{00298\ }
\DoxyCodeLine{00299\ }
\DoxyCodeLine{00308\ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ FactoryType>}
\DoxyCodeLine{00309\ \textcolor{keyword}{class\ }\doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_ab069248c433a008756f139e1f5a42294}{deferred\_factory\_parameter}}\ \{}
\DoxyCodeLine{00310\ \textcolor{keyword}{public}:}
\DoxyCodeLine{00312\ \ \ \ \ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_ab069248c433a008756f139e1f5a42294}{deferred\_factory\_parameter}}()\ =\ \textcolor{keywordflow}{default};}
\DoxyCodeLine{00313\ }
\DoxyCodeLine{00315\ \ \ \ \ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_ad530c7aa9eee77cedf14844bff234b03}{deferred\_factory\_parameter}}(std::nullptr\_t)}
\DoxyCodeLine{00316\ \ \ \ \ \{}
\DoxyCodeLine{00317\ \ \ \ \ \ \ \ \ generator\_\ =\ [](std::shared\_ptr<const\ Executor>)\ \{\ \textcolor{keywordflow}{return}\ \textcolor{keyword}{nullptr};\ \};}
\DoxyCodeLine{00318\ \ \ \ \ \}}
\DoxyCodeLine{00319\ }
\DoxyCodeLine{00324\ \ \ \ \ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ ConcreteFactoryType,}
\DoxyCodeLine{00325\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::enable\_if\_t<detail::is\_pointer\_convertible<}
\DoxyCodeLine{00326\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ConcreteFactoryType,\ FactoryType>::value>*\ =\ \textcolor{keyword}{nullptr}>}
\DoxyCodeLine{00327\ \ \ \ \ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_a9559142ba494fceaf016a1bdc10c98c6}{deferred\_factory\_parameter}}(std::shared\_ptr<ConcreteFactoryType>\ factory)}
\DoxyCodeLine{00328\ \ \ \ \ \{}
\DoxyCodeLine{00329\ \ \ \ \ \ \ \ \ generator\_\ =\ [factory\ =}
\DoxyCodeLine{00330\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr<FactoryType>(std::move(factory))](}
\DoxyCodeLine{00331\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr<const\ Executor>)\ \{\ \textcolor{keywordflow}{return}\ factory;\ \};}
\DoxyCodeLine{00332\ \ \ \ \ \}}
\DoxyCodeLine{00333\ }
\DoxyCodeLine{00338\ \ \ \ \ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ ConcreteFactoryType,\ \textcolor{keyword}{typename}\ Deleter,}
\DoxyCodeLine{00339\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::enable\_if\_t<detail::is\_pointer\_convertible<}
\DoxyCodeLine{00340\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ConcreteFactoryType,\ FactoryType>::value>*\ =\ \textcolor{keyword}{nullptr}>}
\DoxyCodeLine{00341\ \ \ \ \ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_ade191bb3a9d7ffc65392b87233d63098}{deferred\_factory\_parameter}}(}
\DoxyCodeLine{00342\ \ \ \ \ \ \ \ \ std::unique\_ptr<ConcreteFactoryType,\ Deleter>\ factory)}
\DoxyCodeLine{00343\ \ \ \ \ \{}
\DoxyCodeLine{00344\ \ \ \ \ \ \ \ \ generator\_\ =\ [factory\ =}
\DoxyCodeLine{00345\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr<FactoryType>(std::move(factory))](}
\DoxyCodeLine{00346\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr<const\ Executor>)\ \{\ \textcolor{keywordflow}{return}\ factory;\ \};}
\DoxyCodeLine{00347\ \ \ \ \ \}}
\DoxyCodeLine{00348\ }
\DoxyCodeLine{00354\ \ \ \ \ \textcolor{keyword}{template}\ <\textcolor{keyword}{typename}\ ParametersType,}
\DoxyCodeLine{00355\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keyword}{typename}\ U\ =\ \textcolor{keyword}{decltype}(std::declval<ParametersType>().on(}
\DoxyCodeLine{00356\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr<const\ Executor>\{\})),}
\DoxyCodeLine{00357\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::enable\_if\_t<detail::is\_pointer\_convertible<}
\DoxyCodeLine{00358\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keyword}{typename}\ U::element\_type,\ FactoryType>::value>*\ =\ \textcolor{keyword}{nullptr}>}
\DoxyCodeLine{00359\ \ \ \ \ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_af89a9f8423e6727573029fa0c881b6d1}{deferred\_factory\_parameter}}(ParametersType\ parameters)}
\DoxyCodeLine{00360\ \ \ \ \ \{}
\DoxyCodeLine{00361\ \ \ \ \ \ \ \ \ generator\_\ =\ [parameters](std::shared\_ptr<const\ Executor>\ exec)}
\DoxyCodeLine{00362\ \ \ \ \ \ \ \ \ \ \ \ \ -\/>\ std::shared\_ptr<FactoryType>\ \{\ \textcolor{keywordflow}{return}\ parameters.on(exec);\ \};}
\DoxyCodeLine{00363\ \ \ \ \ \}}
\DoxyCodeLine{00364\ }
\DoxyCodeLine{00369\ \ \ \ \ std::shared\_ptr<FactoryType>\ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_a0abc325f946a7c803735454e00b030a6}{on}}(std::shared\_ptr<const\ Executor>\ exec)\textcolor{keyword}{\ const}}
\DoxyCodeLine{00370\ \textcolor{keyword}{\ \ \ \ }\{}
\DoxyCodeLine{00371\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}\ (this-\/>\doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_a888d64b7a719796fe7ca15518a71b486}{is\_empty}}())\ \{}
\DoxyCodeLine{00372\ \ \ \ \ \ \ \ \ \ \ \ \ GKO\_NOT\_SUPPORTED(*\textcolor{keyword}{this});}
\DoxyCodeLine{00373\ \ \ \ \ \ \ \ \ \}}
\DoxyCodeLine{00374\ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{return}\ generator\_(exec);}
\DoxyCodeLine{00375\ \ \ \ \ \}}
\DoxyCodeLine{00376\ }
\DoxyCodeLine{00378\ \ \ \ \ \textcolor{keywordtype}{bool}\ \doxymbox{\hyperlink{classgko_1_1deferred__factory__parameter_a888d64b7a719796fe7ca15518a71b486}{is\_empty}}()\textcolor{keyword}{\ const\ }\{\ \textcolor{keywordflow}{return}\ !bool(generator\_);\ \}}
\DoxyCodeLine{00379\ }
\DoxyCodeLine{00380\ \textcolor{keyword}{private}:}
\DoxyCodeLine{00381\ \ \ \ \ std::function<std::shared\_ptr<FactoryType>(std::shared\_ptr<const\ Executor>)>}
\DoxyCodeLine{00382\ \ \ \ \ \ \ \ \ generator\_;}
\DoxyCodeLine{00383\ \};}
\DoxyCodeLine{00384\ }
\DoxyCodeLine{00385\ }
\DoxyCodeLine{00394\ \textcolor{preprocessor}{\#define\ GKO\_ENABLE\_BUILD\_METHOD(\_factory\_name)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00395\ \textcolor{preprocessor}{\ \ \ \ static\ auto\ build()-\/>decltype(\_factory\_name::create())\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00396\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00397\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ \_factory\_name::create();\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00398\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00399\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00400\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \(\backslash\)}}
\DoxyCodeLine{00401\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00402\ }
\DoxyCodeLine{00403\ }
\DoxyCodeLine{00404\ \textcolor{preprocessor}{\#if\ !(defined(\_\_CUDACC\_\_)\ ||\ defined(\_\_HIPCC\_\_))}\textcolor{preprocessor}{}}
\DoxyCodeLine{00417\ \textcolor{preprocessor}{\#define\ GKO\_FACTORY\_PARAMETER(\_name,\ ...)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00418\ \textcolor{preprocessor}{\ \ \ \ \_name\{\_\_VA\_ARGS\_\_\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00419\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00420\ \textcolor{preprocessor}{\ \ \ \ template\ <typename...\ Args>\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00421\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(Args\&\&...\ \_value)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00422\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ -\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00423\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00424\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ using\ type\ =\ decltype(this-\/>\_name);\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00425\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>\_name\ =\ type\{std::forward<Args>(\_value)...\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00426\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00427\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00428\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00429\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \(\backslash\)}}
\DoxyCodeLine{00430\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00431\ }
\DoxyCodeLine{00445\ \textcolor{preprocessor}{\#define\ GKO\_FACTORY\_PARAMETER\_SCALAR(\_name,\ \_default)\ \(\backslash\)}}
\DoxyCodeLine{00446\ \textcolor{preprocessor}{\ \ \ \ GKO\_FACTORY\_PARAMETER(\_name,\ \_default)}}
\DoxyCodeLine{00447\ }
\DoxyCodeLine{00461\ \textcolor{preprocessor}{\#define\ GKO\_FACTORY\_PARAMETER\_VECTOR(\_name,\ ...)\ \(\backslash\)}}
\DoxyCodeLine{00462\ \textcolor{preprocessor}{\ \ \ \ GKO\_FACTORY\_PARAMETER(\_name,\ \_\_VA\_ARGS\_\_)}}
\DoxyCodeLine{00463\ \textcolor{preprocessor}{\#else\ \ }\textcolor{comment}{//\ defined(\_\_CUDACC\_\_)\ ||\ defined(\_\_HIPCC\_\_)}}
\DoxyCodeLine{00464\ \textcolor{comment}{//\ A\ workaround\ for\ the\ NVCC\ compiler\ -\/\ parameter\ pack\ expansion\ does\ not\ work}}
\DoxyCodeLine{00465\ \textcolor{comment}{//\ properly,\ because\ while\ the\ assignment\ to\ a\ scalar\ value\ is\ translated\ by}}
\DoxyCodeLine{00466\ \textcolor{comment}{//\ cudafe\ into\ a\ C-\/style\ cast,\ the\ parameter\ pack\ expansion\ is\ not\ removed\ and}}
\DoxyCodeLine{00467\ \textcolor{comment}{//\ \`{}Args\&\&...\ args`\ is\ still\ kept\ as\ a\ parameter\ pack.}}
\DoxyCodeLine{00468\ \textcolor{preprocessor}{\#define\ GKO\_FACTORY\_PARAMETER(\_name,\ ...)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00469\ \textcolor{preprocessor}{\ \ \ \ \_name\{\_\_VA\_ARGS\_\_\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00470\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00471\ \textcolor{preprocessor}{\ \ \ \ template\ <typename...\ Args>\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00472\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(Args\&\&...\ \_value)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00473\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ -\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00474\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00475\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ GKO\_NOT\_IMPLEMENTED;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00476\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00477\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00478\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00479\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \(\backslash\)}}
\DoxyCodeLine{00480\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00481\ }
\DoxyCodeLine{00482\ \textcolor{preprocessor}{\#define\ GKO\_FACTORY\_PARAMETER\_SCALAR(\_name,\ \_default)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00483\ \textcolor{preprocessor}{\ \ \ \ \_name\{\_default\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00484\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00485\ \textcolor{preprocessor}{\ \ \ \ template\ <typename\ Arg>\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00486\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(Arg\&\&\ \_value)-\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \(\backslash\)}}
\DoxyCodeLine{00487\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00488\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ using\ type\ =\ decltype(this-\/>\_name);\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00489\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>\_name\ =\ type\{std::forward<Arg>(\_value)\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00490\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00491\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00492\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00493\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \ \(\backslash\)}}
\DoxyCodeLine{00494\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00495\ }
\DoxyCodeLine{00496\ \textcolor{preprocessor}{\#define\ GKO\_FACTORY\_PARAMETER\_VECTOR(\_name,\ ...)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00497\ \textcolor{preprocessor}{\ \ \ \ \_name\{\_\_VA\_ARGS\_\_\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00498\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00499\ \textcolor{preprocessor}{\ \ \ \ template\ <typename...\ Args>\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00500\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(Args\&\&...\ \_value)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00501\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ -\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00502\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00503\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ using\ type\ =\ decltype(this-\/>\_name);\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00504\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>\_name\ =\ type\{std::forward<Args>(\_value)...\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00505\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00506\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00507\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00508\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \(\backslash\)}}
\DoxyCodeLine{00509\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00510\ \textcolor{preprocessor}{\#endif\ \ }\textcolor{comment}{//\ defined(\_\_CUDACC\_\_)\ ||\ defined(\_\_HIPCC\_\_)}}
\DoxyCodeLine{00511\ }
\DoxyCodeLine{00521\ \textcolor{preprocessor}{\#define\ GKO\_DEFERRED\_FACTORY\_PARAMETER(\_name)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00522\ \textcolor{preprocessor}{\ \ \ \ \_name\{\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00523\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00524\ \textcolor{preprocessor}{private:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00525\ \textcolor{preprocessor}{\ \ \ \ using\ \_name\#\#\_type\ =\ typename\ decltype(\_name)::element\_type;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00526\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00527\ \textcolor{preprocessor}{public:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00528\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(::gko::deferred\_factory\_parameter<\_name\#\#\_type>\ factory)\ \(\backslash\)}}
\DoxyCodeLine{00529\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ -\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00530\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00531\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>\_name\#\#\_generator\_\ =\ std::move(factory);\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00532\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>deferred\_factories[\#\_name]\ =\ [](const\ auto\&\ exec,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00533\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ auto\&\ params)\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00534\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ if\ (!params.\_name\#\#\_generator\_.is\_empty())\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00535\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ params.\_name\ =\ params.\_name\#\#\_generator\_.on(exec);\ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00536\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00537\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00538\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00539\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00540\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00541\ \textcolor{preprocessor}{private:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00542\ \textcolor{preprocessor}{\ \ \ \ ::gko::deferred\_factory\_parameter<\_name\#\#\_type>\ \_name\#\#\_generator\_;\ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00543\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00544\ \textcolor{preprocessor}{public:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00545\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00546\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \ \ \(\backslash\)}}
\DoxyCodeLine{00547\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00548\ }
\DoxyCodeLine{00559\ \textcolor{preprocessor}{\#define\ GKO\_DEFERRED\_FACTORY\_VECTOR\_PARAMETER(\_name)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00560\ \textcolor{preprocessor}{\ \ \ \ \_name\{\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00561\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00562\ \textcolor{preprocessor}{private:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00563\ \textcolor{preprocessor}{\ \ \ \ using\ \_name\#\#\_type\ =\ typename\ decltype(\_name)::value\_type::element\_type;\ \ \ \(\backslash\)}}
\DoxyCodeLine{00564\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00565\ \textcolor{preprocessor}{public:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00566\ \textcolor{preprocessor}{\ \ \ \ template\ <typename...\ Args,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00567\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ typename\ =\ std::enable\_if\_t<::std::conjunction<\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00568\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::is\_convertible<Args,\ ::gko::deferred\_factory\_parameter<\ \(\backslash\)}}
\DoxyCodeLine{00569\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \_name\#\#\_type>>...>::value>>\ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00570\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(Args\&\&...\ factories)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00571\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ -\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00572\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00573\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>\_name\#\#\_generator\_\ =\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00574\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ ::gko::deferred\_factory\_parameter<\_name\#\#\_type>\{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00575\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::forward<Args>(factories)\}...\};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00576\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>deferred\_factories[\#\_name]\ =\ [](const\ auto\&\ exec,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00577\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ auto\&\ params)\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00578\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ if\ (!params.\_name\#\#\_generator\_.empty())\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00579\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ params.\_name.clear();\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00580\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ for\ (auto\&\ generator\ :\ params.\_name\#\#\_generator\_)\ \{\ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00581\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ params.\_name.push\_back(generator.on(exec));\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00582\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00583\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00584\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00585\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00586\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00587\ \textcolor{preprocessor}{\ \ \ \ template\ <typename\ FactoryType,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00588\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ typename\ =\ std::enable\_if\_t<std::is\_convertible<\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00589\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ FactoryType,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00590\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ::gko::deferred\_factory\_parameter<\_name\#\#\_type>>::value>>\ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00591\ \textcolor{preprocessor}{\ \ \ \ auto\ with\_\#\#\_name(const\ std::vector<FactoryType>\&\ factories)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00592\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ -\/>std::decay\_t<decltype(*(this-\/>self()))>\&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00593\ \textcolor{preprocessor}{\ \ \ \ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00594\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>\_name\#\#\_generator\_.clear();\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00595\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ for\ (const\ auto\&\ factory\ :\ factories)\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00596\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ this-\/>\_name\#\#\_generator\_.push\_back(factory);\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00597\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00598\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ this-\/>deferred\_factories[\#\_name]\ =\ [](const\ auto\&\ exec,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00599\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ auto\&\ params)\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00600\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ if\ (!params.\_name\#\#\_generator\_.empty())\ \{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00601\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ params.\_name.clear();\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00602\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ for\ (auto\&\ generator\ :\ params.\_name\#\#\_generator\_)\ \{\ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00603\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ params.\_name.push\_back(generator.on(exec));\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00604\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00605\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00606\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00607\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ return\ *(this-\/>self());\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00608\ \textcolor{preprocessor}{\ \ \ \ \}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00609\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00610\ \textcolor{preprocessor}{private:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00611\ \textcolor{preprocessor}{\ \ \ \ std::vector<::gko::deferred\_factory\_parameter<\_name\#\#\_type>>\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00612\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \_name\#\#\_generator\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00613\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00614\ \textcolor{preprocessor}{public:\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00615\ \textcolor{preprocessor}{\ \ \ \ static\_assert(true,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \(\backslash\)}}
\DoxyCodeLine{00616\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}This\ assert\ is\ used\ to\ counter\ the\ false\ positive\ extra\ "{}\ \ \ \(\backslash\)}}
\DoxyCodeLine{00617\ \textcolor{preprocessor}{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "{}semi-\/colon\ warnings"{})}}
\DoxyCodeLine{00618\ }
\DoxyCodeLine{00619\ }
\DoxyCodeLine{00620\ \}\ \ \textcolor{comment}{//\ namespace\ gko}}
\DoxyCodeLine{00621\ }
\DoxyCodeLine{00622\ }
\DoxyCodeLine{00623\ \textcolor{preprocessor}{\#endif\ \ }\textcolor{comment}{//\ GKO\_PUBLIC\_CORE\_BASE\_ABSTRACT\_FACTORY\_HPP\_}}

\end{DoxyCode}
