<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.9.1" xml:lang="en-US">
  <compounddef id="classtf_1_1AsyncTask" kind="class" language="C++" prot="public">
    <compoundname>tf::AsyncTask</compoundname>
    <includes refid="async__task_8hpp" local="no">async_task.hpp</includes>
      <sectiondef kind="friend">
      <memberdef kind="friend" id="classtf_1_1AsyncTask_1a763b2f90bc53f92d680a635fe28e858e" prot="private" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type>class</type>
        <definition>friend class Executor</definition>
        <argsstring></argsstring>
        <name>Executor</name>
        <param>
          <type><ref refid="classtf_1_1Executor" kindref="compound">Executor</ref></type>
        </param>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="44" column="3" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="44" bodyend="-1"/>
      </memberdef>
      </sectiondef>
      <sectiondef kind="private-attrib">
      <memberdef kind="variable" id="classtf_1_1AsyncTask_1aa84e10d306fd24a7ecfa8de2cc964cac" prot="private" static="no" mutable="no">
        <type>Node *</type>
        <definition>Node* tf::AsyncTask::_node</definition>
        <argsstring></argsstring>
        <name>_node</name>
        <initializer>{nullptr}</initializer>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="113" column="10" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="113" bodyend="-1"/>
      </memberdef>
      </sectiondef>
      <sectiondef kind="public-func">
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a68689c79c7d794a8be2e1c181c818001" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
        <type></type>
        <definition>tf::AsyncTask::AsyncTask</definition>
        <argsstring>()=default</argsstring>
        <name>AsyncTask</name>
        <briefdescription>
<para>constructs an empty task handle </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="51" column="5"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a148ddcabda8fd44746b278499cd4cb53" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type></type>
        <definition>tf::AsyncTask::~AsyncTask</definition>
        <argsstring>()</argsstring>
        <name>~AsyncTask</name>
        <briefdescription>
<para>destroys the managed asynchronous task if this is the last owner </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="56" column="5" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="155" bodyend="157"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a682bc679a773da5e45714f71c8137f70" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type></type>
        <definition>tf::AsyncTask::AsyncTask</definition>
        <argsstring>(const AsyncTask &amp;rhs)</argsstring>
        <name>AsyncTask</name>
        <param>
          <type>const <ref refid="classtf_1_1AsyncTask" kindref="compound">AsyncTask</ref> &amp;</type>
          <declname>rhs</declname>
        </param>
        <briefdescription>
<para>constructs an asynchronous task that shares ownership of <computeroutput>rhs</computeroutput> </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="61" column="5" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="143" bodyend="146"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a5a31f85d2ee542f62e784d551ec78896" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type></type>
        <definition>tf::AsyncTask::AsyncTask</definition>
        <argsstring>(AsyncTask &amp;&amp;rhs)</argsstring>
        <name>AsyncTask</name>
        <param>
          <type><ref refid="classtf_1_1AsyncTask" kindref="compound">AsyncTask</ref> &amp;&amp;</type>
          <declname>rhs</declname>
        </param>
        <briefdescription>
<para>move-constructs an asynchronous task from <computeroutput>rhs</computeroutput> </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="66" column="5" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="149" bodyend="152"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a14fa18d27a02c41e01b48ea07e87f5c5" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type><ref refid="classtf_1_1AsyncTask" kindref="compound">AsyncTask</ref> &amp;</type>
        <definition>AsyncTask &amp; tf::AsyncTask::operator=</definition>
        <argsstring>(const AsyncTask &amp;rhs)</argsstring>
        <name>operator=</name>
        <param>
          <type>const <ref refid="classtf_1_1AsyncTask" kindref="compound">AsyncTask</ref> &amp;</type>
          <declname>rhs</declname>
        </param>
        <briefdescription>
<para>copy-assigns the asynchronous task from <computeroutput>rhs</computeroutput> </para>
        </briefdescription>
        <detaileddescription>
<para>Releases the managed object of <computeroutput>this</computeroutput> and retains a new shared ownership of <computeroutput>rhs</computeroutput>. </para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="74" column="15" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="160" bodyend="165"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a8dc18d17f3a5d72ef4d9c20ebf7ade4a" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type><ref refid="classtf_1_1AsyncTask" kindref="compound">AsyncTask</ref> &amp;</type>
        <definition>AsyncTask &amp; tf::AsyncTask::operator=</definition>
        <argsstring>(AsyncTask &amp;&amp;rhs)</argsstring>
        <name>operator=</name>
        <param>
          <type><ref refid="classtf_1_1AsyncTask" kindref="compound">AsyncTask</ref> &amp;&amp;</type>
          <declname>rhs</declname>
        </param>
        <briefdescription>
<para>move-assigns the asynchronous task from <computeroutput>rhs</computeroutput> </para>
        </briefdescription>
        <detaileddescription>
<para>Releases the managed object of <computeroutput>this</computeroutput> and takes over the ownership of <computeroutput>rhs</computeroutput>. </para>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="81" column="15" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="168" bodyend="173"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1ae42c70dc0c5edc6d58f47b346125fca3" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
        <type>bool</type>
        <definition>bool tf::AsyncTask::empty</definition>
        <argsstring>() const</argsstring>
        <name>empty</name>
        <briefdescription>
<para>checks if the asynchronous task stores nothing </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="86" column="10" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="176" bodyend="178"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a7c12835577fbdc1bca3190cf92c78088" prot="public" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type>void</type>
        <definition>void tf::AsyncTask::reset</definition>
        <argsstring>()</argsstring>
        <name>reset</name>
        <briefdescription>
<para>release the managed object of <computeroutput>this</computeroutput> </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="91" column="10" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="181" bodyend="184"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a826a2ea909094f5a26c2df876de58056" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
        <type>size_t</type>
        <definition>size_t tf::AsyncTask::hash_value</definition>
        <argsstring>() const</argsstring>
        <name>hash_value</name>
        <briefdescription>
<para>obtains a hash value of this asynchronous task </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="96" column="12" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="187" bodyend="189"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1a6a4a54030f57d1ef05c04ae01825165d" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
        <type>size_t</type>
        <definition>size_t tf::AsyncTask::use_count</definition>
        <argsstring>() const</argsstring>
        <name>use_count</name>
        <briefdescription>
<para>returns the number of shared owners that are currently managing this asynchronous task </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="102" column="12" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="192" bodyend="197"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1aefeefa30d7cafdfbb7dc8def542e8e51" prot="public" static="no" const="yes" explicit="no" inline="yes" virt="non-virtual">
        <type>bool</type>
        <definition>bool tf::AsyncTask::is_done</definition>
        <argsstring>() const</argsstring>
        <name>is_done</name>
        <briefdescription>
<para>returns the boolean indicating whether the async task is done </para>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="107" column="10" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="200" bodyend="204"/>
      </memberdef>
      </sectiondef>
      <sectiondef kind="private-func">
      <memberdef kind="function" id="classtf_1_1AsyncTask_1ad6a3bcc865f13ecddc1d32306b6df1bb" prot="private" static="no" const="no" explicit="yes" inline="yes" virt="non-virtual">
        <type></type>
        <definition>tf::AsyncTask::AsyncTask</definition>
        <argsstring>(Node *)</argsstring>
        <name>AsyncTask</name>
        <param>
          <type>Node *</type>
          <defname>ptr</defname>
        </param>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="111" column="14" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="120" bodyend="122"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1ae2eefe6ee6de4f97dd0b247b053addb1" prot="private" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type>void</type>
        <definition>void tf::AsyncTask::_incref</definition>
        <argsstring>()</argsstring>
        <name>_incref</name>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="115" column="10" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="125" bodyend="131"/>
      </memberdef>
      <memberdef kind="function" id="classtf_1_1AsyncTask_1aaee1f8ef1109eb90ad20bac2cba4eaca" prot="private" static="no" const="no" explicit="no" inline="yes" virt="non-virtual">
        <type>void</type>
        <definition>void tf::AsyncTask::_decref</definition>
        <argsstring>()</argsstring>
        <name>_decref</name>
        <briefdescription>
        </briefdescription>
        <detaileddescription>
        </detaileddescription>
        <inbodydescription>
        </inbodydescription>
        <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="116" column="10" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="134" bodyend="140"/>
      </memberdef>
      </sectiondef>
    <briefdescription>
<para>class to create a dependent asynchronous task </para>
    </briefdescription>
    <detaileddescription>
<para>A <ref refid="classtf_1_1AsyncTask" kindref="compound">tf::AsyncTask</ref> is a lightweight handle that retains <emphasis>shared</emphasis> ownership of a dependent async task created by an executor. This shared ownership ensures that the async task remains alive when adding it to the dependency list of another async task, thus avoiding the classical <ulink url="https://en.wikipedia.org/wiki/ABA_problem">ABA problem</ulink>.</para>
<para><programlisting filename=".cpp"><codeline><highlight class="comment">//<sp/>main<sp/>thread<sp/>retains<sp/>shared<sp/>ownership<sp/>of<sp/>async<sp/>task<sp/>A</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><ref refid="classtf_1_1AsyncTask" kindref="compound">tf::AsyncTask</ref><sp/>A<sp/>=<sp/>executor.silent_dependent_async([](){});</highlight></codeline>
<codeline><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="comment">//<sp/>task<sp/>A<sp/>remains<sp/>alive<sp/>(i.e.,<sp/>at<sp/>least<sp/>one<sp/>ref<sp/>count<sp/>by<sp/>the<sp/>main<sp/>thread)<sp/></highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"></highlight><highlight class="comment">//<sp/>when<sp/>being<sp/>added<sp/>to<sp/>the<sp/>dependency<sp/>list<sp/>of<sp/>async<sp/>task<sp/>B</highlight><highlight class="normal"></highlight></codeline>
<codeline><highlight class="normal"><ref refid="classtf_1_1AsyncTask" kindref="compound">tf::AsyncTask</ref><sp/>B<sp/>=<sp/>executor.silent_dependent_async([](){},<sp/>A);</highlight></codeline>
</programlisting></para>
<para>Currently, <ref refid="classtf_1_1AsyncTask" kindref="compound">tf::AsyncTask</ref> is implemented based on the logic of C++ smart pointer <ref refid="cpp/memory/shared_ptr" kindref="compound" external="/home/thuang295/Code/taskflow/doxygen/cppreference-doxygen-web.tag.xml">std::shared_ptr</ref> and is considered cheap to copy or move as long as only a handful of objects own it. When a worker completes an async task, it will remove the task from the executor, decrementing the number of shared owners by one. If that counter reaches zero, the task is destroyed. </para>
    </detaileddescription>
    <location file="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" line="42" column="1" bodyfile="/home/thuang295/Code/taskflow/taskflow/core/async_task.hpp" bodystart="42" bodyend="117"/>
    <listofallmembers>
      <member refid="classtf_1_1AsyncTask_1aaee1f8ef1109eb90ad20bac2cba4eaca" prot="private" virt="non-virtual"><scope>tf::AsyncTask</scope><name>_decref</name></member>
      <member refid="classtf_1_1AsyncTask_1ae2eefe6ee6de4f97dd0b247b053addb1" prot="private" virt="non-virtual"><scope>tf::AsyncTask</scope><name>_incref</name></member>
      <member refid="classtf_1_1AsyncTask_1aa84e10d306fd24a7ecfa8de2cc964cac" prot="private" virt="non-virtual"><scope>tf::AsyncTask</scope><name>_node</name></member>
      <member refid="classtf_1_1AsyncTask_1a68689c79c7d794a8be2e1c181c818001" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>AsyncTask</name></member>
      <member refid="classtf_1_1AsyncTask_1a682bc679a773da5e45714f71c8137f70" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>AsyncTask</name></member>
      <member refid="classtf_1_1AsyncTask_1a5a31f85d2ee542f62e784d551ec78896" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>AsyncTask</name></member>
      <member refid="classtf_1_1AsyncTask_1ad6a3bcc865f13ecddc1d32306b6df1bb" prot="private" virt="non-virtual"><scope>tf::AsyncTask</scope><name>AsyncTask</name></member>
      <member refid="classtf_1_1AsyncTask_1ae42c70dc0c5edc6d58f47b346125fca3" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>empty</name></member>
      <member refid="classtf_1_1AsyncTask_1a763b2f90bc53f92d680a635fe28e858e" prot="private" virt="non-virtual"><scope>tf::AsyncTask</scope><name>Executor</name></member>
      <member refid="classtf_1_1AsyncTask_1a826a2ea909094f5a26c2df876de58056" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>hash_value</name></member>
      <member refid="classtf_1_1AsyncTask_1aefeefa30d7cafdfbb7dc8def542e8e51" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>is_done</name></member>
      <member refid="classtf_1_1AsyncTask_1a14fa18d27a02c41e01b48ea07e87f5c5" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>operator=</name></member>
      <member refid="classtf_1_1AsyncTask_1a8dc18d17f3a5d72ef4d9c20ebf7ade4a" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>operator=</name></member>
      <member refid="classtf_1_1AsyncTask_1a7c12835577fbdc1bca3190cf92c78088" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>reset</name></member>
      <member refid="classtf_1_1AsyncTask_1a6a4a54030f57d1ef05c04ae01825165d" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>use_count</name></member>
      <member refid="classtf_1_1AsyncTask_1a148ddcabda8fd44746b278499cd4cb53" prot="public" virt="non-virtual"><scope>tf::AsyncTask</scope><name>~AsyncTask</name></member>
    </listofallmembers>
  </compounddef>
</doxygen>
