Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > c74ab286c3d46f9b82671d206e43a74b > files > 1030

libstdc++-docs-4.6.3-2.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libstdc++: functional Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript">
$(document).ready(initResizable);
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">libstdc++</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('a00884.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">functional</div>  </div>
</div>
<div class="contents">
<a href="a00884.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// &lt;functional&gt; -*- C++ -*-</span>
<a name="l00002"></a>00002 
<a name="l00003"></a>00003 <span class="comment">// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,</span>
<a name="l00004"></a>00004 <span class="comment">// 2011 Free Software Foundation, Inc.</span>
<a name="l00005"></a>00005 <span class="comment">//</span>
<a name="l00006"></a>00006 <span class="comment">// This file is part of the GNU ISO C++ Library.  This library is free</span>
<a name="l00007"></a>00007 <span class="comment">// software; you can redistribute it and/or modify it under the</span>
<a name="l00008"></a>00008 <span class="comment">// terms of the GNU General Public License as published by the</span>
<a name="l00009"></a>00009 <span class="comment">// Free Software Foundation; either version 3, or (at your option)</span>
<a name="l00010"></a>00010 <span class="comment">// any later version.</span>
<a name="l00011"></a>00011 
<a name="l00012"></a>00012 <span class="comment">// This library is distributed in the hope that it will be useful,</span>
<a name="l00013"></a>00013 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00014"></a>00014 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00015"></a>00015 <span class="comment">// GNU General Public License for more details.</span>
<a name="l00016"></a>00016 
<a name="l00017"></a>00017 <span class="comment">// Under Section 7 of GPL version 3, you are granted additional</span>
<a name="l00018"></a>00018 <span class="comment">// permissions described in the GCC Runtime Library Exception, version</span>
<a name="l00019"></a>00019 <span class="comment">// 3.1, as published by the Free Software Foundation.</span>
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 <span class="comment">// You should have received a copy of the GNU General Public License and</span>
<a name="l00022"></a>00022 <span class="comment">// a copy of the GCC Runtime Library Exception along with this program;</span>
<a name="l00023"></a>00023 <span class="comment">// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see</span>
<a name="l00024"></a>00024 <span class="comment">// &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00025"></a>00025 
<a name="l00026"></a>00026 <span class="comment">/*</span>
<a name="l00027"></a>00027 <span class="comment"> * Copyright (c) 1997</span>
<a name="l00028"></a>00028 <span class="comment"> * Silicon Graphics Computer Systems, Inc.</span>
<a name="l00029"></a>00029 <span class="comment"> *</span>
<a name="l00030"></a>00030 <span class="comment"> * Permission to use, copy, modify, distribute and sell this software</span>
<a name="l00031"></a>00031 <span class="comment"> * and its documentation for any purpose is hereby granted without fee,</span>
<a name="l00032"></a>00032 <span class="comment"> * provided that the above copyright notice appear in all copies and</span>
<a name="l00033"></a>00033 <span class="comment"> * that both that copyright notice and this permission notice appear</span>
<a name="l00034"></a>00034 <span class="comment"> * in supporting documentation.  Silicon Graphics makes no</span>
<a name="l00035"></a>00035 <span class="comment"> * representations about the suitability of this software for any</span>
<a name="l00036"></a>00036 <span class="comment"> * purpose.  It is provided &quot;as is&quot; without express or implied warranty.</span>
<a name="l00037"></a>00037 <span class="comment"> *</span>
<a name="l00038"></a>00038 <span class="comment"> */</span>
<a name="l00039"></a>00039 <span class="comment"></span>
<a name="l00040"></a>00040 <span class="comment">/** @file include/functional</span>
<a name="l00041"></a>00041 <span class="comment"> *  This is a Standard C++ Library header.</span>
<a name="l00042"></a>00042 <span class="comment"> */</span>
<a name="l00043"></a>00043 
<a name="l00044"></a>00044 <span class="preprocessor">#ifndef _GLIBCXX_FUNCTIONAL</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define _GLIBCXX_FUNCTIONAL 1</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span>
<a name="l00047"></a>00047 <span class="preprocessor">#pragma GCC system_header</span>
<a name="l00048"></a>00048 <span class="preprocessor"></span>
<a name="l00049"></a>00049 <span class="preprocessor">#include &lt;<a class="code" href="a00781.html">bits/c++config.h</a>&gt;</span>
<a name="l00050"></a>00050 <span class="preprocessor">#include &lt;<a class="code" href="a01050.html">bits/stl_function.h</a>&gt;</span>
<a name="l00051"></a>00051 
<a name="l00052"></a>00052 <span class="preprocessor">#ifdef __GXX_EXPERIMENTAL_CXX0X__</span>
<a name="l00053"></a>00053 <span class="preprocessor"></span>
<a name="l00054"></a>00054 <span class="preprocessor">#include &lt;<a class="code" href="a01094.html">typeinfo</a>&gt;</span>
<a name="l00055"></a>00055 <span class="preprocessor">#include &lt;<a class="code" href="a00957.html">new</a>&gt;</span>
<a name="l00056"></a>00056 <span class="preprocessor">#include &lt;<a class="code" href="a01089.html">tuple</a>&gt;</span>
<a name="l00057"></a>00057 <span class="preprocessor">#include &lt;<a class="code" href="a01090.html">type_traits</a>&gt;</span>
<a name="l00058"></a>00058 <span class="preprocessor">#include &lt;<a class="code" href="a00883.html">bits/functexcept.h</a>&gt;</span>
<a name="l00059"></a>00059 <span class="preprocessor">#include &lt;<a class="code" href="a00886.html">bits/functional_hash.h</a>&gt;</span>
<a name="l00060"></a>00060 
<a name="l00061"></a>00061 <span class="keyword">namespace </span>std _GLIBCXX_VISIBILITY(default)
<a name="l00062"></a>00062 {
<a name="l00063"></a>00063 _GLIBCXX_BEGIN_NAMESPACE_VERSION
<a name="l00064"></a>00064 
<a name="l00065"></a>00065 <a class="code" href="a01205.html#ga5483c2bfe929a5938ce633f378db2d55">_GLIBCXX_HAS_NESTED_TYPE</a>(result_type)
<a name="l00066"></a>00066 
<a name="l00067"></a>00067   <span class="comment">/// If we have found a result_type, extract it.</span>
<a name="l00068"></a>00068 <span class="comment"></span>  template&lt;<span class="keywordtype">bool</span> _Has_result_type, typename _Functor&gt;
<a name="l00069"></a><a class="code" href="a00237.html">00069</a>     struct <a class="code" href="a00237.html" title="If we have found a result_type, extract it.">_Maybe_get_result_type</a>
<a name="l00070"></a>00070     { };
<a name="l00071"></a>00071 
<a name="l00072"></a>00072   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l00073"></a>00073     <span class="keyword">struct </span><a class="code" href="a00237.html" title="If we have found a result_type, extract it.">_Maybe_get_result_type</a>&lt;true, _Functor&gt;
<a name="l00074"></a>00074     { <span class="keyword">typedef</span> <span class="keyword">typename</span> _Functor::result_type result_type; };
<a name="l00075"></a>00075 <span class="comment"></span>
<a name="l00076"></a>00076 <span class="comment">  /**</span>
<a name="l00077"></a>00077 <span class="comment">   *  Base class for any function object that has a weak result type, as</span>
<a name="l00078"></a>00078 <span class="comment">   *  defined in 3.3/3 of TR1.</span>
<a name="l00079"></a>00079 <span class="comment">  */</span>
<a name="l00080"></a>00080   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l00081"></a><a class="code" href="a00244.html">00081</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>
<a name="l00082"></a>00082     : <a class="code" href="a00237.html" title="If we have found a result_type, extract it.">_Maybe_get_result_type</a>&lt;__has_result_type&lt;_Functor&gt;::value, _Functor&gt;
<a name="l00083"></a>00083     { };
<a name="l00084"></a>00084 <span class="comment"></span>
<a name="l00085"></a>00085 <span class="comment">  /// Retrieve the result type for a function type.</span>
<a name="l00086"></a>00086 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00087"></a><a class="code" href="a00352.html">00087</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res(_ArgTypes...)&gt;
<a name="l00088"></a>00088     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00089"></a>00089 
<a name="l00090"></a>00090   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00091"></a>00091     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res(_ArgTypes......)&gt;
<a name="l00092"></a>00092     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00093"></a>00093 
<a name="l00094"></a>00094   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00095"></a>00095     <span class="keyword">struct </span>_Weak_result_type_impl&lt;_Res(_ArgTypes...) const&gt;
<a name="l00096"></a>00096     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00097"></a>00097 
<a name="l00098"></a>00098   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00099"></a>00099     <span class="keyword">struct </span>_Weak_result_type_impl&lt;_Res(_ArgTypes......) const&gt;
<a name="l00100"></a>00100     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00101"></a>00101 
<a name="l00102"></a>00102   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00103"></a>00103     <span class="keyword">struct </span>_Weak_result_type_impl&lt;_Res(_ArgTypes...) volatile&gt;
<a name="l00104"></a>00104     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00105"></a>00105 
<a name="l00106"></a>00106   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00107"></a>00107     <span class="keyword">struct </span>_Weak_result_type_impl&lt;_Res(_ArgTypes......) volatile&gt;
<a name="l00108"></a>00108     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00109"></a>00109 
<a name="l00110"></a>00110   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00111"></a>00111     <span class="keyword">struct </span>_Weak_result_type_impl&lt;_Res(_ArgTypes...) const volatile&gt;
<a name="l00112"></a>00112     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00113"></a>00113 
<a name="l00114"></a>00114   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00115"></a>00115     <span class="keyword">struct </span>_Weak_result_type_impl&lt;_Res(_ArgTypes......) const volatile&gt;
<a name="l00116"></a>00116     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00117"></a>00117 <span class="comment"></span>
<a name="l00118"></a>00118 <span class="comment">  /// Retrieve the result type for a function reference.</span>
<a name="l00119"></a>00119 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00120"></a><a class="code" href="a00350.html">00120</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res(&amp;)(_ArgTypes...)&gt;
<a name="l00121"></a>00121     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00122"></a>00122 
<a name="l00123"></a>00123   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00124"></a>00124     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res(&amp;)(_ArgTypes......)&gt;
<a name="l00125"></a>00125     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00126"></a>00126 <span class="comment"></span>
<a name="l00127"></a>00127 <span class="comment">  /// Retrieve the result type for a function pointer.</span>
<a name="l00128"></a>00128 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00129"></a><a class="code" href="a00351.html">00129</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res(*)(_ArgTypes...)&gt;
<a name="l00130"></a>00130     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00131"></a>00131 
<a name="l00132"></a>00132   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00133"></a>00133     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res(*)(_ArgTypes......)&gt;
<a name="l00134"></a>00134     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00135"></a>00135 <span class="comment"></span>
<a name="l00136"></a>00136 <span class="comment">  /// Retrieve result type for a member function pointer.</span>
<a name="l00137"></a>00137 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00138"></a><a class="code" href="a00356.html">00138</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes...)&gt;
<a name="l00139"></a>00139     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00140"></a>00140 
<a name="l00141"></a>00141   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00142"></a>00142     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes......)&gt;
<a name="l00143"></a>00143     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00144"></a>00144 <span class="comment"></span>
<a name="l00145"></a>00145 <span class="comment">  /// Retrieve result type for a const member function pointer.</span>
<a name="l00146"></a>00146 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00147"></a><a class="code" href="a00353.html">00147</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes...) const&gt;
<a name="l00148"></a>00148     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00149"></a>00149 
<a name="l00150"></a>00150   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00151"></a>00151     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes......) const&gt;
<a name="l00152"></a>00152     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00153"></a>00153 <span class="comment"></span>
<a name="l00154"></a>00154 <span class="comment">  /// Retrieve result type for a volatile member function pointer.</span>
<a name="l00155"></a>00155 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00156"></a><a class="code" href="a00355.html">00156</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes...) volatile&gt;
<a name="l00157"></a>00157     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00158"></a>00158 
<a name="l00159"></a>00159   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00160"></a>00160     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes......) volatile&gt;
<a name="l00161"></a>00161     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00162"></a>00162 <span class="comment"></span>
<a name="l00163"></a>00163 <span class="comment">  /// Retrieve result type for a const volatile member function pointer.</span>
<a name="l00164"></a>00164 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00165"></a><a class="code" href="a00354.html">00165</a>     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes...)
<a name="l00166"></a>00166                   const volatile&gt;
<a name="l00167"></a>00167     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00168"></a>00168 
<a name="l00169"></a>00169   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00170"></a>00170     <span class="keyword">struct </span><a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;_Res (_Class::*)(_ArgTypes......)
<a name="l00171"></a>00171                   const volatile&gt;
<a name="l00172"></a>00172     { <span class="keyword">typedef</span> _Res result_type; };
<a name="l00173"></a>00173 <span class="comment"></span>
<a name="l00174"></a>00174 <span class="comment">  /**</span>
<a name="l00175"></a>00175 <span class="comment">   *  Strip top-level cv-qualifiers from the function object and let</span>
<a name="l00176"></a>00176 <span class="comment">   *  _Weak_result_type_impl perform the real work.</span>
<a name="l00177"></a>00177 <span class="comment">  */</span>
<a name="l00178"></a>00178   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l00179"></a><a class="code" href="a00243.html">00179</a>     <span class="keyword">struct </span><a class="code" href="a00243.html">_Weak_result_type</a>
<a name="l00180"></a>00180     : <a class="code" href="a00244.html">_Weak_result_type_impl</a>&lt;typename remove_cv&lt;_Functor&gt;::type&gt;
<a name="l00181"></a>00181     { };
<a name="l00182"></a>00182 <span class="comment"></span>
<a name="l00183"></a>00183 <span class="comment">  /// Determines if the type _Tp derives from unary_function.</span>
<a name="l00184"></a>00184 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00185"></a><a class="code" href="a00320.html">00185</a>     <span class="keyword">struct </span><a class="code" href="a00320.html" title="Determines if the type _Tp derives from unary_function.">_Derives_from_unary_function</a> : __sfinae_types
<a name="l00186"></a>00186     {
<a name="l00187"></a>00187     <span class="keyword">private</span>:
<a name="l00188"></a>00188       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _Res&gt;
<a name="l00189"></a>00189     <span class="keyword">static</span> __one __test(<span class="keyword">const</span> <span class="keyword">volatile</span> <a class="code" href="a00723.html">unary_function&lt;_T1, _Res&gt;</a>*);
<a name="l00190"></a>00190 
<a name="l00191"></a>00191       <span class="comment">// It&#39;s tempting to change &quot;...&quot; to const volatile void*, but</span>
<a name="l00192"></a>00192       <span class="comment">// that fails when _Tp is a function type.</span>
<a name="l00193"></a>00193       <span class="keyword">static</span> __two __test(...);
<a name="l00194"></a>00194 
<a name="l00195"></a>00195     <span class="keyword">public</span>:
<a name="l00196"></a>00196       <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> value = <span class="keyword">sizeof</span>(__test((_Tp*)0)) == 1;
<a name="l00197"></a>00197     };
<a name="l00198"></a>00198 <span class="comment"></span>
<a name="l00199"></a>00199 <span class="comment">  /// Determines if the type _Tp derives from binary_function.</span>
<a name="l00200"></a>00200 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00201"></a><a class="code" href="a00319.html">00201</a>     <span class="keyword">struct </span><a class="code" href="a00319.html" title="Determines if the type _Tp derives from binary_function.">_Derives_from_binary_function</a> : __sfinae_types
<a name="l00202"></a>00202     {
<a name="l00203"></a>00203     <span class="keyword">private</span>:
<a name="l00204"></a>00204       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2, <span class="keyword">typename</span> _Res&gt;
<a name="l00205"></a>00205     <span class="keyword">static</span> __one __test(<span class="keyword">const</span> <span class="keyword">volatile</span> <a class="code" href="a00254.html">binary_function&lt;_T1, _T2, _Res&gt;</a>*);
<a name="l00206"></a>00206 
<a name="l00207"></a>00207       <span class="comment">// It&#39;s tempting to change &quot;...&quot; to const volatile void*, but</span>
<a name="l00208"></a>00208       <span class="comment">// that fails when _Tp is a function type.</span>
<a name="l00209"></a>00209       <span class="keyword">static</span> __two __test(...);
<a name="l00210"></a>00210 
<a name="l00211"></a>00211     <span class="keyword">public</span>:
<a name="l00212"></a>00212       <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> value = <span class="keyword">sizeof</span>(__test((_Tp*)0)) == 1;
<a name="l00213"></a>00213     };
<a name="l00214"></a>00214 <span class="comment"></span>
<a name="l00215"></a>00215 <span class="comment">  /**</span>
<a name="l00216"></a>00216 <span class="comment">   * Invoke a function object, which may be either a member pointer or a</span>
<a name="l00217"></a>00217 <span class="comment">   * function object. The first parameter will tell which.</span>
<a name="l00218"></a>00218 <span class="comment">   */</span>
<a name="l00219"></a>00219   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _Args&gt;
<a name="l00220"></a>00220     <span class="keyword">inline</span>
<a name="l00221"></a>00221     <span class="keyword">typename</span> <a class="code" href="a00255.html" title="enable_if">enable_if</a>&lt;
<a name="l00222"></a>00222          (!is_member_pointer&lt;_Functor&gt;::value
<a name="l00223"></a>00223           &amp;&amp; !<a class="code" href="a00547.html" title="is_function">is_function&lt;_Functor&gt;::value</a>
<a name="l00224"></a>00224           &amp;&amp; !<a class="code" href="a00547.html" title="is_function">is_function&lt;typename remove_pointer&lt;_Functor&gt;::type</a>&gt;::value),
<a name="l00225"></a>00225          <span class="keyword">typename</span> result_of&lt;_Functor(_Args&amp;&amp;...)&gt;::type
<a name="l00226"></a>00226        &gt;::type
<a name="l00227"></a><a class="code" href="a01137.html#a8e0a457d7544b390fa7835b1696be1ed">00227</a>     <a class="code" href="a01137.html#a8e0a457d7544b390fa7835b1696be1ed">__invoke</a>(_Functor&amp; __f, _Args&amp;&amp;... __args)
<a name="l00228"></a>00228     {
<a name="l00229"></a>00229       <span class="keywordflow">return</span> __f(std::forward&lt;_Args&gt;(__args)...);
<a name="l00230"></a>00230     }
<a name="l00231"></a>00231 
<a name="l00232"></a>00232   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _Args&gt;
<a name="l00233"></a>00233     <span class="keyword">inline</span>
<a name="l00234"></a>00234     <span class="keyword">typename</span> enable_if&lt;
<a name="l00235"></a>00235              (is_member_pointer&lt;_Functor&gt;::value
<a name="l00236"></a>00236               &amp;&amp; !is_function&lt;_Functor&gt;::value
<a name="l00237"></a>00237               &amp;&amp; !is_function&lt;typename remove_pointer&lt;_Functor&gt;::type&gt;::value),
<a name="l00238"></a>00238              <span class="keyword">typename</span> result_of&lt;_Functor(_Args&amp;&amp;...)&gt;::type
<a name="l00239"></a>00239            &gt;::type
<a name="l00240"></a>00240     <a class="code" href="a01137.html#a8e0a457d7544b390fa7835b1696be1ed">__invoke</a>(_Functor&amp; __f, _Args&amp;&amp;... __args)
<a name="l00241"></a>00241     {
<a name="l00242"></a>00242       <span class="keywordflow">return</span> <a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2" title="Returns a function object that forwards to the member pointer pm.">mem_fn</a>(__f)(std::forward&lt;_Args&gt;(__args)...);
<a name="l00243"></a>00243     }
<a name="l00244"></a>00244 
<a name="l00245"></a>00245   <span class="comment">// To pick up function references (that will become function pointers)</span>
<a name="l00246"></a>00246   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _Args&gt;
<a name="l00247"></a>00247     <span class="keyword">inline</span>
<a name="l00248"></a>00248     <span class="keyword">typename</span> enable_if&lt;
<a name="l00249"></a>00249          (is_pointer&lt;_Functor&gt;::value
<a name="l00250"></a>00250           &amp;&amp; is_function&lt;typename remove_pointer&lt;_Functor&gt;::type&gt;::value),
<a name="l00251"></a>00251          <span class="keyword">typename</span> result_of&lt;_Functor(_Args&amp;&amp;...)&gt;::type
<a name="l00252"></a>00252        &gt;::type
<a name="l00253"></a>00253     <a class="code" href="a01137.html#a8e0a457d7544b390fa7835b1696be1ed">__invoke</a>(_Functor __f, _Args&amp;&amp;... __args)
<a name="l00254"></a>00254     {
<a name="l00255"></a>00255       <span class="keywordflow">return</span> __f(std::forward&lt;_Args&gt;(__args)...);
<a name="l00256"></a>00256     }
<a name="l00257"></a>00257 <span class="comment"></span>
<a name="l00258"></a>00258 <span class="comment">  /**</span>
<a name="l00259"></a>00259 <span class="comment">   *  Knowing which of unary_function and binary_function _Tp derives</span>
<a name="l00260"></a>00260 <span class="comment">   *  from, derives from the same and ensures that reference_wrapper</span>
<a name="l00261"></a>00261 <span class="comment">   *  will have a weak result type. See cases below.</span>
<a name="l00262"></a>00262 <span class="comment">   */</span>
<a name="l00263"></a>00263   <span class="keyword">template</span>&lt;<span class="keywordtype">bool</span> _Unary, <span class="keywordtype">bool</span> _Binary, <span class="keyword">typename</span> _Tp&gt;
<a name="l00264"></a>00264     <span class="keyword">struct </span>_Reference_wrapper_base_impl;
<a name="l00265"></a>00265 
<a name="l00266"></a>00266   <span class="comment">// None of the nested argument types.</span>
<a name="l00267"></a>00267   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00268"></a>00268     <span class="keyword">struct </span>_Reference_wrapper_base_impl&lt;false, false, _Tp&gt;
<a name="l00269"></a>00269     : _Weak_result_type&lt;_Tp&gt;
<a name="l00270"></a>00270     { };
<a name="l00271"></a>00271 
<a name="l00272"></a>00272   <span class="comment">// Nested argument_type only.</span>
<a name="l00273"></a>00273   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00274"></a>00274     <span class="keyword">struct </span>_Reference_wrapper_base_impl&lt;true, false, _Tp&gt;
<a name="l00275"></a>00275     : _Weak_result_type&lt;_Tp&gt;
<a name="l00276"></a>00276     {
<a name="l00277"></a>00277       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Tp::argument_type argument_type;
<a name="l00278"></a>00278     };
<a name="l00279"></a>00279 
<a name="l00280"></a>00280   <span class="comment">// Nested first_argument_type and second_argument_type only.</span>
<a name="l00281"></a>00281   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00282"></a>00282     <span class="keyword">struct </span>_Reference_wrapper_base_impl&lt;false, true, _Tp&gt;
<a name="l00283"></a>00283     : _Weak_result_type&lt;_Tp&gt;
<a name="l00284"></a>00284     {
<a name="l00285"></a>00285       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Tp::first_argument_type first_argument_type;
<a name="l00286"></a>00286       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Tp::second_argument_type second_argument_type;
<a name="l00287"></a>00287     };
<a name="l00288"></a>00288 
<a name="l00289"></a>00289   <span class="comment">// All the nested argument types.</span>
<a name="l00290"></a>00290    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00291"></a>00291     <span class="keyword">struct </span>_Reference_wrapper_base_impl&lt;true, true, _Tp&gt;
<a name="l00292"></a>00292     : _Weak_result_type&lt;_Tp&gt;
<a name="l00293"></a>00293     {
<a name="l00294"></a>00294       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Tp::argument_type argument_type;
<a name="l00295"></a>00295       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Tp::first_argument_type first_argument_type;
<a name="l00296"></a>00296       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Tp::second_argument_type second_argument_type;
<a name="l00297"></a>00297     };
<a name="l00298"></a>00298 
<a name="l00299"></a>00299   <a class="code" href="a01205.html#ga5483c2bfe929a5938ce633f378db2d55">_GLIBCXX_HAS_NESTED_TYPE</a>(argument_type)
<a name="l00300"></a>00300   <a class="code" href="a01205.html#ga5483c2bfe929a5938ce633f378db2d55">_GLIBCXX_HAS_NESTED_TYPE</a>(first_argument_type)
<a name="l00301"></a>00301   <a class="code" href="a01205.html#ga5483c2bfe929a5938ce633f378db2d55">_GLIBCXX_HAS_NESTED_TYPE</a>(second_argument_type)
<a name="l00302"></a>00302 <span class="comment"></span>
<a name="l00303"></a>00303 <span class="comment">  /**</span>
<a name="l00304"></a>00304 <span class="comment">   *  Derives from unary_function or binary_function when it</span>
<a name="l00305"></a>00305 <span class="comment">   *  can. Specializations handle all of the easy cases. The primary</span>
<a name="l00306"></a>00306 <span class="comment">   *  template determines what to do with a class type, which may</span>
<a name="l00307"></a>00307 <span class="comment">   *  derive from both unary_function and binary_function.</span>
<a name="l00308"></a>00308 <span class="comment">  */</span>
<a name="l00309"></a>00309   template&lt;typename _Tp&gt;
<a name="l00310"></a><a class="code" href="a00240.html">00310</a>     struct <a class="code" href="a00240.html">_Reference_wrapper_base</a>
<a name="l00311"></a>00311     : _Reference_wrapper_base_impl&lt;
<a name="l00312"></a>00312       __has_argument_type&lt;_Tp&gt;::value,
<a name="l00313"></a>00313       __has_first_argument_type&lt;_Tp&gt;::value
<a name="l00314"></a>00314       &amp;&amp; __has_second_argument_type&lt;_Tp&gt;::value,
<a name="l00315"></a>00315       _Tp&gt;
<a name="l00316"></a>00316     { };
<a name="l00317"></a>00317 
<a name="l00318"></a>00318   <span class="comment">// - a function type (unary)</span>
<a name="l00319"></a>00319   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00320"></a>00320     <span class="keyword">struct </span><a class="code" href="a00240.html">_Reference_wrapper_base</a>&lt;_Res(_T1)&gt;
<a name="l00321"></a>00321     : <a class="code" href="a00723.html">unary_function</a>&lt;_T1, _Res&gt;
<a name="l00322"></a>00322     { };
<a name="l00323"></a>00323 
<a name="l00324"></a>00324   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00325"></a>00325     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1) const&gt;
<a name="l00326"></a>00326     : unary_function&lt;_T1, _Res&gt;
<a name="l00327"></a>00327     { };
<a name="l00328"></a>00328 
<a name="l00329"></a>00329   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00330"></a>00330     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1) volatile&gt;
<a name="l00331"></a>00331     : unary_function&lt;_T1, _Res&gt;
<a name="l00332"></a>00332     { };
<a name="l00333"></a>00333 
<a name="l00334"></a>00334   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00335"></a>00335     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1) const volatile&gt;
<a name="l00336"></a>00336     : unary_function&lt;_T1, _Res&gt;
<a name="l00337"></a>00337     { };
<a name="l00338"></a>00338 
<a name="l00339"></a>00339   <span class="comment">// - a function type (binary)</span>
<a name="l00340"></a>00340   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00341"></a>00341     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1, _T2)&gt;
<a name="l00342"></a>00342     : binary_function&lt;_T1, _T2, _Res&gt;
<a name="l00343"></a>00343     { };
<a name="l00344"></a>00344 
<a name="l00345"></a>00345   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00346"></a>00346     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1, _T2) const&gt;
<a name="l00347"></a>00347     : binary_function&lt;_T1, _T2, _Res&gt;
<a name="l00348"></a>00348     { };
<a name="l00349"></a>00349 
<a name="l00350"></a>00350   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00351"></a>00351     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1, _T2) volatile&gt;
<a name="l00352"></a>00352     : binary_function&lt;_T1, _T2, _Res&gt;
<a name="l00353"></a>00353     { };
<a name="l00354"></a>00354 
<a name="l00355"></a>00355   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00356"></a>00356     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(_T1, _T2) const volatile&gt;
<a name="l00357"></a>00357     : binary_function&lt;_T1, _T2, _Res&gt;
<a name="l00358"></a>00358     { };
<a name="l00359"></a>00359 
<a name="l00360"></a>00360   <span class="comment">// - a function pointer type (unary)</span>
<a name="l00361"></a>00361   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00362"></a>00362     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(*)(_T1)&gt;
<a name="l00363"></a>00363     : unary_function&lt;_T1, _Res&gt;
<a name="l00364"></a>00364     { };
<a name="l00365"></a>00365 
<a name="l00366"></a>00366   <span class="comment">// - a function pointer type (binary)</span>
<a name="l00367"></a>00367   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00368"></a>00368     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res(*)(_T1, _T2)&gt;
<a name="l00369"></a>00369     : binary_function&lt;_T1, _T2, _Res&gt;
<a name="l00370"></a>00370     { };
<a name="l00371"></a>00371 
<a name="l00372"></a>00372   <span class="comment">// - a pointer to member function type (unary, no qualifiers)</span>
<a name="l00373"></a>00373   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00374"></a>00374     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)()&gt;
<a name="l00375"></a>00375     : unary_function&lt;_T1*, _Res&gt;
<a name="l00376"></a>00376     { };
<a name="l00377"></a>00377 
<a name="l00378"></a>00378   <span class="comment">// - a pointer to member function type (binary, no qualifiers)</span>
<a name="l00379"></a>00379   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00380"></a>00380     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)(_T2)&gt;
<a name="l00381"></a>00381     : binary_function&lt;_T1*, _T2, _Res&gt;
<a name="l00382"></a>00382     { };
<a name="l00383"></a>00383 
<a name="l00384"></a>00384   <span class="comment">// - a pointer to member function type (unary, const)</span>
<a name="l00385"></a>00385   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00386"></a>00386     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)() const&gt;
<a name="l00387"></a>00387     : unary_function&lt;const _T1*, _Res&gt;
<a name="l00388"></a>00388     { };
<a name="l00389"></a>00389 
<a name="l00390"></a>00390   <span class="comment">// - a pointer to member function type (binary, const)</span>
<a name="l00391"></a>00391   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00392"></a>00392     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)(_T2) const&gt;
<a name="l00393"></a>00393     : binary_function&lt;const _T1*, _T2, _Res&gt;
<a name="l00394"></a>00394     { };
<a name="l00395"></a>00395 
<a name="l00396"></a>00396   <span class="comment">// - a pointer to member function type (unary, volatile)</span>
<a name="l00397"></a>00397   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00398"></a>00398     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)() volatile&gt;
<a name="l00399"></a>00399     : unary_function&lt;volatile _T1*, _Res&gt;
<a name="l00400"></a>00400     { };
<a name="l00401"></a>00401 
<a name="l00402"></a>00402   <span class="comment">// - a pointer to member function type (binary, volatile)</span>
<a name="l00403"></a>00403   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00404"></a>00404     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)(_T2) volatile&gt;
<a name="l00405"></a>00405     : binary_function&lt;volatile _T1*, _T2, _Res&gt;
<a name="l00406"></a>00406     { };
<a name="l00407"></a>00407 
<a name="l00408"></a>00408   <span class="comment">// - a pointer to member function type (unary, const volatile)</span>
<a name="l00409"></a>00409   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00410"></a>00410     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)() const volatile&gt;
<a name="l00411"></a>00411     : unary_function&lt;const volatile _T1*, _Res&gt;
<a name="l00412"></a>00412     { };
<a name="l00413"></a>00413 
<a name="l00414"></a>00414   <span class="comment">// - a pointer to member function type (binary, const volatile)</span>
<a name="l00415"></a>00415   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00416"></a>00416     <span class="keyword">struct </span>_Reference_wrapper_base&lt;_Res (_T1::*)(_T2) const volatile&gt;
<a name="l00417"></a>00417     : binary_function&lt;const volatile _T1*, _T2, _Res&gt;
<a name="l00418"></a>00418     { };
<a name="l00419"></a>00419 <span class="comment"></span>
<a name="l00420"></a>00420 <span class="comment">  /**</span>
<a name="l00421"></a>00421 <span class="comment">   *  @brief Primary class template for reference_wrapper.</span>
<a name="l00422"></a>00422 <span class="comment">   *  @ingroup functors</span>
<a name="l00423"></a>00423 <span class="comment">   *  @{</span>
<a name="l00424"></a>00424 <span class="comment">   */</span>
<a name="l00425"></a>00425   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00426"></a><a class="code" href="a00681.html">00426</a>     <span class="keyword">class </span><a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper</a>
<a name="l00427"></a>00427     : <span class="keyword">public</span> <a class="code" href="a00240.html">_Reference_wrapper_base</a>&lt;typename remove_cv&lt;_Tp&gt;::type&gt;
<a name="l00428"></a>00428     {
<a name="l00429"></a>00429       _Tp* _M_data;
<a name="l00430"></a>00430 
<a name="l00431"></a>00431     <span class="keyword">public</span>:
<a name="l00432"></a>00432       <span class="keyword">typedef</span> _Tp type;
<a name="l00433"></a>00433 
<a name="l00434"></a>00434       <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper</a>(_Tp&amp; __indata)
<a name="l00435"></a>00435       : _M_data(std::__addressof(__indata))
<a name="l00436"></a>00436       { }
<a name="l00437"></a>00437 
<a name="l00438"></a>00438       <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper</a>(_Tp&amp;&amp;) = <span class="keyword">delete</span>;
<a name="l00439"></a>00439 
<a name="l00440"></a>00440       <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper</a>(<span class="keyword">const</span> <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Tp&gt;</a>&amp; __inref):
<a name="l00441"></a>00441       _M_data(__inref._M_data)
<a name="l00442"></a>00442       { }
<a name="l00443"></a>00443 
<a name="l00444"></a>00444       <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper</a>&amp;
<a name="l00445"></a>00445       operator=(<span class="keyword">const</span> <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Tp&gt;</a>&amp; __inref)
<a name="l00446"></a>00446       {
<a name="l00447"></a>00447     _M_data = __inref._M_data;
<a name="l00448"></a>00448     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00449"></a>00449       }
<a name="l00450"></a>00450 
<a name="l00451"></a>00451       operator _Tp&amp;()<span class="keyword"> const</span>
<a name="l00452"></a>00452 <span class="keyword">      </span>{ <span class="keywordflow">return</span> this-&gt;<span class="keyword">get</span>(); }
<a name="l00453"></a>00453 
<a name="l00454"></a>00454       _Tp&amp;
<a name="l00455"></a>00455       <span class="keyword">get</span>() <span class="keyword">const</span>
<a name="l00456"></a>00456       { <span class="keywordflow">return</span> *_M_data; }
<a name="l00457"></a>00457 
<a name="l00458"></a>00458       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l00459"></a>00459     <span class="keyword">typename</span> result_of&lt;_Tp&amp;(_Args&amp;&amp;...)&gt;::type
<a name="l00460"></a>00460     operator()(_Args&amp;&amp;... __args)<span class="keyword"> const</span>
<a name="l00461"></a>00461 <span class="keyword">    </span>{
<a name="l00462"></a>00462       <span class="keywordflow">return</span> <a class="code" href="a01137.html#a8e0a457d7544b390fa7835b1696be1ed">__invoke</a>(<span class="keyword">get</span>(), std::forward&lt;_Args&gt;(__args)...);
<a name="l00463"></a>00463     }
<a name="l00464"></a>00464     };
<a name="l00465"></a>00465 
<a name="l00466"></a>00466 <span class="comment"></span>
<a name="l00467"></a>00467 <span class="comment">  /// Denotes a reference should be taken to a variable.</span>
<a name="l00468"></a>00468 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00469"></a>00469     <span class="keyword">inline</span> <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Tp&gt;</a>
<a name="l00470"></a><a class="code" href="a01137.html#a017c8c756bc24807f3bc0917528636dc">00470</a>     <a class="code" href="a01137.html#a017c8c756bc24807f3bc0917528636dc" title="Denotes a reference should be taken to a variable.">ref</a>(_Tp&amp; __t)
<a name="l00471"></a>00471     { <span class="keywordflow">return</span> <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Tp&gt;</a>(__t); }
<a name="l00472"></a>00472 <span class="comment"></span>
<a name="l00473"></a>00473 <span class="comment">  /// Denotes a const reference should be taken to a variable.</span>
<a name="l00474"></a>00474 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00475"></a>00475     <span class="keyword">inline</span> reference_wrapper&lt;const _Tp&gt;
<a name="l00476"></a><a class="code" href="a01137.html#a92016c5518a6597d90120fccdb3f0838">00476</a>     <a class="code" href="a01137.html#a92016c5518a6597d90120fccdb3f0838" title="Denotes a const reference should be taken to a variable.">cref</a>(<span class="keyword">const</span> _Tp&amp; __t)
<a name="l00477"></a>00477     { <span class="keywordflow">return</span> <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;const _Tp&gt;</a>(__t); }
<a name="l00478"></a>00478 
<a name="l00479"></a>00479   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00480"></a>00480     <span class="keywordtype">void</span> <a class="code" href="a01137.html#a017c8c756bc24807f3bc0917528636dc" title="Denotes a reference should be taken to a variable.">ref</a>(<span class="keyword">const</span> _Tp&amp;&amp;) = <span class="keyword">delete</span>;
<a name="l00481"></a>00481 
<a name="l00482"></a>00482   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00483"></a>00483     <span class="keywordtype">void</span> <a class="code" href="a01137.html#a92016c5518a6597d90120fccdb3f0838" title="Denotes a const reference should be taken to a variable.">cref</a>(<span class="keyword">const</span> _Tp&amp;&amp;) = <span class="keyword">delete</span>;
<a name="l00484"></a>00484 <span class="comment"></span>
<a name="l00485"></a>00485 <span class="comment">  /// Partial specialization.</span>
<a name="l00486"></a>00486 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00487"></a>00487     <span class="keyword">inline</span> reference_wrapper&lt;_Tp&gt;
<a name="l00488"></a><a class="code" href="a01137.html#ad1ebd27305d5c48895b357a7d7ec157f">00488</a>     <a class="code" href="a01137.html#a017c8c756bc24807f3bc0917528636dc" title="Denotes a reference should be taken to a variable.">ref</a>(<a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Tp&gt;</a> __t)
<a name="l00489"></a>00489     { <span class="keywordflow">return</span> <a class="code" href="a01137.html#a017c8c756bc24807f3bc0917528636dc" title="Denotes a reference should be taken to a variable.">ref</a>(__t.get()); }
<a name="l00490"></a>00490 <span class="comment"></span>
<a name="l00491"></a>00491 <span class="comment">  /// Partial specialization.</span>
<a name="l00492"></a>00492 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00493"></a>00493     <span class="keyword">inline</span> reference_wrapper&lt;const _Tp&gt;
<a name="l00494"></a><a class="code" href="a01137.html#ab35d483fded6743038b447339cd70a5b">00494</a>     <a class="code" href="a01137.html#a92016c5518a6597d90120fccdb3f0838" title="Denotes a const reference should be taken to a variable.">cref</a>(<a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Tp&gt;</a> __t)
<a name="l00495"></a>00495     { <span class="keywordflow">return</span> <a class="code" href="a01137.html#a92016c5518a6597d90120fccdb3f0838" title="Denotes a const reference should be taken to a variable.">cref</a>(__t.get()); }
<a name="l00496"></a>00496 
<a name="l00497"></a>00497   <span class="comment">// @} group functors</span>
<a name="l00498"></a>00498 
<a name="l00499"></a>00499   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _MemberPo<span class="keywordtype">int</span>er&gt;
<a name="l00500"></a>00500     <span class="keyword">class </span>_Mem_fn;
<a name="l00501"></a>00501 <span class="comment"></span>
<a name="l00502"></a>00502 <span class="comment">  /**</span>
<a name="l00503"></a>00503 <span class="comment">   * Derives from @c unary_function or @c binary_function, or perhaps</span>
<a name="l00504"></a>00504 <span class="comment">   * nothing, depending on the number of arguments provided. The</span>
<a name="l00505"></a>00505 <span class="comment">   * primary template is the basis case, which derives nothing.</span>
<a name="l00506"></a>00506 <span class="comment">   */</span>
<a name="l00507"></a>00507   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00508"></a><a class="code" href="a00238.html">00508</a>     <span class="keyword">struct </span><a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a> { };
<a name="l00509"></a>00509 <span class="comment"></span>
<a name="l00510"></a>00510 <span class="comment">  /// Derives from @c unary_function, as appropriate.</span>
<a name="l00511"></a>00511 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1&gt;
<a name="l00512"></a><a class="code" href="a00332.html">00512</a>     <span class="keyword">struct </span><a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, _T1&gt;
<a name="l00513"></a>00513     : std::<a class="code" href="a00723.html">unary_function</a>&lt;_T1, _Res&gt; { };
<a name="l00514"></a>00514 <span class="comment"></span>
<a name="l00515"></a>00515 <span class="comment">  /// Derives from @c binary_function, as appropriate.</span>
<a name="l00516"></a>00516 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _T1, <span class="keyword">typename</span> _T2&gt;
<a name="l00517"></a><a class="code" href="a00333.html">00517</a>     <span class="keyword">struct </span><a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, _T1, _T2&gt;
<a name="l00518"></a>00518     : std::<a class="code" href="a00254.html">binary_function</a>&lt;_T1, _T2, _Res&gt; { };
<a name="l00519"></a>00519 <span class="comment"></span>
<a name="l00520"></a>00520 <span class="comment">  /// Implementation of @c mem_fn for member function pointers.</span>
<a name="l00521"></a>00521 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00522"></a><a class="code" href="a00339.html">00522</a>     <span class="keyword">class </span>_Mem_fn&lt;_Res (_Class::*)(_ArgTypes...)&gt;
<a name="l00523"></a>00523     : <span class="keyword">public</span> <a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, _Class*, _ArgTypes...&gt;
<a name="l00524"></a>00524     {
<a name="l00525"></a>00525       <span class="keyword">typedef</span> _Res (_Class::*_Functor)(_ArgTypes...);
<a name="l00526"></a>00526 
<a name="l00527"></a>00527       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00528"></a>00528     _Res
<a name="l00529"></a>00529     _M_call(_Tp&amp; __object, <span class="keyword">const</span> <span class="keyword">volatile</span> _Class *,
<a name="l00530"></a>00530         _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00531"></a>00531 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00532"></a>00532 
<a name="l00533"></a>00533       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00534"></a>00534     _Res
<a name="l00535"></a>00535     _M_call(_Tp&amp; __ptr, <span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00536"></a>00536 <span class="keyword">    </span>{ <span class="keywordflow">return</span> ((*__ptr).*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00537"></a>00537 
<a name="l00538"></a>00538     <span class="keyword">public</span>:
<a name="l00539"></a>00539       <span class="keyword">typedef</span> _Res result_type;
<a name="l00540"></a>00540 
<a name="l00541"></a>00541       <span class="keyword">explicit</span> _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
<a name="l00542"></a>00542 
<a name="l00543"></a>00543       <span class="comment">// Handle objects</span>
<a name="l00544"></a>00544       _Res
<a name="l00545"></a>00545       operator()(_Class&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00546"></a>00546 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00547"></a>00547 
<a name="l00548"></a>00548       <span class="comment">// Handle pointers</span>
<a name="l00549"></a>00549       _Res
<a name="l00550"></a>00550       operator()(_Class* __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00551"></a>00551 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object-&gt;*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00552"></a>00552 
<a name="l00553"></a>00553       <span class="comment">// Handle smart pointers, references and pointers to derived</span>
<a name="l00554"></a>00554       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00555"></a>00555     _Res
<a name="l00556"></a>00556     operator()(_Tp&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00557"></a>00557 <span class="keyword">    </span>{
<a name="l00558"></a>00558       <span class="keywordflow">return</span> _M_call(__object, &amp;__object,
<a name="l00559"></a>00559           std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l00560"></a>00560     }
<a name="l00561"></a>00561 
<a name="l00562"></a>00562     <span class="keyword">private</span>:
<a name="l00563"></a>00563       _Functor __pmf;
<a name="l00564"></a>00564     };
<a name="l00565"></a>00565 <span class="comment"></span>
<a name="l00566"></a>00566 <span class="comment">  /// Implementation of @c mem_fn for const member function pointers.</span>
<a name="l00567"></a>00567 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00568"></a><a class="code" href="a00336.html">00568</a>     <span class="keyword">class </span>_Mem_fn&lt;_Res (_Class::*)(_ArgTypes...) const&gt;
<a name="l00569"></a>00569     : <span class="keyword">public</span> <a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, const _Class*,
<a name="l00570"></a>00570                          _ArgTypes...&gt;
<a name="l00571"></a>00571     {
<a name="l00572"></a>00572       <span class="keyword">typedef</span> _Res (_Class::*_Functor)(_ArgTypes...) <span class="keyword">const</span>;
<a name="l00573"></a>00573 
<a name="l00574"></a>00574       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00575"></a>00575     _Res
<a name="l00576"></a>00576     _M_call(_Tp&amp; __object, <span class="keyword">const</span> <span class="keyword">volatile</span> _Class *,
<a name="l00577"></a>00577         _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00578"></a>00578 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00579"></a>00579 
<a name="l00580"></a>00580       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00581"></a>00581     _Res
<a name="l00582"></a>00582     _M_call(_Tp&amp; __ptr, <span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00583"></a>00583 <span class="keyword">    </span>{ <span class="keywordflow">return</span> ((*__ptr).*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00584"></a>00584 
<a name="l00585"></a>00585     <span class="keyword">public</span>:
<a name="l00586"></a>00586       <span class="keyword">typedef</span> _Res result_type;
<a name="l00587"></a>00587 
<a name="l00588"></a>00588       <span class="keyword">explicit</span> _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
<a name="l00589"></a>00589 
<a name="l00590"></a>00590       <span class="comment">// Handle objects</span>
<a name="l00591"></a>00591       _Res
<a name="l00592"></a>00592       operator()(<span class="keyword">const</span> _Class&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00593"></a>00593 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00594"></a>00594 
<a name="l00595"></a>00595       <span class="comment">// Handle pointers</span>
<a name="l00596"></a>00596       _Res
<a name="l00597"></a>00597       operator()(<span class="keyword">const</span> _Class* __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00598"></a>00598 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object-&gt;*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00599"></a>00599 
<a name="l00600"></a>00600       <span class="comment">// Handle smart pointers, references and pointers to derived</span>
<a name="l00601"></a>00601       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00602"></a>00602     _Res operator()(_Tp&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00603"></a>00603 <span class="keyword">    </span>{
<a name="l00604"></a>00604       <span class="keywordflow">return</span> _M_call(__object, &amp;__object,
<a name="l00605"></a>00605           std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l00606"></a>00606     }
<a name="l00607"></a>00607 
<a name="l00608"></a>00608     <span class="keyword">private</span>:
<a name="l00609"></a>00609       _Functor __pmf;
<a name="l00610"></a>00610     };
<a name="l00611"></a>00611 <span class="comment"></span>
<a name="l00612"></a>00612 <span class="comment">  /// Implementation of @c mem_fn for volatile member function pointers.</span>
<a name="l00613"></a>00613 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00614"></a><a class="code" href="a00338.html">00614</a>     <span class="keyword">class </span>_Mem_fn&lt;_Res (_Class::*)(_ArgTypes...) volatile&gt;
<a name="l00615"></a>00615     : <span class="keyword">public</span> <a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, volatile _Class*,
<a name="l00616"></a>00616                          _ArgTypes...&gt;
<a name="l00617"></a>00617     {
<a name="l00618"></a>00618       <span class="keyword">typedef</span> _Res (_Class::*_Functor)(_ArgTypes...) <span class="keyword">volatile</span>;
<a name="l00619"></a>00619 
<a name="l00620"></a>00620       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00621"></a>00621     _Res
<a name="l00622"></a>00622     _M_call(_Tp&amp; __object, <span class="keyword">const</span> <span class="keyword">volatile</span> _Class *,
<a name="l00623"></a>00623         _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00624"></a>00624 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00625"></a>00625 
<a name="l00626"></a>00626       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00627"></a>00627     _Res
<a name="l00628"></a>00628     _M_call(_Tp&amp; __ptr, <span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00629"></a>00629 <span class="keyword">    </span>{ <span class="keywordflow">return</span> ((*__ptr).*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00630"></a>00630 
<a name="l00631"></a>00631     <span class="keyword">public</span>:
<a name="l00632"></a>00632       <span class="keyword">typedef</span> _Res result_type;
<a name="l00633"></a>00633 
<a name="l00634"></a>00634       <span class="keyword">explicit</span> _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
<a name="l00635"></a>00635 
<a name="l00636"></a>00636       <span class="comment">// Handle objects</span>
<a name="l00637"></a>00637       _Res
<a name="l00638"></a>00638       operator()(<span class="keyword">volatile</span> _Class&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00639"></a>00639 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00640"></a>00640 
<a name="l00641"></a>00641       <span class="comment">// Handle pointers</span>
<a name="l00642"></a>00642       _Res
<a name="l00643"></a>00643       operator()(<span class="keyword">volatile</span> _Class* __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00644"></a>00644 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object-&gt;*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00645"></a>00645 
<a name="l00646"></a>00646       <span class="comment">// Handle smart pointers, references and pointers to derived</span>
<a name="l00647"></a>00647       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00648"></a>00648     _Res
<a name="l00649"></a>00649     operator()(_Tp&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00650"></a>00650 <span class="keyword">    </span>{
<a name="l00651"></a>00651       <span class="keywordflow">return</span> _M_call(__object, &amp;__object,
<a name="l00652"></a>00652           std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l00653"></a>00653     }
<a name="l00654"></a>00654 
<a name="l00655"></a>00655     <span class="keyword">private</span>:
<a name="l00656"></a>00656       _Functor __pmf;
<a name="l00657"></a>00657     };
<a name="l00658"></a>00658 <span class="comment"></span>
<a name="l00659"></a>00659 <span class="comment">  /// Implementation of @c mem_fn for const volatile member function pointers.</span>
<a name="l00660"></a>00660 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l00661"></a><a class="code" href="a00337.html">00661</a>     <span class="keyword">class </span>_Mem_fn&lt;_Res (_Class::*)(_ArgTypes...) const volatile&gt;
<a name="l00662"></a>00662     : <span class="keyword">public</span> <a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, const volatile _Class*,
<a name="l00663"></a>00663                          _ArgTypes...&gt;
<a name="l00664"></a>00664     {
<a name="l00665"></a>00665       <span class="keyword">typedef</span> _Res (_Class::*_Functor)(_ArgTypes...) <span class="keyword">const</span> <span class="keyword">volatile</span>;
<a name="l00666"></a>00666 
<a name="l00667"></a>00667       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00668"></a>00668     _Res
<a name="l00669"></a>00669     _M_call(_Tp&amp; __object, <span class="keyword">const</span> <span class="keyword">volatile</span> _Class *,
<a name="l00670"></a>00670         _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00671"></a>00671 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00672"></a>00672 
<a name="l00673"></a>00673       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00674"></a>00674     _Res
<a name="l00675"></a>00675     _M_call(_Tp&amp; __ptr, <span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span> *, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00676"></a>00676 <span class="keyword">    </span>{ <span class="keywordflow">return</span> ((*__ptr).*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00677"></a>00677 
<a name="l00678"></a>00678     <span class="keyword">public</span>:
<a name="l00679"></a>00679       <span class="keyword">typedef</span> _Res result_type;
<a name="l00680"></a>00680 
<a name="l00681"></a>00681       <span class="keyword">explicit</span> _Mem_fn(_Functor __pmf) : __pmf(__pmf) { }
<a name="l00682"></a>00682 
<a name="l00683"></a>00683       <span class="comment">// Handle objects</span>
<a name="l00684"></a>00684       _Res
<a name="l00685"></a>00685       operator()(<span class="keyword">const</span> <span class="keyword">volatile</span> _Class&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00686"></a>00686 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object.*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00687"></a>00687 
<a name="l00688"></a>00688       <span class="comment">// Handle pointers</span>
<a name="l00689"></a>00689       _Res
<a name="l00690"></a>00690       operator()(<span class="keyword">const</span> <span class="keyword">volatile</span> _Class* __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00691"></a>00691 <span class="keyword">      </span>{ <span class="keywordflow">return</span> (__object-&gt;*__pmf)(std::forward&lt;_ArgTypes&gt;(__args)...); }
<a name="l00692"></a>00692 
<a name="l00693"></a>00693       <span class="comment">// Handle smart pointers, references and pointers to derived</span>
<a name="l00694"></a>00694       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00695"></a>00695     _Res operator()(_Tp&amp; __object, _ArgTypes... __args)<span class="keyword"> const</span>
<a name="l00696"></a>00696 <span class="keyword">    </span>{
<a name="l00697"></a>00697       <span class="keywordflow">return</span> _M_call(__object, &amp;__object,
<a name="l00698"></a>00698           std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l00699"></a>00699     }
<a name="l00700"></a>00700 
<a name="l00701"></a>00701     <span class="keyword">private</span>:
<a name="l00702"></a>00702       _Functor __pmf;
<a name="l00703"></a>00703     };
<a name="l00704"></a>00704 
<a name="l00705"></a>00705 
<a name="l00706"></a>00706   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keywordtype">bool</span>&gt;
<a name="l00707"></a>00707     <span class="keyword">struct </span>_Mem_fn_const_or_non
<a name="l00708"></a>00708     {
<a name="l00709"></a>00709       <span class="keyword">typedef</span> <span class="keyword">const</span> _Tp&amp; type;
<a name="l00710"></a>00710     };
<a name="l00711"></a>00711 
<a name="l00712"></a>00712   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00713"></a>00713     <span class="keyword">struct </span>_Mem_fn_const_or_non&lt;_Tp, false&gt;
<a name="l00714"></a>00714     {
<a name="l00715"></a>00715       <span class="keyword">typedef</span> _Tp&amp; type;
<a name="l00716"></a>00716     };
<a name="l00717"></a>00717 
<a name="l00718"></a>00718   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Class&gt;
<a name="l00719"></a>00719     <span class="keyword">class </span>_Mem_fn&lt;_Res _Class::*&gt;
<a name="l00720"></a>00720     {
<a name="l00721"></a>00721       <span class="comment">// This bit of genius is due to Peter Dimov, improved slightly by</span>
<a name="l00722"></a>00722       <span class="comment">// Douglas Gregor.</span>
<a name="l00723"></a>00723       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00724"></a>00724     _Res&amp;
<a name="l00725"></a>00725     _M_call(_Tp&amp; __object, _Class *)<span class="keyword"> const</span>
<a name="l00726"></a>00726 <span class="keyword">    </span>{ <span class="keywordflow">return</span> __object.*__pm; }
<a name="l00727"></a>00727 
<a name="l00728"></a>00728       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keyword">typename</span> _Up&gt;
<a name="l00729"></a>00729     _Res&amp;
<a name="l00730"></a>00730     _M_call(_Tp&amp; __object, _Up * <span class="keyword">const</span> *)<span class="keyword"> const</span>
<a name="l00731"></a>00731 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (*__object).*__pm; }
<a name="l00732"></a>00732 
<a name="l00733"></a>00733       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keyword">typename</span> _Up&gt;
<a name="l00734"></a>00734     <span class="keyword">const</span> _Res&amp;
<a name="l00735"></a>00735     _M_call(_Tp&amp; __object, <span class="keyword">const</span> _Up * <span class="keyword">const</span> *)<span class="keyword"> const</span>
<a name="l00736"></a>00736 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (*__object).*__pm; }
<a name="l00737"></a>00737 
<a name="l00738"></a>00738       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00739"></a>00739     <span class="keyword">const</span> _Res&amp;
<a name="l00740"></a>00740     _M_call(_Tp&amp; __object, <span class="keyword">const</span> _Class *)<span class="keyword"> const</span>
<a name="l00741"></a>00741 <span class="keyword">    </span>{ <span class="keywordflow">return</span> __object.*__pm; }
<a name="l00742"></a>00742 
<a name="l00743"></a>00743       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00744"></a>00744     <span class="keyword">const</span> _Res&amp;
<a name="l00745"></a>00745     _M_call(_Tp&amp; __ptr, <span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*)<span class="keyword"> const</span>
<a name="l00746"></a>00746 <span class="keyword">    </span>{ <span class="keywordflow">return</span> (*__ptr).*__pm; }
<a name="l00747"></a>00747 
<a name="l00748"></a>00748       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt; <span class="keyword">static</span> _Tp&amp; __get_ref();
<a name="l00749"></a>00749 
<a name="l00750"></a>00750       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00751"></a>00751     <span class="keyword">static</span> __sfinae_types::__one __check_const(_Tp&amp;, _Class*);
<a name="l00752"></a>00752       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keyword">typename</span> _Up&gt;
<a name="l00753"></a>00753     <span class="keyword">static</span> __sfinae_types::__one __check_const(_Tp&amp;, _Up * <span class="keyword">const</span> *);
<a name="l00754"></a>00754       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keyword">typename</span> _Up&gt;
<a name="l00755"></a>00755     <span class="keyword">static</span> __sfinae_types::__two __check_const(_Tp&amp;, <span class="keyword">const</span> _Up * <span class="keyword">const</span> *);
<a name="l00756"></a>00756       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00757"></a>00757     <span class="keyword">static</span> __sfinae_types::__two __check_const(_Tp&amp;, <span class="keyword">const</span> _Class*);
<a name="l00758"></a>00758       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00759"></a>00759     <span class="keyword">static</span> __sfinae_types::__two __check_const(_Tp&amp;, <span class="keyword">const</span> <span class="keyword">volatile</span> <span class="keywordtype">void</span>*);
<a name="l00760"></a>00760 
<a name="l00761"></a>00761     <span class="keyword">public</span>:
<a name="l00762"></a>00762       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00763"></a>00763     <span class="keyword">struct </span>_Result_type
<a name="l00764"></a>00764     : _Mem_fn_const_or_non&lt;_Res,
<a name="l00765"></a>00765       (sizeof(__sfinae_types::__two)
<a name="l00766"></a>00766        == sizeof(__check_const&lt;_Tp&gt;(__get_ref&lt;_Tp&gt;(), (_Tp*)0)))&gt;
<a name="l00767"></a>00767     { };
<a name="l00768"></a>00768 
<a name="l00769"></a>00769       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt;
<a name="l00770"></a>00770     <span class="keyword">struct </span>result;
<a name="l00771"></a>00771 
<a name="l00772"></a>00772       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVMem, <span class="keyword">typename</span> _Tp&gt;
<a name="l00773"></a>00773     <span class="keyword">struct </span>result&lt;_CVMem(_Tp)&gt;
<a name="l00774"></a>00774     : <span class="keyword">public</span> _Result_type&lt;_Tp&gt; { };
<a name="l00775"></a>00775 
<a name="l00776"></a>00776       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVMem, <span class="keyword">typename</span> _Tp&gt;
<a name="l00777"></a>00777     <span class="keyword">struct </span>result&lt;_CVMem(_Tp&amp;)&gt;
<a name="l00778"></a>00778     : <span class="keyword">public</span> _Result_type&lt;_Tp&gt; { };
<a name="l00779"></a>00779 
<a name="l00780"></a>00780       <span class="keyword">explicit</span>
<a name="l00781"></a>00781       _Mem_fn(_Res _Class::*__pm) : __pm(__pm) { }
<a name="l00782"></a>00782 
<a name="l00783"></a>00783       <span class="comment">// Handle objects</span>
<a name="l00784"></a>00784       _Res&amp;
<a name="l00785"></a>00785       operator()(_Class&amp; __object)<span class="keyword"> const</span>
<a name="l00786"></a>00786 <span class="keyword">      </span>{ <span class="keywordflow">return</span> __object.*__pm; }
<a name="l00787"></a>00787 
<a name="l00788"></a>00788       <span class="keyword">const</span> _Res&amp;
<a name="l00789"></a>00789       operator()(<span class="keyword">const</span> _Class&amp; __object)<span class="keyword"> const</span>
<a name="l00790"></a>00790 <span class="keyword">      </span>{ <span class="keywordflow">return</span> __object.*__pm; }
<a name="l00791"></a>00791 
<a name="l00792"></a>00792       <span class="comment">// Handle pointers</span>
<a name="l00793"></a>00793       _Res&amp;
<a name="l00794"></a>00794       operator()(_Class* __object)<span class="keyword"> const</span>
<a name="l00795"></a>00795 <span class="keyword">      </span>{ <span class="keywordflow">return</span> __object-&gt;*__pm; }
<a name="l00796"></a>00796 
<a name="l00797"></a>00797       <span class="keyword">const</span> _Res&amp;
<a name="l00798"></a>00798       operator()(<span class="keyword">const</span> _Class* __object)<span class="keyword"> const</span>
<a name="l00799"></a>00799 <span class="keyword">      </span>{ <span class="keywordflow">return</span> __object-&gt;*__pm; }
<a name="l00800"></a>00800 
<a name="l00801"></a>00801       <span class="comment">// Handle smart pointers and derived</span>
<a name="l00802"></a>00802       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00803"></a>00803     <span class="keyword">typename</span> _Result_type&lt;_Tp&gt;::type
<a name="l00804"></a>00804     operator()(_Tp&amp; __unknown)<span class="keyword"> const</span>
<a name="l00805"></a>00805 <span class="keyword">    </span>{ <span class="keywordflow">return</span> _M_call(__unknown, &amp;__unknown); }
<a name="l00806"></a>00806 
<a name="l00807"></a>00807     <span class="keyword">private</span>:
<a name="l00808"></a>00808       _Res _Class::*__pm;
<a name="l00809"></a>00809     };
<a name="l00810"></a>00810 <span class="comment"></span>
<a name="l00811"></a>00811 <span class="comment">  /**</span>
<a name="l00812"></a>00812 <span class="comment">   *  @brief Returns a function object that forwards to the member</span>
<a name="l00813"></a>00813 <span class="comment">   *  pointer @a pm.</span>
<a name="l00814"></a>00814 <span class="comment">   *  @ingroup functors</span>
<a name="l00815"></a>00815 <span class="comment">   */</span>
<a name="l00816"></a>00816   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keyword">typename</span> _Class&gt;
<a name="l00817"></a>00817     <span class="keyword">inline</span> _Mem_fn&lt;_Tp _Class::*&gt;
<a name="l00818"></a><a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2">00818</a>     <a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2" title="Returns a function object that forwards to the member pointer pm.">mem_fn</a>(_Tp _Class::* __pm)
<a name="l00819"></a>00819     {
<a name="l00820"></a>00820       <span class="keywordflow">return</span> _Mem_fn&lt;_Tp _Class::*&gt;(__pm);
<a name="l00821"></a>00821     }
<a name="l00822"></a>00822 <span class="comment"></span>
<a name="l00823"></a>00823 <span class="comment">  /**</span>
<a name="l00824"></a>00824 <span class="comment">   *  @brief Determines if the given type _Tp is a function object</span>
<a name="l00825"></a>00825 <span class="comment">   *  should be treated as a subexpression when evaluating calls to</span>
<a name="l00826"></a>00826 <span class="comment">   *  function objects returned by bind(). [TR1 3.6.1]</span>
<a name="l00827"></a>00827 <span class="comment">   *  @ingroup binders</span>
<a name="l00828"></a>00828 <span class="comment">   */</span>
<a name="l00829"></a>00829   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00830"></a><a class="code" href="a00534.html">00830</a>     <span class="keyword">struct </span><a class="code" href="a00534.html" title="Determines if the given type _Tp is a function object should be treated as a subexpression when evalu...">is_bind_expression</a>
<a name="l00831"></a>00831     : <span class="keyword">public</span> <a class="code" href="a00257.html">false_type</a> { };
<a name="l00832"></a>00832 <span class="comment"></span>
<a name="l00833"></a>00833 <span class="comment">  /**</span>
<a name="l00834"></a>00834 <span class="comment">   *  @brief Determines if the given type _Tp is a placeholder in a</span>
<a name="l00835"></a>00835 <span class="comment">   *  bind() expression and, if so, which placeholder it is. [TR1 3.6.2]</span>
<a name="l00836"></a>00836 <span class="comment">   *  @ingroup binders</span>
<a name="l00837"></a>00837 <span class="comment">   */</span>
<a name="l00838"></a>00838   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00839"></a><a class="code" href="a00556.html">00839</a>     <span class="keyword">struct </span><a class="code" href="a00556.html" title="Determines if the given type _Tp is a placeholder in a bind() expression and, if so, which placeholder it is. [TR1 3.6.2].">is_placeholder</a>
<a name="l00840"></a>00840     : <span class="keyword">public</span> <a class="code" href="a00257.html" title="integral_constant">integral_constant</a>&lt;int, 0&gt;
<a name="l00841"></a>00841     { };
<a name="l00842"></a>00842 <span class="comment"></span>
<a name="l00843"></a>00843 <span class="comment">  /// The type of placeholder objects defined by libstdc++.</span>
<a name="l00844"></a><a class="code" href="a00344.html">00844</a> <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keywordtype">int</span> _Num&gt; <span class="keyword">struct </span><a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder</a> { };
<a name="l00845"></a>00845 
<a name="l00846"></a>00846   _GLIBCXX_END_NAMESPACE_VERSION
<a name="l00847"></a>00847 <span class="comment"></span>
<a name="l00848"></a>00848 <span class="comment">  /** @namespace std::placeholders</span>
<a name="l00849"></a>00849 <span class="comment">   *  @brief ISO C++ 0x entities sub namespace for functional.</span>
<a name="l00850"></a>00850 <span class="comment">   *  @ingroup binders</span>
<a name="l00851"></a>00851 <span class="comment">   *</span>
<a name="l00852"></a>00852 <span class="comment">   *  Define a large number of placeholders. There is no way to</span>
<a name="l00853"></a>00853 <span class="comment">   *  simplify this with variadic templates, because we&#39;re introducing</span>
<a name="l00854"></a>00854 <span class="comment">   *  unique names for each.</span>
<a name="l00855"></a>00855 <span class="comment">   */</span>
<a name="l00856"></a>00856   <span class="keyword">namespace </span>placeholders
<a name="l00857"></a>00857   {
<a name="l00858"></a>00858   _GLIBCXX_BEGIN_NAMESPACE_VERSION
<a name="l00859"></a>00859     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;1&gt;</a> _1;
<a name="l00860"></a>00860     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;2&gt;</a> _2;
<a name="l00861"></a>00861     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;3&gt;</a> _3;
<a name="l00862"></a>00862     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;4&gt;</a> _4;
<a name="l00863"></a>00863     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;5&gt;</a> _5;
<a name="l00864"></a>00864     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;6&gt;</a> _6;
<a name="l00865"></a>00865     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;7&gt;</a> _7;
<a name="l00866"></a>00866     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;8&gt;</a> _8;
<a name="l00867"></a>00867     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;9&gt;</a> _9;
<a name="l00868"></a>00868     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;10&gt;</a> _10;
<a name="l00869"></a>00869     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;11&gt;</a> _11;
<a name="l00870"></a>00870     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;12&gt;</a> _12;
<a name="l00871"></a>00871     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;13&gt;</a> _13;
<a name="l00872"></a>00872     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;14&gt;</a> _14;
<a name="l00873"></a>00873     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;15&gt;</a> _15;
<a name="l00874"></a>00874     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;16&gt;</a> _16;
<a name="l00875"></a>00875     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;17&gt;</a> _17;
<a name="l00876"></a>00876     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;18&gt;</a> _18;
<a name="l00877"></a>00877     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;19&gt;</a> _19;
<a name="l00878"></a>00878     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;20&gt;</a> _20;
<a name="l00879"></a>00879     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;21&gt;</a> _21;
<a name="l00880"></a>00880     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;22&gt;</a> _22;
<a name="l00881"></a>00881     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;23&gt;</a> _23;
<a name="l00882"></a>00882     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;24&gt;</a> _24;
<a name="l00883"></a>00883     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;25&gt;</a> _25;
<a name="l00884"></a>00884     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;26&gt;</a> _26;
<a name="l00885"></a>00885     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;27&gt;</a> _27;
<a name="l00886"></a>00886     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;28&gt;</a> _28;
<a name="l00887"></a>00887     <span class="keyword">extern</span> <span class="keyword">const</span> <a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder&lt;29&gt;</a> _29;
<a name="l00888"></a>00888   _GLIBCXX_END_NAMESPACE_VERSION
<a name="l00889"></a>00889   }
<a name="l00890"></a>00890 
<a name="l00891"></a>00891   _GLIBCXX_BEGIN_NAMESPACE_VERSION
<a name="l00892"></a>00892 <span class="comment"></span>
<a name="l00893"></a>00893 <span class="comment">  /**</span>
<a name="l00894"></a>00894 <span class="comment">   *  Partial specialization of is_placeholder that provides the placeholder</span>
<a name="l00895"></a>00895 <span class="comment">   *  number for the placeholder objects defined by libstdc++.</span>
<a name="l00896"></a>00896 <span class="comment">   *  @ingroup binders</span>
<a name="l00897"></a>00897 <span class="comment">   */</span>
<a name="l00898"></a>00898   <span class="keyword">template</span>&lt;<span class="keywordtype">int</span> _Num&gt;
<a name="l00899"></a><a class="code" href="a00557.html">00899</a>     <span class="keyword">struct </span><a class="code" href="a00556.html" title="Determines if the given type _Tp is a placeholder in a bind() expression and, if so, which placeholder it is. [TR1 3.6.2].">is_placeholder</a>&lt;<a class="code" href="a00344.html" title="The type of placeholder objects defined by libstdc++.">_Placeholder</a>&lt;_Num&gt; &gt;
<a name="l00900"></a>00900     : <span class="keyword">public</span> <a class="code" href="a00257.html" title="integral_constant">integral_constant</a>&lt;int, _Num&gt;
<a name="l00901"></a>00901     { };
<a name="l00902"></a>00902 <span class="comment"></span>
<a name="l00903"></a>00903 <span class="comment">  /**</span>
<a name="l00904"></a>00904 <span class="comment">   * Used by _Safe_tuple_element to indicate that there is no tuple</span>
<a name="l00905"></a>00905 <span class="comment">   * element at this position.</span>
<a name="l00906"></a>00906 <span class="comment">   */</span>
<a name="l00907"></a>00907   <span class="keyword">struct </span>_No_tuple_element;
<a name="l00908"></a>00908 <span class="comment"></span>
<a name="l00909"></a>00909 <span class="comment">  /**</span>
<a name="l00910"></a>00910 <span class="comment">   * Implementation helper for _Safe_tuple_element. This primary</span>
<a name="l00911"></a>00911 <span class="comment">   * template handles the case where it is safe to use @c</span>
<a name="l00912"></a>00912 <span class="comment">   * tuple_element.</span>
<a name="l00913"></a>00913 <span class="comment">   */</span>
<a name="l00914"></a>00914   <span class="keyword">template</span>&lt;<span class="keywordtype">int</span> __i, <span class="keyword">typename</span> _Tuple, <span class="keywordtype">bool</span> _IsSafe&gt;
<a name="l00915"></a><a class="code" href="a00241.html">00915</a>     <span class="keyword">struct </span><a class="code" href="a00241.html">_Safe_tuple_element_impl</a>
<a name="l00916"></a>00916     : tuple_element&lt;__i, _Tuple&gt; { };
<a name="l00917"></a>00917 <span class="comment"></span>
<a name="l00918"></a>00918 <span class="comment">  /**</span>
<a name="l00919"></a>00919 <span class="comment">   * Implementation helper for _Safe_tuple_element. This partial</span>
<a name="l00920"></a>00920 <span class="comment">   * specialization handles the case where it is not safe to use @c</span>
<a name="l00921"></a>00921 <span class="comment">   * tuple_element. We just return @c _No_tuple_element.</span>
<a name="l00922"></a>00922 <span class="comment">   */</span>
<a name="l00923"></a>00923   <span class="keyword">template</span>&lt;<span class="keywordtype">int</span> __i, <span class="keyword">typename</span> _Tuple&gt;
<a name="l00924"></a><a class="code" href="a00346.html">00924</a>     <span class="keyword">struct </span><a class="code" href="a00241.html">_Safe_tuple_element_impl</a>&lt;__i, _Tuple, false&gt;
<a name="l00925"></a>00925     {
<a name="l00926"></a>00926       <span class="keyword">typedef</span> _No_tuple_element type;
<a name="l00927"></a>00927     };
<a name="l00928"></a>00928 <span class="comment"></span>
<a name="l00929"></a>00929 <span class="comment">  /**</span>
<a name="l00930"></a>00930 <span class="comment">   * Like tuple_element, but returns @c _No_tuple_element when</span>
<a name="l00931"></a>00931 <span class="comment">   * tuple_element would return an error.</span>
<a name="l00932"></a>00932 <span class="comment">   */</span>
<a name="l00933"></a>00933  <span class="keyword">template</span>&lt;<span class="keywordtype">int</span> __i, <span class="keyword">typename</span> _Tuple&gt;
<a name="l00934"></a><a class="code" href="a00345.html">00934</a>    <span class="keyword">struct </span><a class="code" href="a00345.html">_Safe_tuple_element</a>
<a name="l00935"></a>00935    : <a class="code" href="a00241.html">_Safe_tuple_element_impl</a>&lt;__i, _Tuple,
<a name="l00936"></a>00936                   (__i &gt;= 0 &amp;&amp; __i &lt; tuple_size&lt;_Tuple&gt;::value)&gt;
<a name="l00937"></a>00937    { };
<a name="l00938"></a>00938 <span class="comment"></span>
<a name="l00939"></a>00939 <span class="comment">  /**</span>
<a name="l00940"></a>00940 <span class="comment">   *  Maps an argument to bind() into an actual argument to the bound</span>
<a name="l00941"></a>00941 <span class="comment">   *  function object [TR1 3.6.3/5]. Only the first parameter should</span>
<a name="l00942"></a>00942 <span class="comment">   *  be specified: the rest are used to determine among the various</span>
<a name="l00943"></a>00943 <span class="comment">   *  implementations. Note that, although this class is a function</span>
<a name="l00944"></a>00944 <span class="comment">   *  object, it isn&#39;t entirely normal because it takes only two</span>
<a name="l00945"></a>00945 <span class="comment">   *  parameters regardless of the number of parameters passed to the</span>
<a name="l00946"></a>00946 <span class="comment">   *  bind expression. The first parameter is the bound argument and</span>
<a name="l00947"></a>00947 <span class="comment">   *  the second parameter is a tuple containing references to the</span>
<a name="l00948"></a>00948 <span class="comment">   *  rest of the arguments.</span>
<a name="l00949"></a>00949 <span class="comment">   */</span>
<a name="l00950"></a>00950   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Arg,
<a name="l00951"></a>00951        <span class="keywordtype">bool</span> _IsBindExp = <a class="code" href="a00534.html" title="Determines if the given type _Tp is a function object should be treated as a subexpression when evalu...">is_bind_expression&lt;_Arg&gt;::value</a>,
<a name="l00952"></a>00952        <span class="keywordtype">bool</span> _IsPlaceholder = (<a class="code" href="a00556.html" title="Determines if the given type _Tp is a placeholder in a bind() expression and, if so, which placeholder it is. [TR1 3.6.2].">is_placeholder&lt;_Arg&gt;::value</a> &gt; 0)&gt;
<a name="l00953"></a>00953     <span class="keyword">class</span> _Mu;
<a name="l00954"></a>00954 <span class="comment"></span>
<a name="l00955"></a>00955 <span class="comment">  /**</span>
<a name="l00956"></a>00956 <span class="comment">   *  If the argument is reference_wrapper&lt;_Tp&gt;, returns the</span>
<a name="l00957"></a>00957 <span class="comment">   *  underlying reference. [TR1 3.6.3/5 bullet 1]</span>
<a name="l00958"></a>00958 <span class="comment">   */</span>
<a name="l00959"></a>00959   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l00960"></a><a class="code" href="a00343.html">00960</a>     <span class="keyword">class </span>_Mu&lt;<a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper</a>&lt;_Tp&gt;, false, false&gt;
<a name="l00961"></a>00961     {
<a name="l00962"></a>00962     <span class="keyword">public</span>:
<a name="l00963"></a>00963       <span class="keyword">typedef</span> _Tp&amp; result_type;
<a name="l00964"></a>00964 
<a name="l00965"></a>00965       <span class="comment">/* Note: This won&#39;t actually work for const volatile</span>
<a name="l00966"></a>00966 <span class="comment">       * reference_wrappers, because reference_wrapper::get() is const</span>
<a name="l00967"></a>00967 <span class="comment">       * but not volatile-qualified. This might be a defect in the TR.</span>
<a name="l00968"></a>00968 <span class="comment">       */</span>
<a name="l00969"></a>00969       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVRef, <span class="keyword">typename</span> _Tuple&gt;
<a name="l00970"></a>00970     result_type
<a name="l00971"></a>00971     operator()(_CVRef&amp; __arg, _Tuple&amp;)<span class="keyword"> const volatile</span>
<a name="l00972"></a>00972 <span class="keyword">    </span>{ <span class="keywordflow">return</span> __arg.get(); }
<a name="l00973"></a>00973     };
<a name="l00974"></a>00974 <span class="comment"></span>
<a name="l00975"></a>00975 <span class="comment">  /**</span>
<a name="l00976"></a>00976 <span class="comment">   *  If the argument is a bind expression, we invoke the underlying</span>
<a name="l00977"></a>00977 <span class="comment">   *  function object with the same cv-qualifiers as we are given and</span>
<a name="l00978"></a>00978 <span class="comment">   *  pass along all of our arguments (unwrapped). [TR1 3.6.3/5 bullet 2]</span>
<a name="l00979"></a>00979 <span class="comment">   */</span>
<a name="l00980"></a>00980   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Arg&gt;
<a name="l00981"></a><a class="code" href="a00342.html">00981</a>     <span class="keyword">class </span>_Mu&lt;_Arg, true, false&gt;
<a name="l00982"></a>00982     {
<a name="l00983"></a>00983     <span class="keyword">public</span>:
<a name="l00984"></a>00984       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVArg, <span class="keyword">typename</span>... _Args&gt;
<a name="l00985"></a>00985     <span class="keyword">auto</span>
<a name="l00986"></a>00986     operator()(_CVArg&amp; __arg,
<a name="l00987"></a>00987            <a class="code" href="a00715.html" title="tuple">tuple&lt;_Args...&gt;</a>&amp; __tuple) <span class="keyword">const</span> <span class="keyword">volatile</span>
<a name="l00988"></a>00988     -&gt; decltype(__arg(declval&lt;_Args&gt;()...))
<a name="l00989"></a>00989     {
<a name="l00990"></a>00990       <span class="comment">// Construct an index tuple and forward to __call</span>
<a name="l00991"></a>00991       <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00317.html" title="Builds an _Index_tuple&lt;0, 1, 2, ..., _Num-1&gt;.">_Build_index_tuple</a>&lt;<span class="keyword">sizeof</span>...(_Args)&gt;::__type
<a name="l00992"></a>00992         _Indexes;
<a name="l00993"></a>00993       <span class="keywordflow">return</span> this-&gt;__call(__arg, __tuple, _Indexes());
<a name="l00994"></a>00994     }
<a name="l00995"></a>00995 
<a name="l00996"></a>00996     <span class="keyword">private</span>:
<a name="l00997"></a>00997       <span class="comment">// Invokes the underlying function object __arg by unpacking all</span>
<a name="l00998"></a>00998       <span class="comment">// of the arguments in the tuple.</span>
<a name="l00999"></a>00999       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVArg, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01000"></a>01000     <span class="keyword">auto</span>
<a name="l01001"></a>01001     __call(_CVArg&amp; __arg, <a class="code" href="a00715.html" title="tuple">tuple&lt;_Args...&gt;</a>&amp; __tuple,
<a name="l01002"></a>01002            <span class="keyword">const</span> <a class="code" href="a00327.html">_Index_tuple&lt;_Indexes...&gt;</a>&amp;) <span class="keyword">const</span> <span class="keyword">volatile</span>
<a name="l01003"></a>01003     -&gt; decltype(__arg(declval&lt;_Args&gt;()...))
<a name="l01004"></a>01004     {
<a name="l01005"></a>01005       <span class="keywordflow">return</span> __arg(std::forward&lt;_Args&gt;(get&lt;_Indexes&gt;(__tuple))...);
<a name="l01006"></a>01006     }
<a name="l01007"></a>01007     };
<a name="l01008"></a>01008 <span class="comment"></span>
<a name="l01009"></a>01009 <span class="comment">  /**</span>
<a name="l01010"></a>01010 <span class="comment">   *  If the argument is a placeholder for the Nth argument, returns</span>
<a name="l01011"></a>01011 <span class="comment">   *  a reference to the Nth argument to the bind function object.</span>
<a name="l01012"></a>01012 <span class="comment">   *  [TR1 3.6.3/5 bullet 3]</span>
<a name="l01013"></a>01013 <span class="comment">   */</span>
<a name="l01014"></a>01014   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Arg&gt;
<a name="l01015"></a><a class="code" href="a00341.html">01015</a>     <span class="keyword">class </span>_Mu&lt;_Arg, false, true&gt;
<a name="l01016"></a>01016     {
<a name="l01017"></a>01017     <span class="keyword">public</span>:
<a name="l01018"></a>01018       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt; <span class="keyword">class </span>result;
<a name="l01019"></a>01019 
<a name="l01020"></a>01020       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVMu, <span class="keyword">typename</span> _CVArg, <span class="keyword">typename</span> _Tuple&gt;
<a name="l01021"></a>01021     <span class="keyword">class </span>result&lt;_CVMu(_CVArg, _Tuple)&gt;
<a name="l01022"></a>01022     {
<a name="l01023"></a>01023       <span class="comment">// Add a reference, if it hasn&#39;t already been done for us.</span>
<a name="l01024"></a>01024       <span class="comment">// This allows us to be a little bit sloppy in constructing</span>
<a name="l01025"></a>01025       <span class="comment">// the tuple that we pass to result_of&lt;...&gt;.</span>
<a name="l01026"></a>01026       <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00345.html">_Safe_tuple_element&lt;(is_placeholder&lt;_Arg&gt;::value</a>
<a name="l01027"></a>01027                         - 1), _Tuple&gt;::type
<a name="l01028"></a>01028         __base_type;
<a name="l01029"></a>01029 
<a name="l01030"></a>01030     <span class="keyword">public</span>:
<a name="l01031"></a>01031       <span class="keyword">typedef</span> <span class="keyword">typename</span> add_rvalue_reference&lt;__base_type&gt;::type type;
<a name="l01032"></a>01032     };
<a name="l01033"></a>01033 
<a name="l01034"></a>01034       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tuple&gt;
<a name="l01035"></a>01035     <span class="keyword">typename</span> result&lt;_Mu(_Arg, _Tuple)&gt;::type
<a name="l01036"></a>01036     operator()(<span class="keyword">const</span> <span class="keyword">volatile</span> _Arg&amp;, _Tuple&amp; __tuple)<span class="keyword"> const volatile</span>
<a name="l01037"></a>01037 <span class="keyword">    </span>{
<a name="l01038"></a>01038       <span class="keywordflow">return</span> std::forward&lt;typename result&lt;_Mu(_Arg, _Tuple)&gt;::type&gt;(
<a name="l01039"></a>01039           ::std::get&lt;(is_placeholder&lt;_Arg&gt;::value - 1)&gt;(__tuple));
<a name="l01040"></a>01040     }
<a name="l01041"></a>01041     };
<a name="l01042"></a>01042 <span class="comment"></span>
<a name="l01043"></a>01043 <span class="comment">  /**</span>
<a name="l01044"></a>01044 <span class="comment">   *  If the argument is just a value, returns a reference to that</span>
<a name="l01045"></a>01045 <span class="comment">   *  value. The cv-qualifiers on the reference are the same as the</span>
<a name="l01046"></a>01046 <span class="comment">   *  cv-qualifiers on the _Mu object. [TR1 3.6.3/5 bullet 4]</span>
<a name="l01047"></a>01047 <span class="comment">   */</span>
<a name="l01048"></a>01048   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Arg&gt;
<a name="l01049"></a><a class="code" href="a00340.html">01049</a>     <span class="keyword">class </span>_Mu&lt;_Arg, false, false&gt;
<a name="l01050"></a>01050     {
<a name="l01051"></a>01051     <span class="keyword">public</span>:
<a name="l01052"></a>01052       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt; <span class="keyword">struct </span>result;
<a name="l01053"></a>01053 
<a name="l01054"></a>01054       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVMu, <span class="keyword">typename</span> _CVArg, <span class="keyword">typename</span> _Tuple&gt;
<a name="l01055"></a>01055     <span class="keyword">struct </span>result&lt;_CVMu(_CVArg, _Tuple)&gt;
<a name="l01056"></a>01056     {
<a name="l01057"></a>01057       <span class="keyword">typedef</span> <span class="keyword">typename</span> add_lvalue_reference&lt;_CVArg&gt;::type type;
<a name="l01058"></a>01058     };
<a name="l01059"></a>01059 
<a name="l01060"></a>01060       <span class="comment">// Pick up the cv-qualifiers of the argument</span>
<a name="l01061"></a>01061       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _CVArg, <span class="keyword">typename</span> _Tuple&gt;
<a name="l01062"></a>01062     _CVArg&amp;&amp;
<a name="l01063"></a>01063     operator()(_CVArg&amp;&amp; __arg, _Tuple&amp;)<span class="keyword"> const volatile</span>
<a name="l01064"></a>01064 <span class="keyword">    </span>{ <span class="keywordflow">return</span> std::forward&lt;_CVArg&gt;(__arg); }
<a name="l01065"></a>01065     };
<a name="l01066"></a>01066 <span class="comment"></span>
<a name="l01067"></a>01067 <span class="comment">  /**</span>
<a name="l01068"></a>01068 <span class="comment">   *  Maps member pointers into instances of _Mem_fn but leaves all</span>
<a name="l01069"></a>01069 <span class="comment">   *  other function objects untouched. Used by tr1::bind(). The</span>
<a name="l01070"></a>01070 <span class="comment">   *  primary template handles the non--member-pointer case.</span>
<a name="l01071"></a>01071 <span class="comment">   */</span>
<a name="l01072"></a>01072   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01073"></a><a class="code" href="a00334.html">01073</a>     <span class="keyword">struct </span><a class="code" href="a00334.html">_Maybe_wrap_member_pointer</a>
<a name="l01074"></a>01074     {
<a name="l01075"></a>01075       <span class="keyword">typedef</span> _Tp type;
<a name="l01076"></a>01076 
<a name="l01077"></a>01077       <span class="keyword">static</span> <span class="keyword">const</span> _Tp&amp;
<a name="l01078"></a>01078       __do_wrap(<span class="keyword">const</span> _Tp&amp; __x)
<a name="l01079"></a>01079       { <span class="keywordflow">return</span> __x; }
<a name="l01080"></a>01080 
<a name="l01081"></a>01081       <span class="keyword">static</span> _Tp&amp;&amp;
<a name="l01082"></a>01082       __do_wrap(_Tp&amp;&amp; __x)
<a name="l01083"></a>01083       { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>_Tp&amp;&amp;<span class="keyword">&gt;</span>(__x); }
<a name="l01084"></a>01084     };
<a name="l01085"></a>01085 <span class="comment"></span>
<a name="l01086"></a>01086 <span class="comment">  /**</span>
<a name="l01087"></a>01087 <span class="comment">   *  Maps member pointers into instances of _Mem_fn but leaves all</span>
<a name="l01088"></a>01088 <span class="comment">   *  other function objects untouched. Used by tr1::bind(). This</span>
<a name="l01089"></a>01089 <span class="comment">   *  partial specialization handles the member pointer case.</span>
<a name="l01090"></a>01090 <span class="comment">   */</span>
<a name="l01091"></a>01091   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp, <span class="keyword">typename</span> _Class&gt;
<a name="l01092"></a><a class="code" href="a00335.html">01092</a>     <span class="keyword">struct </span><a class="code" href="a00334.html">_Maybe_wrap_member_pointer</a>&lt;_Tp _Class::*&gt;
<a name="l01093"></a>01093     {
<a name="l01094"></a>01094       <span class="keyword">typedef</span> _Mem_fn&lt;_Tp _Class::*&gt; type;
<a name="l01095"></a>01095 
<a name="l01096"></a>01096       <span class="keyword">static</span> type
<a name="l01097"></a>01097       __do_wrap(_Tp _Class::* __pm)
<a name="l01098"></a>01098       { <span class="keywordflow">return</span> type(__pm); }
<a name="l01099"></a>01099     };
<a name="l01100"></a>01100 
<a name="l01101"></a>01101   <span class="comment">// Specialization needed to prevent &quot;forming reference to void&quot; errors when</span>
<a name="l01102"></a>01102   <span class="comment">// bind&lt;void&gt;() is called, because argument deduction instantiates</span>
<a name="l01103"></a>01103   <span class="comment">// _Maybe_wrap_member_pointer&lt;void&gt; outside the immediate context where</span>
<a name="l01104"></a>01104   <span class="comment">// SFINAE applies.</span>
<a name="l01105"></a>01105   <span class="keyword">template</span>&lt;&gt;
<a name="l01106"></a>01106     <span class="keyword">struct </span><a class="code" href="a00334.html">_Maybe_wrap_member_pointer</a>&lt;void&gt;
<a name="l01107"></a>01107     {
<a name="l01108"></a>01108       <span class="keyword">typedef</span> <span class="keywordtype">void</span> type;
<a name="l01109"></a>01109     };
<a name="l01110"></a>01110 
<a name="l01111"></a>01111   <span class="comment">// std::get&lt;I&gt; for volatile-qualified tuples</span>
<a name="l01112"></a>01112   <span class="keyword">template</span>&lt;<span class="keywordtype">size_t</span> _Ind, <span class="keyword">typename</span>... _Tp&gt;
<a name="l01113"></a>01113     <span class="keyword">inline</span> <span class="keyword">auto</span>
<a name="l01114"></a>01114     __volget(<span class="keyword">volatile</span> tuple&lt;_Tp...&gt;&amp; __tuple)
<a name="l01115"></a>01115     -&gt; <span class="keyword">typename</span> tuple_element&lt;_Ind, tuple&lt;_Tp...&gt;&gt;::type <span class="keyword">volatile</span>&amp;
<a name="l01116"></a>01116     { <span class="keywordflow">return</span> std::get&lt;_Ind&gt;(<span class="keyword">const_cast&lt;</span>tuple&lt;_Tp...<span class="keyword">&gt;</span>&amp;&gt;(__tuple)); }
<a name="l01117"></a>01117 
<a name="l01118"></a>01118   <span class="comment">// std::get&lt;I&gt; for const-volatile-qualified tuples</span>
<a name="l01119"></a>01119   <span class="keyword">template</span>&lt;<span class="keywordtype">size_t</span> _Ind, <span class="keyword">typename</span>... _Tp&gt;
<a name="l01120"></a>01120     <span class="keyword">inline</span> <span class="keyword">auto</span>
<a name="l01121"></a>01121     __volget(<span class="keyword">const</span> <span class="keyword">volatile</span> tuple&lt;_Tp...&gt;&amp; __tuple)
<a name="l01122"></a>01122     -&gt; <span class="keyword">typename</span> tuple_element&lt;_Ind, tuple&lt;_Tp...&gt;&gt;::type <span class="keyword">const</span> <span class="keyword">volatile</span>&amp;
<a name="l01123"></a>01123     { <span class="keywordflow">return</span> std::get&lt;_Ind&gt;(<span class="keyword">const_cast&lt;</span><span class="keyword">const </span>tuple&lt;_Tp...<span class="keyword">&gt;</span>&amp;&gt;(__tuple)); }
<a name="l01124"></a>01124 <span class="comment"></span>
<a name="l01125"></a>01125 <span class="comment">  /// Type of the function object returned from bind().</span>
<a name="l01126"></a>01126 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt;
<a name="l01127"></a>01127     <span class="keyword">struct </span>_Bind;
<a name="l01128"></a>01128 
<a name="l01129"></a>01129    <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _Bound_args&gt;
<a name="l01130"></a>01130     <span class="keyword">class </span>_Bind&lt;_Functor(_Bound_args...)&gt;
<a name="l01131"></a>01131     : <span class="keyword">public</span> _Weak_result_type&lt;_Functor&gt;
<a name="l01132"></a>01132     {
<a name="l01133"></a>01133       <span class="keyword">typedef</span> _Bind __self_type;
<a name="l01134"></a>01134       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Build_index_tuple&lt;<span class="keyword">sizeof</span>...(_Bound_args)&gt;::__type
<a name="l01135"></a>01135     _Bound_indexes;
<a name="l01136"></a>01136 
<a name="l01137"></a>01137       _Functor _M_f;
<a name="l01138"></a>01138       tuple&lt;_Bound_args...&gt; _M_bound_args;
<a name="l01139"></a>01139 
<a name="l01140"></a>01140       <span class="comment">// Call unqualified</span>
<a name="l01141"></a>01141       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01142"></a>01142     _Result
<a name="l01143"></a>01143     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;)
<a name="l01144"></a>01144     {
<a name="l01145"></a>01145       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01146"></a>01146               (get&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01147"></a>01147     }
<a name="l01148"></a>01148 
<a name="l01149"></a>01149       <span class="comment">// Call as const</span>
<a name="l01150"></a>01150       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01151"></a>01151     _Result
<a name="l01152"></a>01152     __call_c(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;)<span class="keyword"> const</span>
<a name="l01153"></a>01153 <span class="keyword">    </span>{
<a name="l01154"></a>01154       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01155"></a>01155               (get&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01156"></a>01156     }
<a name="l01157"></a>01157 
<a name="l01158"></a>01158       <span class="comment">// Call as volatile</span>
<a name="l01159"></a>01159       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01160"></a>01160     _Result
<a name="l01161"></a>01161     __call_v(tuple&lt;_Args...&gt;&amp;&amp; __args,
<a name="l01162"></a>01162          _Index_tuple&lt;_Indexes...&gt;)<span class="keyword"> volatile</span>
<a name="l01163"></a>01163 <span class="keyword">    </span>{
<a name="l01164"></a>01164       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01165"></a>01165               (__volget&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01166"></a>01166     }
<a name="l01167"></a>01167 
<a name="l01168"></a>01168       <span class="comment">// Call as const volatile</span>
<a name="l01169"></a>01169       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01170"></a>01170     _Result
<a name="l01171"></a>01171     __call_c_v(tuple&lt;_Args...&gt;&amp;&amp; __args,
<a name="l01172"></a>01172            _Index_tuple&lt;_Indexes...&gt;)<span class="keyword"> const volatile</span>
<a name="l01173"></a>01173 <span class="keyword">    </span>{
<a name="l01174"></a>01174       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01175"></a>01175               (__volget&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01176"></a>01176     }
<a name="l01177"></a>01177 
<a name="l01178"></a>01178      <span class="keyword">public</span>:
<a name="l01179"></a>01179       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01180"></a>01180     <span class="keyword">explicit</span> _Bind(<span class="keyword">const</span> _Functor&amp; __f, _Args&amp;&amp;... __args)
<a name="l01181"></a>01181     : _M_f(__f), _M_bound_args(std::<a class="code" href="a01137.html#ae3a272cdca779619a1d3fc561fde11e7" title="forward (as per N3143)">forward</a>&lt;_Args&gt;(__args)...)
<a name="l01182"></a>01182     { }
<a name="l01183"></a>01183 
<a name="l01184"></a>01184       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01185"></a>01185     <span class="keyword">explicit</span> _Bind(_Functor&amp;&amp; __f, _Args&amp;&amp;... __args)
<a name="l01186"></a>01186     : _M_f(std::move(__f)), _M_bound_args(std::<a class="code" href="a01137.html#ae3a272cdca779619a1d3fc561fde11e7" title="forward (as per N3143)">forward</a>&lt;_Args&gt;(__args)...)
<a name="l01187"></a>01187     { }
<a name="l01188"></a>01188 
<a name="l01189"></a>01189       _Bind(<span class="keyword">const</span> _Bind&amp;) = <span class="keywordflow">default</span>;
<a name="l01190"></a>01190 
<a name="l01191"></a>01191       _Bind(_Bind&amp;&amp; __b)
<a name="l01192"></a>01192       : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args))
<a name="l01193"></a>01193       { }
<a name="l01194"></a>01194 
<a name="l01195"></a>01195       <span class="comment">// Call unqualified</span>
<a name="l01196"></a>01196       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args, <span class="keyword">typename</span> _Result
<a name="l01197"></a>01197     = decltype( std::declval&lt;_Functor&gt;()(
<a name="l01198"></a>01198           _Mu&lt;_Bound_args&gt;()( std::declval&lt;_Bound_args&amp;&gt;(),
<a name="l01199"></a>01199                   std::declval&lt;tuple&lt;_Args...&gt;&amp;&gt;() )... ) )&gt;
<a name="l01200"></a>01200     _Result
<a name="l01201"></a>01201     operator()(_Args&amp;&amp;... __args)
<a name="l01202"></a>01202     {
<a name="l01203"></a>01203       <span class="keywordflow">return</span> this-&gt;__call&lt;_Result&gt;(
<a name="l01204"></a>01204           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01205"></a>01205           _Bound_indexes());
<a name="l01206"></a>01206     }
<a name="l01207"></a>01207 
<a name="l01208"></a>01208       <span class="comment">// Call as const</span>
<a name="l01209"></a>01209       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args, <span class="keyword">typename</span> _Result
<a name="l01210"></a>01210     = decltype( std::declval&lt;<span class="keyword">typename</span> enable_if&lt;(<span class="keyword">sizeof</span>...(_Args) &gt;= 0),
<a name="l01211"></a>01211                <span class="keyword">typename</span> add_const&lt;_Functor&gt;::type&gt;::type&gt;()(
<a name="l01212"></a>01212           _Mu&lt;_Bound_args&gt;()( std::declval&lt;const _Bound_args&amp;&gt;(),
<a name="l01213"></a>01213                   std::declval&lt;tuple&lt;_Args...&gt;&amp;&gt;() )... ) )&gt;
<a name="l01214"></a>01214     _Result
<a name="l01215"></a>01215     operator()(_Args&amp;&amp;... __args)<span class="keyword"> const</span>
<a name="l01216"></a>01216 <span class="keyword">    </span>{
<a name="l01217"></a>01217       <span class="keywordflow">return</span> this-&gt;__call_c&lt;_Result&gt;(
<a name="l01218"></a>01218           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01219"></a>01219           _Bound_indexes());
<a name="l01220"></a>01220     }
<a name="l01221"></a>01221 
<a name="l01222"></a>01222       <span class="comment">// Call as volatile</span>
<a name="l01223"></a>01223       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args, <span class="keyword">typename</span> _Result
<a name="l01224"></a>01224     = decltype( std::declval&lt;<span class="keyword">typename</span> enable_if&lt;(<span class="keyword">sizeof</span>...(_Args) &gt;= 0),
<a name="l01225"></a>01225                        <span class="keyword">typename</span> add_volatile&lt;_Functor&gt;::type&gt;::type&gt;()(
<a name="l01226"></a>01226           _Mu&lt;_Bound_args&gt;()( std::declval&lt;volatile _Bound_args&amp;&gt;(),
<a name="l01227"></a>01227                   std::declval&lt;tuple&lt;_Args...&gt;&amp;&gt;() )... ) )&gt;
<a name="l01228"></a>01228     _Result
<a name="l01229"></a>01229     operator()(_Args&amp;&amp;... __args)<span class="keyword"> volatile</span>
<a name="l01230"></a>01230 <span class="keyword">    </span>{
<a name="l01231"></a>01231       <span class="keywordflow">return</span> this-&gt;__call_v&lt;_Result&gt;(
<a name="l01232"></a>01232           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01233"></a>01233           _Bound_indexes());
<a name="l01234"></a>01234     }
<a name="l01235"></a>01235 
<a name="l01236"></a>01236       <span class="comment">// Call as const volatile</span>
<a name="l01237"></a>01237       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args, <span class="keyword">typename</span> _Result
<a name="l01238"></a>01238     = decltype( std::declval&lt;<span class="keyword">typename</span> enable_if&lt;(<span class="keyword">sizeof</span>...(_Args) &gt;= 0),
<a name="l01239"></a>01239                        <span class="keyword">typename</span> add_cv&lt;_Functor&gt;::type&gt;::type&gt;()(
<a name="l01240"></a>01240           _Mu&lt;_Bound_args&gt;()( std::declval&lt;const volatile _Bound_args&amp;&gt;(),
<a name="l01241"></a>01241                   std::declval&lt;tuple&lt;_Args...&gt;&amp;&gt;() )... ) )&gt;
<a name="l01242"></a>01242     _Result
<a name="l01243"></a>01243     operator()(_Args&amp;&amp;... __args)<span class="keyword"> const volatile</span>
<a name="l01244"></a>01244 <span class="keyword">    </span>{
<a name="l01245"></a>01245       <span class="keywordflow">return</span> this-&gt;__call_c_v&lt;_Result&gt;(
<a name="l01246"></a>01246           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01247"></a>01247           _Bound_indexes());
<a name="l01248"></a>01248     }
<a name="l01249"></a>01249     };
<a name="l01250"></a>01250 <span class="comment"></span>
<a name="l01251"></a>01251 <span class="comment">  /// Type of the function object returned from bind&lt;R&gt;().</span>
<a name="l01252"></a>01252 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span> _Signature&gt;
<a name="l01253"></a>01253     <span class="keyword">struct </span>_Bind_result;
<a name="l01254"></a>01254 
<a name="l01255"></a>01255   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _Bound_args&gt;
<a name="l01256"></a>01256     <span class="keyword">class </span>_Bind_result&lt;_Result, _Functor(_Bound_args...)&gt;
<a name="l01257"></a>01257     {
<a name="l01258"></a>01258       <span class="keyword">typedef</span> _Bind_result __self_type;
<a name="l01259"></a>01259       <span class="keyword">typedef</span> <span class="keyword">typename</span> _Build_index_tuple&lt;<span class="keyword">sizeof</span>...(_Bound_args)&gt;::__type
<a name="l01260"></a>01260     _Bound_indexes;
<a name="l01261"></a>01261 
<a name="l01262"></a>01262       _Functor _M_f;
<a name="l01263"></a>01263       tuple&lt;_Bound_args...&gt; _M_bound_args;
<a name="l01264"></a>01264 
<a name="l01265"></a>01265       <span class="comment">// sfinae types</span>
<a name="l01266"></a>01266       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res&gt;
<a name="l01267"></a>01267     <span class="keyword">struct </span>__enable_if_void : enable_if&lt;is_void&lt;_Res&gt;::value, int&gt; { };
<a name="l01268"></a>01268       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res&gt;
<a name="l01269"></a>01269     <span class="keyword">struct </span>__disable_if_void : enable_if&lt;!is_void&lt;_Res&gt;::value, int&gt; { };
<a name="l01270"></a>01270 
<a name="l01271"></a>01271       <span class="comment">// Call unqualified</span>
<a name="l01272"></a>01272       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01273"></a>01273     _Result
<a name="l01274"></a>01274     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01275"></a>01275         <span class="keyword">typename</span> __disable_if_void&lt;_Res&gt;::type = 0)
<a name="l01276"></a>01276     {
<a name="l01277"></a>01277       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01278"></a>01278               (get&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01279"></a>01279     }
<a name="l01280"></a>01280 
<a name="l01281"></a>01281       <span class="comment">// Call unqualified, return void</span>
<a name="l01282"></a>01282       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01283"></a>01283     <span class="keywordtype">void</span>
<a name="l01284"></a>01284     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01285"></a>01285         <span class="keyword">typename</span> __enable_if_void&lt;_Res&gt;::type = 0)
<a name="l01286"></a>01286     {
<a name="l01287"></a>01287       _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01288"></a>01288            (get&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01289"></a>01289     }
<a name="l01290"></a>01290 
<a name="l01291"></a>01291       <span class="comment">// Call as const</span>
<a name="l01292"></a>01292       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01293"></a>01293     _Result
<a name="l01294"></a>01294     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01295"></a>01295         <span class="keyword">typename</span> __disable_if_void&lt;_Res&gt;::type = 0)<span class="keyword"> const</span>
<a name="l01296"></a>01296 <span class="keyword">    </span>{
<a name="l01297"></a>01297       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01298"></a>01298               (get&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01299"></a>01299     }
<a name="l01300"></a>01300 
<a name="l01301"></a>01301       <span class="comment">// Call as const, return void</span>
<a name="l01302"></a>01302       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01303"></a>01303     <span class="keywordtype">void</span>
<a name="l01304"></a>01304     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01305"></a>01305         <span class="keyword">typename</span> __enable_if_void&lt;_Res&gt;::type = 0)<span class="keyword"> const</span>
<a name="l01306"></a>01306 <span class="keyword">    </span>{
<a name="l01307"></a>01307       _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01308"></a>01308            (get&lt;_Indexes&gt;(_M_bound_args),  __args)...);
<a name="l01309"></a>01309     }
<a name="l01310"></a>01310 
<a name="l01311"></a>01311       <span class="comment">// Call as volatile</span>
<a name="l01312"></a>01312       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01313"></a>01313     _Result
<a name="l01314"></a>01314     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01315"></a>01315         <span class="keyword">typename</span> __disable_if_void&lt;_Res&gt;::type = 0)<span class="keyword"> volatile</span>
<a name="l01316"></a>01316 <span class="keyword">    </span>{
<a name="l01317"></a>01317       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01318"></a>01318               (__volget&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01319"></a>01319     }
<a name="l01320"></a>01320 
<a name="l01321"></a>01321       <span class="comment">// Call as volatile, return void</span>
<a name="l01322"></a>01322       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01323"></a>01323     <span class="keywordtype">void</span>
<a name="l01324"></a>01324     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01325"></a>01325         <span class="keyword">typename</span> __enable_if_void&lt;_Res&gt;::type = 0)<span class="keyword"> volatile</span>
<a name="l01326"></a>01326 <span class="keyword">    </span>{
<a name="l01327"></a>01327       _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01328"></a>01328            (__volget&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01329"></a>01329     }
<a name="l01330"></a>01330 
<a name="l01331"></a>01331       <span class="comment">// Call as const volatile</span>
<a name="l01332"></a>01332       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01333"></a>01333     _Result
<a name="l01334"></a>01334     __call(tuple&lt;_Args...&gt;&amp;&amp; __args, _Index_tuple&lt;_Indexes...&gt;,
<a name="l01335"></a>01335         <span class="keyword">typename</span> __disable_if_void&lt;_Res&gt;::type = 0)<span class="keyword"> const volatile</span>
<a name="l01336"></a>01336 <span class="keyword">    </span>{
<a name="l01337"></a>01337       <span class="keywordflow">return</span> _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01338"></a>01338               (__volget&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01339"></a>01339     }
<a name="l01340"></a>01340 
<a name="l01341"></a>01341       <span class="comment">// Call as const volatile, return void</span>
<a name="l01342"></a>01342       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args, <span class="keywordtype">int</span>... _Indexes&gt;
<a name="l01343"></a>01343     <span class="keywordtype">void</span>
<a name="l01344"></a>01344     __call(tuple&lt;_Args...&gt;&amp;&amp; __args,
<a name="l01345"></a>01345            _Index_tuple&lt;_Indexes...&gt;,
<a name="l01346"></a>01346         <span class="keyword">typename</span> __enable_if_void&lt;_Res&gt;::type = 0)<span class="keyword"> const volatile</span>
<a name="l01347"></a>01347 <span class="keyword">    </span>{
<a name="l01348"></a>01348       _M_f(_Mu&lt;_Bound_args&gt;()
<a name="l01349"></a>01349            (__volget&lt;_Indexes&gt;(_M_bound_args), __args)...);
<a name="l01350"></a>01350     }
<a name="l01351"></a>01351 
<a name="l01352"></a>01352     <span class="keyword">public</span>:
<a name="l01353"></a>01353       <span class="keyword">typedef</span> _Result result_type;
<a name="l01354"></a>01354 
<a name="l01355"></a>01355       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01356"></a>01356     <span class="keyword">explicit</span> _Bind_result(<span class="keyword">const</span> _Functor&amp; __f, _Args&amp;&amp;... __args)
<a name="l01357"></a>01357     : _M_f(__f), _M_bound_args(std::<a class="code" href="a01137.html#ae3a272cdca779619a1d3fc561fde11e7" title="forward (as per N3143)">forward</a>&lt;_Args&gt;(__args)...)
<a name="l01358"></a>01358     { }
<a name="l01359"></a>01359 
<a name="l01360"></a>01360       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01361"></a>01361     <span class="keyword">explicit</span> _Bind_result(_Functor&amp;&amp; __f, _Args&amp;&amp;... __args)
<a name="l01362"></a>01362     : _M_f(std::move(__f)), _M_bound_args(std::<a class="code" href="a01137.html#ae3a272cdca779619a1d3fc561fde11e7" title="forward (as per N3143)">forward</a>&lt;_Args&gt;(__args)...)
<a name="l01363"></a>01363     { }
<a name="l01364"></a>01364 
<a name="l01365"></a>01365       _Bind_result(<span class="keyword">const</span> _Bind_result&amp;) = <span class="keywordflow">default</span>;
<a name="l01366"></a>01366 
<a name="l01367"></a>01367       _Bind_result(_Bind_result&amp;&amp; __b)
<a name="l01368"></a>01368       : _M_f(std::move(__b._M_f)), _M_bound_args(std::move(__b._M_bound_args))
<a name="l01369"></a>01369       { }
<a name="l01370"></a>01370 
<a name="l01371"></a>01371       <span class="comment">// Call unqualified</span>
<a name="l01372"></a>01372       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01373"></a>01373     result_type
<a name="l01374"></a>01374     operator()(_Args&amp;&amp;... __args)
<a name="l01375"></a>01375     {
<a name="l01376"></a>01376       <span class="keywordflow">return</span> this-&gt;__call&lt;_Result&gt;(
<a name="l01377"></a>01377           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01378"></a>01378           _Bound_indexes());
<a name="l01379"></a>01379     }
<a name="l01380"></a>01380 
<a name="l01381"></a>01381       <span class="comment">// Call as const</span>
<a name="l01382"></a>01382       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01383"></a>01383     result_type
<a name="l01384"></a>01384     operator()(_Args&amp;&amp;... __args)<span class="keyword"> const</span>
<a name="l01385"></a>01385 <span class="keyword">    </span>{
<a name="l01386"></a>01386       <span class="keywordflow">return</span> this-&gt;__call&lt;_Result&gt;(
<a name="l01387"></a>01387           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01388"></a>01388           _Bound_indexes());
<a name="l01389"></a>01389     }
<a name="l01390"></a>01390 
<a name="l01391"></a>01391       <span class="comment">// Call as volatile</span>
<a name="l01392"></a>01392       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01393"></a>01393     result_type
<a name="l01394"></a>01394     operator()(_Args&amp;&amp;... __args)<span class="keyword"> volatile</span>
<a name="l01395"></a>01395 <span class="keyword">    </span>{
<a name="l01396"></a>01396       <span class="keywordflow">return</span> this-&gt;__call&lt;_Result&gt;(
<a name="l01397"></a>01397           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01398"></a>01398           _Bound_indexes());
<a name="l01399"></a>01399     }
<a name="l01400"></a>01400 
<a name="l01401"></a>01401       <span class="comment">// Call as const volatile</span>
<a name="l01402"></a>01402       <span class="keyword">template</span>&lt;<span class="keyword">typename</span>... _Args&gt;
<a name="l01403"></a>01403     result_type
<a name="l01404"></a>01404     operator()(_Args&amp;&amp;... __args)<span class="keyword"> const volatile</span>
<a name="l01405"></a>01405 <span class="keyword">    </span>{
<a name="l01406"></a>01406       <span class="keywordflow">return</span> this-&gt;__call&lt;_Result&gt;(
<a name="l01407"></a>01407           std::forward_as_tuple(std::forward&lt;_Args&gt;(__args)...),
<a name="l01408"></a>01408           _Bound_indexes());
<a name="l01409"></a>01409     }
<a name="l01410"></a>01410     };
<a name="l01411"></a>01411 <span class="comment"></span>
<a name="l01412"></a>01412 <span class="comment">  /**</span>
<a name="l01413"></a>01413 <span class="comment">   *  @brief Class template _Bind is always a bind expression.</span>
<a name="l01414"></a>01414 <span class="comment">   *  @ingroup binders</span>
<a name="l01415"></a>01415 <span class="comment">   */</span>
<a name="l01416"></a>01416   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt;
<a name="l01417"></a><a class="code" href="a00535.html">01417</a>     <span class="keyword">struct </span><a class="code" href="a00534.html" title="Determines if the given type _Tp is a function object should be treated as a subexpression when evalu...">is_bind_expression</a>&lt;_Bind&lt;_Signature&gt; &gt;
<a name="l01418"></a>01418     : <span class="keyword">public</span> <a class="code" href="a00257.html">true_type</a> { };
<a name="l01419"></a>01419 <span class="comment"></span>
<a name="l01420"></a>01420 <span class="comment">  /**</span>
<a name="l01421"></a>01421 <span class="comment">   *  @brief Class template _Bind is always a bind expression.</span>
<a name="l01422"></a>01422 <span class="comment">   *  @ingroup binders</span>
<a name="l01423"></a>01423 <span class="comment">   */</span>
<a name="l01424"></a>01424   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span> _Signature&gt;
<a name="l01425"></a><a class="code" href="a00536.html">01425</a>     <span class="keyword">struct </span><a class="code" href="a00534.html" title="Determines if the given type _Tp is a function object should be treated as a subexpression when evalu...">is_bind_expression</a>&lt;_Bind_result&lt;_Result, _Signature&gt; &gt;
<a name="l01426"></a>01426     : <span class="keyword">public</span> <a class="code" href="a00257.html">true_type</a> { };
<a name="l01427"></a>01427 
<a name="l01428"></a>01428   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01429"></a>01429     <span class="keyword">struct </span>_Bind_helper
<a name="l01430"></a>01430     {
<a name="l01431"></a>01431       <span class="keyword">typedef</span> <a class="code" href="a00334.html">_Maybe_wrap_member_pointer&lt;typename decay&lt;_Functor&gt;::type</a>&gt;
<a name="l01432"></a>01432     __maybe_type;
<a name="l01433"></a>01433       <span class="keyword">typedef</span> <span class="keyword">typename</span> __maybe_type::type __functor_type;
<a name="l01434"></a>01434       <span class="keyword">typedef</span> _Bind&lt;__functor_type(typename decay&lt;_ArgTypes&gt;::type...)&gt; type;
<a name="l01435"></a>01435     };
<a name="l01436"></a>01436 <span class="comment"></span>
<a name="l01437"></a>01437 <span class="comment">  /**</span>
<a name="l01438"></a>01438 <span class="comment">   *  @brief Function template for std::bind.</span>
<a name="l01439"></a>01439 <span class="comment">   *  @ingroup binders</span>
<a name="l01440"></a>01440 <span class="comment">   */</span>
<a name="l01441"></a>01441   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01442"></a>01442     <span class="keyword">inline</span>
<a name="l01443"></a>01443     <span class="keyword">typename</span> _Bind_helper&lt;_Functor, _ArgTypes...&gt;::type
<a name="l01444"></a><a class="code" href="a01180.html#ga14c36eec6e128c2003e69170f5804a2e">01444</a>     <a class="code" href="a01180.html#ga14c36eec6e128c2003e69170f5804a2e" title="Function template for std::bind.">bind</a>(_Functor&amp;&amp; __f, _ArgTypes&amp;&amp;... __args)
<a name="l01445"></a>01445     {
<a name="l01446"></a>01446       <span class="keyword">typedef</span> _Bind_helper&lt;_Functor, _ArgTypes...&gt; __helper_type;
<a name="l01447"></a>01447       <span class="keyword">typedef</span> <span class="keyword">typename</span> __helper_type::__maybe_type __maybe_type;
<a name="l01448"></a>01448       <span class="keyword">typedef</span> <span class="keyword">typename</span> __helper_type::type __result_type;
<a name="l01449"></a>01449       <span class="keywordflow">return</span> __result_type(__maybe_type::__do_wrap(std::forward&lt;_Functor&gt;(__f)),
<a name="l01450"></a>01450                std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01451"></a>01451     }
<a name="l01452"></a>01452 
<a name="l01453"></a>01453   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01454"></a>01454     <span class="keyword">struct </span>_Bindres_helper
<a name="l01455"></a>01455     {
<a name="l01456"></a>01456       <span class="keyword">typedef</span> _Maybe_wrap_member_pointer&lt;typename decay&lt;_Functor&gt;::type&gt;
<a name="l01457"></a>01457     __maybe_type;
<a name="l01458"></a>01458       <span class="keyword">typedef</span> <span class="keyword">typename</span> __maybe_type::type __functor_type;
<a name="l01459"></a>01459       <span class="keyword">typedef</span> _Bind_result&lt;_Result,
<a name="l01460"></a>01460                __functor_type(<span class="keyword">typename</span> decay&lt;_ArgTypes&gt;::type...)&gt;
<a name="l01461"></a>01461     type;
<a name="l01462"></a>01462     };
<a name="l01463"></a>01463 <span class="comment"></span>
<a name="l01464"></a>01464 <span class="comment">  /**</span>
<a name="l01465"></a>01465 <span class="comment">   *  @brief Function template for std::bind&lt;R&gt;.</span>
<a name="l01466"></a>01466 <span class="comment">   *  @ingroup binders</span>
<a name="l01467"></a>01467 <span class="comment">   */</span>
<a name="l01468"></a>01468   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Result, <span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01469"></a>01469     <span class="keyword">inline</span>
<a name="l01470"></a>01470     <span class="keyword">typename</span> _Bindres_helper&lt;_Result, _Functor, _ArgTypes...&gt;::type
<a name="l01471"></a><a class="code" href="a01137.html#ga14c36eec6e128c2003e69170f5804a2e">01471</a>     <a class="code" href="a01180.html#ga14c36eec6e128c2003e69170f5804a2e" title="Function template for std::bind.">bind</a>(_Functor&amp;&amp; __f, _ArgTypes&amp;&amp;... __args)
<a name="l01472"></a>01472     {
<a name="l01473"></a>01473       <span class="keyword">typedef</span> _Bindres_helper&lt;_Result, _Functor, _ArgTypes...&gt; __helper_type;
<a name="l01474"></a>01474       <span class="keyword">typedef</span> <span class="keyword">typename</span> __helper_type::__maybe_type __maybe_type;
<a name="l01475"></a>01475       <span class="keyword">typedef</span> <span class="keyword">typename</span> __helper_type::type __result_type;
<a name="l01476"></a>01476       <span class="keywordflow">return</span> __result_type(__maybe_type::__do_wrap(std::forward&lt;_Functor&gt;(__f)),
<a name="l01477"></a>01477                std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01478"></a>01478     }
<a name="l01479"></a>01479 <span class="comment"></span>
<a name="l01480"></a>01480 <span class="comment">  /**</span>
<a name="l01481"></a>01481 <span class="comment">   *  @brief Exception class thrown when class template function&#39;s</span>
<a name="l01482"></a>01482 <span class="comment">   *  operator() is called with an empty target.</span>
<a name="l01483"></a>01483 <span class="comment">   *  @ingroup exceptions</span>
<a name="l01484"></a>01484 <span class="comment">   */</span>
<a name="l01485"></a><a class="code" href="a00392.html">01485</a>   <span class="keyword">class </span><a class="code" href="a00392.html" title="Exception class thrown when class template function&#39;s operator() is called with an empty target...">bad_function_call</a> : <span class="keyword">public</span> std::<a class="code" href="a00466.html" title="Base class for all library exceptions.">exception</a>
<a name="l01486"></a>01486   {
<a name="l01487"></a>01487   <span class="keyword">public</span>:
<a name="l01488"></a>01488     <span class="keyword">virtual</span> ~<a class="code" href="a00392.html" title="Exception class thrown when class template function&#39;s operator() is called with an empty target...">bad_function_call</a>() <span class="keywordflow">throw</span>();
<a name="l01489"></a>01489   };
<a name="l01490"></a>01490 <span class="comment"></span>
<a name="l01491"></a>01491 <span class="comment">  /**</span>
<a name="l01492"></a>01492 <span class="comment">   *  Trait identifying &quot;location-invariant&quot; types, meaning that the</span>
<a name="l01493"></a>01493 <span class="comment">   *  address of the object (or any of its members) will not escape.</span>
<a name="l01494"></a>01494 <span class="comment">   *  Also implies a trivial copy constructor and assignment operator.</span>
<a name="l01495"></a>01495 <span class="comment">   */</span>
<a name="l01496"></a>01496   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01497"></a><a class="code" href="a00298.html">01497</a>     <span class="keyword">struct </span><a class="code" href="a00298.html">__is_location_invariant</a>
<a name="l01498"></a>01498     : <a class="code" href="a00257.html" title="integral_constant">integral_constant</a>&lt;bool, (is_pointer&lt;_Tp&gt;::value
<a name="l01499"></a>01499                    || is_member_pointer&lt;_Tp&gt;::value)&gt;
<a name="l01500"></a>01500     { };
<a name="l01501"></a>01501 
<a name="l01502"></a>01502   <span class="keyword">class </span>_Undefined_class;
<a name="l01503"></a>01503 
<a name="l01504"></a>01504   <span class="keyword">union </span>_Nocopy_types
<a name="l01505"></a>01505   {
<a name="l01506"></a>01506     <span class="keywordtype">void</span>*       _M_object;
<a name="l01507"></a>01507     <span class="keyword">const</span> <span class="keywordtype">void</span>* _M_const_object;
<a name="l01508"></a>01508     void (*_M_function_pointer)();
<a name="l01509"></a>01509     void (_Undefined_class::*_M_member_pointer)();
<a name="l01510"></a>01510   };
<a name="l01511"></a>01511 
<a name="l01512"></a>01512   <span class="keyword">union </span>_Any_data
<a name="l01513"></a>01513   {
<a name="l01514"></a>01514     <span class="keywordtype">void</span>*       _M_access()       { <span class="keywordflow">return</span> &amp;_M_pod_data[0]; }
<a name="l01515"></a>01515     <span class="keyword">const</span> <span class="keywordtype">void</span>* _M_access()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> &amp;_M_pod_data[0]; }
<a name="l01516"></a>01516 
<a name="l01517"></a>01517     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01518"></a>01518       _Tp&amp;
<a name="l01519"></a>01519       _M_access()
<a name="l01520"></a>01520       { <span class="keywordflow">return</span> *<span class="keyword">static_cast&lt;</span>_Tp*<span class="keyword">&gt;</span>(_M_access()); }
<a name="l01521"></a>01521 
<a name="l01522"></a>01522     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01523"></a>01523       <span class="keyword">const</span> _Tp&amp;
<a name="l01524"></a>01524       _M_access()<span class="keyword"> const</span>
<a name="l01525"></a>01525 <span class="keyword">      </span>{ <span class="keywordflow">return</span> *<span class="keyword">static_cast&lt;</span><span class="keyword">const </span>_Tp*<span class="keyword">&gt;</span>(_M_access()); }
<a name="l01526"></a>01526 
<a name="l01527"></a>01527     _Nocopy_types _M_unused;
<a name="l01528"></a>01528     <span class="keywordtype">char</span> _M_pod_data[<span class="keyword">sizeof</span>(_Nocopy_types)];
<a name="l01529"></a>01529   };
<a name="l01530"></a>01530 
<a name="l01531"></a>01531   <span class="keyword">enum</span> _Manager_operation
<a name="l01532"></a>01532   {
<a name="l01533"></a>01533     __get_type_info,
<a name="l01534"></a>01534     __get_functor_ptr,
<a name="l01535"></a>01535     __clone_functor,
<a name="l01536"></a>01536     __destroy_functor
<a name="l01537"></a>01537   };
<a name="l01538"></a>01538 
<a name="l01539"></a>01539   <span class="comment">// Simple type wrapper that helps avoid annoying const problems</span>
<a name="l01540"></a>01540   <span class="comment">// when casting between void pointers and pointers-to-pointers.</span>
<a name="l01541"></a>01541   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01542"></a>01542     <span class="keyword">struct </span>_Simple_type_wrapper
<a name="l01543"></a>01543     {
<a name="l01544"></a>01544       _Simple_type_wrapper(_Tp __value) : __value(__value) { }
<a name="l01545"></a>01545 
<a name="l01546"></a>01546       _Tp __value;
<a name="l01547"></a>01547     };
<a name="l01548"></a>01548 
<a name="l01549"></a>01549   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01550"></a>01550     <span class="keyword">struct </span>__is_location_invariant&lt;_Simple_type_wrapper&lt;_Tp&gt; &gt;
<a name="l01551"></a>01551     : __is_location_invariant&lt;_Tp&gt;
<a name="l01552"></a>01552     { };
<a name="l01553"></a>01553 
<a name="l01554"></a>01554   <span class="comment">// Converts a reference to a function object into a callable</span>
<a name="l01555"></a>01555   <span class="comment">// function object.</span>
<a name="l01556"></a>01556   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l01557"></a>01557     <span class="keyword">inline</span> _Functor&amp;
<a name="l01558"></a>01558     __callable_functor(_Functor&amp; __f)
<a name="l01559"></a>01559     { <span class="keywordflow">return</span> __f; }
<a name="l01560"></a>01560 
<a name="l01561"></a>01561   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Member, <span class="keyword">typename</span> _Class&gt;
<a name="l01562"></a>01562     <span class="keyword">inline</span> _Mem_fn&lt;_Member _Class::*&gt;
<a name="l01563"></a>01563     __callable_functor(_Member _Class::* &amp;__p)
<a name="l01564"></a>01564     { <span class="keywordflow">return</span> <a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2" title="Returns a function object that forwards to the member pointer pm.">mem_fn</a>(__p); }
<a name="l01565"></a>01565 
<a name="l01566"></a>01566   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Member, <span class="keyword">typename</span> _Class&gt;
<a name="l01567"></a>01567     <span class="keyword">inline</span> _Mem_fn&lt;_Member _Class::*&gt;
<a name="l01568"></a>01568     __callable_functor(_Member _Class::* <span class="keyword">const</span> &amp;__p)
<a name="l01569"></a>01569     { <span class="keywordflow">return</span> <a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2" title="Returns a function object that forwards to the member pointer pm.">mem_fn</a>(__p); }
<a name="l01570"></a>01570 
<a name="l01571"></a>01571   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt;
<a name="l01572"></a>01572     <span class="keyword">class </span>function;
<a name="l01573"></a>01573 <span class="comment"></span>
<a name="l01574"></a>01574 <span class="comment">  /// Base class of all polymorphic function object wrappers.</span>
<a name="l01575"></a><a class="code" href="a00321.html">01575</a> <span class="comment"></span>  <span class="keyword">class </span><a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>
<a name="l01576"></a>01576   {
<a name="l01577"></a>01577   <span class="keyword">public</span>:
<a name="l01578"></a>01578     <span class="keyword">static</span> <span class="keyword">const</span> std::size_t _M_max_size = <span class="keyword">sizeof</span>(_Nocopy_types);
<a name="l01579"></a>01579     <span class="keyword">static</span> <span class="keyword">const</span> std::size_t _M_max_align = __alignof__(_Nocopy_types);
<a name="l01580"></a>01580 
<a name="l01581"></a>01581     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l01582"></a>01582       <span class="keyword">class </span>_Base_manager
<a name="l01583"></a>01583       {
<a name="l01584"></a>01584       <span class="keyword">protected</span>:
<a name="l01585"></a>01585     <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> __stored_locally =
<a name="l01586"></a>01586     (<a class="code" href="a00298.html">__is_location_invariant&lt;_Functor&gt;::value</a>
<a name="l01587"></a>01587      &amp;&amp; <span class="keyword">sizeof</span>(_Functor) &lt;= _M_max_size
<a name="l01588"></a>01588      &amp;&amp; __alignof__(_Functor) &lt;= _M_max_align
<a name="l01589"></a>01589      &amp;&amp; (_M_max_align % __alignof__(_Functor) == 0));
<a name="l01590"></a>01590 
<a name="l01591"></a>01591     <span class="keyword">typedef</span> <a class="code" href="a00257.html" title="integral_constant">integral_constant&lt;bool, __stored_locally&gt;</a> _Local_storage;
<a name="l01592"></a>01592 
<a name="l01593"></a>01593     <span class="comment">// Retrieve a pointer to the function object</span>
<a name="l01594"></a>01594     <span class="keyword">static</span> _Functor*
<a name="l01595"></a>01595     _M_get_pointer(<span class="keyword">const</span> _Any_data&amp; __source)
<a name="l01596"></a>01596     {
<a name="l01597"></a>01597       <span class="keyword">const</span> _Functor* __ptr =
<a name="l01598"></a>01598         __stored_locally? std::__addressof(__source._M_access&lt;_Functor&gt;())
<a name="l01599"></a>01599         <span class="comment">/* have stored a pointer */</span> : __source._M_access&lt;_Functor*&gt;();
<a name="l01600"></a>01600       <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>_Functor*<span class="keyword">&gt;</span>(__ptr);
<a name="l01601"></a>01601     }
<a name="l01602"></a>01602 
<a name="l01603"></a>01603     <span class="comment">// Clone a location-invariant function object that fits within</span>
<a name="l01604"></a>01604     <span class="comment">// an _Any_data structure.</span>
<a name="l01605"></a>01605     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01606"></a>01606     _M_clone(_Any_data&amp; __dest, <span class="keyword">const</span> _Any_data&amp; __source, <a class="code" href="a00257.html">true_type</a>)
<a name="l01607"></a>01607     {
<a name="l01608"></a>01608       <span class="keyword">new</span> (__dest._M_access()) _Functor(__source._M_access&lt;_Functor&gt;());
<a name="l01609"></a>01609     }
<a name="l01610"></a>01610 
<a name="l01611"></a>01611     <span class="comment">// Clone a function object that is not location-invariant or</span>
<a name="l01612"></a>01612     <span class="comment">// that cannot fit into an _Any_data structure.</span>
<a name="l01613"></a>01613     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01614"></a>01614     _M_clone(_Any_data&amp; __dest, <span class="keyword">const</span> _Any_data&amp; __source, <a class="code" href="a00257.html">false_type</a>)
<a name="l01615"></a>01615     {
<a name="l01616"></a>01616       __dest._M_access&lt;_Functor*&gt;() =
<a name="l01617"></a>01617         <span class="keyword">new</span> _Functor(*__source._M_access&lt;_Functor*&gt;());
<a name="l01618"></a>01618     }
<a name="l01619"></a>01619 
<a name="l01620"></a>01620     <span class="comment">// Destroying a location-invariant object may still require</span>
<a name="l01621"></a>01621     <span class="comment">// destruction.</span>
<a name="l01622"></a>01622     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01623"></a>01623     _M_destroy(_Any_data&amp; __victim, <a class="code" href="a00257.html">true_type</a>)
<a name="l01624"></a>01624     {
<a name="l01625"></a>01625       __victim._M_access&lt;_Functor&gt;().~_Functor();
<a name="l01626"></a>01626     }
<a name="l01627"></a>01627 
<a name="l01628"></a>01628     <span class="comment">// Destroying an object located on the heap.</span>
<a name="l01629"></a>01629     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01630"></a>01630     _M_destroy(_Any_data&amp; __victim, <a class="code" href="a00257.html">false_type</a>)
<a name="l01631"></a>01631     {
<a name="l01632"></a>01632       <span class="keyword">delete</span> __victim._M_access&lt;_Functor*&gt;();
<a name="l01633"></a>01633     }
<a name="l01634"></a>01634 
<a name="l01635"></a>01635       <span class="keyword">public</span>:
<a name="l01636"></a>01636     <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01637"></a>01637     _M_manager(_Any_data&amp; __dest, <span class="keyword">const</span> _Any_data&amp; __source,
<a name="l01638"></a>01638            _Manager_operation __op)
<a name="l01639"></a>01639     {
<a name="l01640"></a>01640       <span class="keywordflow">switch</span> (__op)
<a name="l01641"></a>01641         {
<a name="l01642"></a>01642 <span class="preprocessor">#ifdef __GXX_RTTI</span>
<a name="l01643"></a>01643 <span class="preprocessor"></span>        <span class="keywordflow">case</span> __get_type_info:
<a name="l01644"></a>01644           __dest._M_access&lt;<span class="keyword">const</span> <a class="code" href="a00722.html" title="Part of RTTI.">type_info</a>*&gt;() = &amp;<span class="keyword">typeid</span>(_Functor);
<a name="l01645"></a>01645           <span class="keywordflow">break</span>;
<a name="l01646"></a>01646 <span class="preprocessor">#endif</span>
<a name="l01647"></a>01647 <span class="preprocessor"></span>        <span class="keywordflow">case</span> __get_functor_ptr:
<a name="l01648"></a>01648           __dest._M_access&lt;_Functor*&gt;() = _M_get_pointer(__source);
<a name="l01649"></a>01649           <span class="keywordflow">break</span>;
<a name="l01650"></a>01650 
<a name="l01651"></a>01651         <span class="keywordflow">case</span> __clone_functor:
<a name="l01652"></a>01652           _M_clone(__dest, __source, _Local_storage());
<a name="l01653"></a>01653           <span class="keywordflow">break</span>;
<a name="l01654"></a>01654 
<a name="l01655"></a>01655         <span class="keywordflow">case</span> __destroy_functor:
<a name="l01656"></a>01656           _M_destroy(__dest, _Local_storage());
<a name="l01657"></a>01657           <span class="keywordflow">break</span>;
<a name="l01658"></a>01658         }
<a name="l01659"></a>01659       <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01660"></a>01660     }
<a name="l01661"></a>01661 
<a name="l01662"></a>01662     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01663"></a>01663     _M_init_functor(_Any_data&amp; __functor, _Functor&amp;&amp; __f)
<a name="l01664"></a>01664     { _M_init_functor(__functor, std::move(__f), _Local_storage()); }
<a name="l01665"></a>01665 
<a name="l01666"></a>01666     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature&gt;
<a name="l01667"></a>01667       <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01668"></a>01668       _M_not_empty_function(<span class="keyword">const</span> function&lt;_Signature&gt;&amp; __f)
<a name="l01669"></a>01669       { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span><span class="keyword">&gt;</span>(__f); }
<a name="l01670"></a>01670 
<a name="l01671"></a>01671     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01672"></a>01672       <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01673"></a>01673       _M_not_empty_function(<span class="keyword">const</span> _Tp*&amp; __fp)
<a name="l01674"></a>01674       { <span class="keywordflow">return</span> __fp; }
<a name="l01675"></a>01675 
<a name="l01676"></a>01676     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Class, <span class="keyword">typename</span> _Tp&gt;
<a name="l01677"></a>01677       <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01678"></a>01678       _M_not_empty_function(_Tp _Class::* <span class="keyword">const</span>&amp; __mp)
<a name="l01679"></a>01679       { <span class="keywordflow">return</span> __mp; }
<a name="l01680"></a>01680 
<a name="l01681"></a>01681     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Tp&gt;
<a name="l01682"></a>01682       <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01683"></a>01683       _M_not_empty_function(<span class="keyword">const</span> _Tp&amp;)
<a name="l01684"></a>01684       { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
<a name="l01685"></a>01685 
<a name="l01686"></a>01686       <span class="keyword">private</span>:
<a name="l01687"></a>01687     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01688"></a>01688     _M_init_functor(_Any_data&amp; __functor, _Functor&amp;&amp; __f, <a class="code" href="a00257.html">true_type</a>)
<a name="l01689"></a>01689     { <span class="keyword">new</span> (__functor._M_access()) _Functor(std::move(__f)); }
<a name="l01690"></a>01690 
<a name="l01691"></a>01691     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01692"></a>01692     _M_init_functor(_Any_data&amp; __functor, _Functor&amp;&amp; __f, <a class="code" href="a00257.html">false_type</a>)
<a name="l01693"></a>01693     { __functor._M_access&lt;_Functor*&gt;() = <span class="keyword">new</span> _Functor(std::move(__f)); }
<a name="l01694"></a>01694       };
<a name="l01695"></a>01695 
<a name="l01696"></a>01696     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l01697"></a>01697       <span class="keyword">class </span>_Ref_manager : <span class="keyword">public</span> _Base_manager&lt;_Functor*&gt;
<a name="l01698"></a>01698       {
<a name="l01699"></a>01699     <span class="keyword">typedef</span> _Function_base::_Base_manager&lt;_Functor*&gt; _Base;
<a name="l01700"></a>01700 
<a name="l01701"></a>01701     <span class="keyword">public</span>:
<a name="l01702"></a>01702     <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01703"></a>01703     _M_manager(_Any_data&amp; __dest, <span class="keyword">const</span> _Any_data&amp; __source,
<a name="l01704"></a>01704            _Manager_operation __op)
<a name="l01705"></a>01705     {
<a name="l01706"></a>01706       <span class="keywordflow">switch</span> (__op)
<a name="l01707"></a>01707         {
<a name="l01708"></a>01708 <span class="preprocessor">#ifdef __GXX_RTTI</span>
<a name="l01709"></a>01709 <span class="preprocessor"></span>        <span class="keywordflow">case</span> __get_type_info:
<a name="l01710"></a>01710           __dest._M_access&lt;<span class="keyword">const</span> <a class="code" href="a00722.html" title="Part of RTTI.">type_info</a>*&gt;() = &amp;<span class="keyword">typeid</span>(_Functor);
<a name="l01711"></a>01711           <span class="keywordflow">break</span>;
<a name="l01712"></a>01712 <span class="preprocessor">#endif</span>
<a name="l01713"></a>01713 <span class="preprocessor"></span>        <span class="keywordflow">case</span> __get_functor_ptr:
<a name="l01714"></a>01714           __dest._M_access&lt;_Functor*&gt;() = *_Base::_M_get_pointer(__source);
<a name="l01715"></a>01715           <span class="keywordflow">return</span> <a class="code" href="a00539.html" title="is_const">is_const&lt;_Functor&gt;::value</a>;
<a name="l01716"></a>01716           <span class="keywordflow">break</span>;
<a name="l01717"></a>01717 
<a name="l01718"></a>01718         <span class="keywordflow">default</span>:
<a name="l01719"></a>01719           _Base::_M_manager(__dest, __source, __op);
<a name="l01720"></a>01720         }
<a name="l01721"></a>01721       <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01722"></a>01722     }
<a name="l01723"></a>01723 
<a name="l01724"></a>01724     <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01725"></a>01725     _M_init_functor(_Any_data&amp; __functor, <a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Functor&gt;</a> __f)
<a name="l01726"></a>01726     {
<a name="l01727"></a>01727       <span class="comment">// TBD: Use address_of function instead.</span>
<a name="l01728"></a>01728       _Base::_M_init_functor(__functor, &amp;__f.get());
<a name="l01729"></a>01729     }
<a name="l01730"></a>01730       };
<a name="l01731"></a>01731 
<a name="l01732"></a>01732     <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>() : _M_manager(0) { }
<a name="l01733"></a>01733 
<a name="l01734"></a>01734     ~<a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>()
<a name="l01735"></a>01735     {
<a name="l01736"></a>01736       <span class="keywordflow">if</span> (_M_manager)
<a name="l01737"></a>01737     _M_manager(_M_functor, _M_functor, __destroy_functor);
<a name="l01738"></a>01738     }
<a name="l01739"></a>01739 
<a name="l01740"></a>01740 
<a name="l01741"></a>01741     <span class="keywordtype">bool</span> _M_empty()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !_M_manager; }
<a name="l01742"></a>01742 
<a name="l01743"></a>01743     <span class="keyword">typedef</span> bool (*_Manager_type)(_Any_data&amp;, <span class="keyword">const</span> _Any_data&amp;,
<a name="l01744"></a>01744                   _Manager_operation);
<a name="l01745"></a>01745 
<a name="l01746"></a>01746     _Any_data     _M_functor;
<a name="l01747"></a>01747     _Manager_type _M_manager;
<a name="l01748"></a>01748   };
<a name="l01749"></a>01749 
<a name="l01750"></a>01750   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Signature, <span class="keyword">typename</span> _Functor&gt;
<a name="l01751"></a>01751     <span class="keyword">class </span>_Function_handler;
<a name="l01752"></a>01752 
<a name="l01753"></a>01753   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01754"></a>01754     <span class="keyword">class </span>_Function_handler&lt;_Res(_ArgTypes...), _Functor&gt;
<a name="l01755"></a>01755     : <span class="keyword">public</span> <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>::_Base_manager&lt;_Functor&gt;
<a name="l01756"></a>01756     {
<a name="l01757"></a>01757       <span class="keyword">typedef</span> _Function_base::_Base_manager&lt;_Functor&gt; _Base;
<a name="l01758"></a>01758 
<a name="l01759"></a>01759     <span class="keyword">public</span>:
<a name="l01760"></a>01760       <span class="keyword">static</span> _Res
<a name="l01761"></a>01761       _M_invoke(<span class="keyword">const</span> _Any_data&amp; __functor, _ArgTypes... __args)
<a name="l01762"></a>01762       {
<a name="l01763"></a>01763     <span class="keywordflow">return</span> (*_Base::_M_get_pointer(__functor))(
<a name="l01764"></a>01764         std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01765"></a>01765       }
<a name="l01766"></a>01766     };
<a name="l01767"></a>01767 
<a name="l01768"></a>01768   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01769"></a>01769     <span class="keyword">class </span>_Function_handler&lt;void(_ArgTypes...), _Functor&gt;
<a name="l01770"></a>01770     : <span class="keyword">public</span> _Function_base::_Base_manager&lt;_Functor&gt;
<a name="l01771"></a>01771     {
<a name="l01772"></a>01772       <span class="keyword">typedef</span> _Function_base::_Base_manager&lt;_Functor&gt; _Base;
<a name="l01773"></a>01773 
<a name="l01774"></a>01774      <span class="keyword">public</span>:
<a name="l01775"></a>01775       <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01776"></a>01776       _M_invoke(<span class="keyword">const</span> _Any_data&amp; __functor, _ArgTypes... __args)
<a name="l01777"></a>01777       {
<a name="l01778"></a>01778     (*_Base::_M_get_pointer(__functor))(
<a name="l01779"></a>01779         std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01780"></a>01780       }
<a name="l01781"></a>01781     };
<a name="l01782"></a>01782 
<a name="l01783"></a>01783   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01784"></a>01784     <span class="keyword">class </span>_Function_handler&lt;_Res(_ArgTypes...), reference_wrapper&lt;_Functor&gt; &gt;
<a name="l01785"></a>01785     : <span class="keyword">public</span> _Function_base::_Ref_manager&lt;_Functor&gt;
<a name="l01786"></a>01786     {
<a name="l01787"></a>01787       <span class="keyword">typedef</span> _Function_base::_Ref_manager&lt;_Functor&gt; _Base;
<a name="l01788"></a>01788 
<a name="l01789"></a>01789      <span class="keyword">public</span>:
<a name="l01790"></a>01790       <span class="keyword">static</span> _Res
<a name="l01791"></a>01791       _M_invoke(<span class="keyword">const</span> _Any_data&amp; __functor, _ArgTypes... __args)
<a name="l01792"></a>01792       {
<a name="l01793"></a>01793     <span class="keywordflow">return</span> __callable_functor(**_Base::_M_get_pointer(__functor))(
<a name="l01794"></a>01794           std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01795"></a>01795       }
<a name="l01796"></a>01796     };
<a name="l01797"></a>01797 
<a name="l01798"></a>01798   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01799"></a>01799     <span class="keyword">class </span>_Function_handler&lt;void(_ArgTypes...), reference_wrapper&lt;_Functor&gt; &gt;
<a name="l01800"></a>01800     : <span class="keyword">public</span> _Function_base::_Ref_manager&lt;_Functor&gt;
<a name="l01801"></a>01801     {
<a name="l01802"></a>01802       <span class="keyword">typedef</span> _Function_base::_Ref_manager&lt;_Functor&gt; _Base;
<a name="l01803"></a>01803 
<a name="l01804"></a>01804      <span class="keyword">public</span>:
<a name="l01805"></a>01805       <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01806"></a>01806       _M_invoke(<span class="keyword">const</span> _Any_data&amp; __functor, _ArgTypes... __args)
<a name="l01807"></a>01807       {
<a name="l01808"></a>01808     __callable_functor(**_Base::_M_get_pointer(__functor))(
<a name="l01809"></a>01809         std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01810"></a>01810       }
<a name="l01811"></a>01811     };
<a name="l01812"></a>01812 
<a name="l01813"></a>01813   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Class, <span class="keyword">typename</span> _Member, <span class="keyword">typename</span> _Res,
<a name="l01814"></a>01814        <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01815"></a>01815     <span class="keyword">class </span>_Function_handler&lt;_Res(_ArgTypes...), _Member _Class::*&gt;
<a name="l01816"></a>01816     : <span class="keyword">public</span> _Function_handler&lt;void(_ArgTypes...), _Member _Class::*&gt;
<a name="l01817"></a>01817     {
<a name="l01818"></a>01818       <span class="keyword">typedef</span> _Function_handler&lt;void(_ArgTypes...), _Member _Class::*&gt;
<a name="l01819"></a>01819     _Base;
<a name="l01820"></a>01820 
<a name="l01821"></a>01821      <span class="keyword">public</span>:
<a name="l01822"></a>01822       <span class="keyword">static</span> _Res
<a name="l01823"></a>01823       _M_invoke(<span class="keyword">const</span> _Any_data&amp; __functor, _ArgTypes... __args)
<a name="l01824"></a>01824       {
<a name="l01825"></a>01825     <span class="keywordflow">return</span> <a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2" title="Returns a function object that forwards to the member pointer pm.">mem_fn</a>(_Base::_M_get_pointer(__functor)-&gt;__value)(
<a name="l01826"></a>01826         std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01827"></a>01827       }
<a name="l01828"></a>01828     };
<a name="l01829"></a>01829 
<a name="l01830"></a>01830   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Class, <span class="keyword">typename</span> _Member, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01831"></a>01831     <span class="keyword">class </span>_Function_handler&lt;void(_ArgTypes...), _Member _Class::*&gt;
<a name="l01832"></a>01832     : <span class="keyword">public</span> _Function_base::_Base_manager&lt;
<a name="l01833"></a>01833          _Simple_type_wrapper&lt; _Member _Class::* &gt; &gt;
<a name="l01834"></a>01834     {
<a name="l01835"></a>01835       <span class="keyword">typedef</span> _Member _Class::* _Functor;
<a name="l01836"></a>01836       <span class="keyword">typedef</span> _Simple_type_wrapper&lt;_Functor&gt; _Wrapper;
<a name="l01837"></a>01837       <span class="keyword">typedef</span> _Function_base::_Base_manager&lt;_Wrapper&gt; _Base;
<a name="l01838"></a>01838 
<a name="l01839"></a>01839      <span class="keyword">public</span>:
<a name="l01840"></a>01840       <span class="keyword">static</span> <span class="keywordtype">bool</span>
<a name="l01841"></a>01841       _M_manager(_Any_data&amp; __dest, <span class="keyword">const</span> _Any_data&amp; __source,
<a name="l01842"></a>01842          _Manager_operation __op)
<a name="l01843"></a>01843       {
<a name="l01844"></a>01844     <span class="keywordflow">switch</span> (__op)
<a name="l01845"></a>01845       {
<a name="l01846"></a>01846 <span class="preprocessor">#ifdef __GXX_RTTI</span>
<a name="l01847"></a>01847 <span class="preprocessor"></span>      <span class="keywordflow">case</span> __get_type_info:
<a name="l01848"></a>01848         __dest._M_access&lt;<span class="keyword">const</span> type_info*&gt;() = &amp;<span class="keyword">typeid</span>(_Functor);
<a name="l01849"></a>01849         <span class="keywordflow">break</span>;
<a name="l01850"></a>01850 <span class="preprocessor">#endif</span>
<a name="l01851"></a>01851 <span class="preprocessor"></span>      <span class="keywordflow">case</span> __get_functor_ptr:
<a name="l01852"></a>01852         __dest._M_access&lt;_Functor*&gt;() =
<a name="l01853"></a>01853           &amp;_Base::_M_get_pointer(__source)-&gt;__value;
<a name="l01854"></a>01854         <span class="keywordflow">break</span>;
<a name="l01855"></a>01855 
<a name="l01856"></a>01856       <span class="keywordflow">default</span>:
<a name="l01857"></a>01857         _Base::_M_manager(__dest, __source, __op);
<a name="l01858"></a>01858       }
<a name="l01859"></a>01859     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01860"></a>01860       }
<a name="l01861"></a>01861 
<a name="l01862"></a>01862       <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l01863"></a>01863       _M_invoke(<span class="keyword">const</span> _Any_data&amp; __functor, _ArgTypes... __args)
<a name="l01864"></a>01864       {
<a name="l01865"></a>01865     <a class="code" href="a01193.html#ga69eb0d461f9c7b7395281721315882d2" title="Returns a function object that forwards to the member pointer pm.">mem_fn</a>(_Base::_M_get_pointer(__functor)-&gt;__value)(
<a name="l01866"></a>01866         std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l01867"></a>01867       }
<a name="l01868"></a>01868     };
<a name="l01869"></a>01869 <span class="comment"></span>
<a name="l01870"></a>01870 <span class="comment">  /**</span>
<a name="l01871"></a>01871 <span class="comment">   *  @brief Primary class template for std::function.</span>
<a name="l01872"></a>01872 <span class="comment">   *  @ingroup functors</span>
<a name="l01873"></a>01873 <span class="comment">   *</span>
<a name="l01874"></a>01874 <span class="comment">   *  Polymorphic function wrapper.</span>
<a name="l01875"></a>01875 <span class="comment">   */</span>
<a name="l01876"></a>01876   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l01877"></a><a class="code" href="a00478.html">01877</a>     <span class="keyword">class </span>function&lt;_Res(_ArgTypes...)&gt;
<a name="l01878"></a>01878     : <span class="keyword">public</span> <a class="code" href="a00238.html">_Maybe_unary_or_binary_function</a>&lt;_Res, _ArgTypes...&gt;,
<a name="l01879"></a>01879       <span class="keyword">private</span> <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>
<a name="l01880"></a>01880     {
<a name="l01881"></a>01881       <span class="keyword">typedef</span> _Res _Signature_type(_ArgTypes...);
<a name="l01882"></a>01882 
<a name="l01883"></a>01883       <span class="keyword">struct </span>_Useless { };
<a name="l01884"></a>01884 
<a name="l01885"></a>01885     <span class="keyword">public</span>:
<a name="l01886"></a>01886       <span class="keyword">typedef</span> _Res result_type;
<a name="l01887"></a>01887 
<a name="l01888"></a>01888       <span class="comment">// [3.7.2.1] construct/copy/destroy</span>
<a name="l01889"></a>01889 <span class="comment"></span>
<a name="l01890"></a>01890 <span class="comment">      /**</span>
<a name="l01891"></a>01891 <span class="comment">       *  @brief Default construct creates an empty function call wrapper.</span>
<a name="l01892"></a>01892 <span class="comment">       *  @post @c !(bool)*this</span>
<a name="l01893"></a>01893 <span class="comment">       */</span>
<a name="l01894"></a><a class="code" href="a00478.html#af6be5fe890ef1283903d26d3ab314995">01894</a>       <a class="code" href="a00478.html#af6be5fe890ef1283903d26d3ab314995" title="Default construct creates an empty function call wrapper.">function</a>() : <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>() { }
<a name="l01895"></a>01895 <span class="comment"></span>
<a name="l01896"></a>01896 <span class="comment">      /**</span>
<a name="l01897"></a>01897 <span class="comment">       *  @brief Creates an empty function call wrapper.</span>
<a name="l01898"></a>01898 <span class="comment">       *  @post @c !(bool)*this</span>
<a name="l01899"></a>01899 <span class="comment">       */</span>
<a name="l01900"></a><a class="code" href="a00478.html#a3ba292105d8b130daf1f645f00d756da">01900</a>       <a class="code" href="a00478.html#a3ba292105d8b130daf1f645f00d756da" title="Creates an empty function call wrapper.">function</a>(nullptr_t) : <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>() { }
<a name="l01901"></a>01901 <span class="comment"></span>
<a name="l01902"></a>01902 <span class="comment">      /**</span>
<a name="l01903"></a>01903 <span class="comment">       *  @brief %Function copy constructor.</span>
<a name="l01904"></a>01904 <span class="comment">       *  @param x A %function object with identical call signature.</span>
<a name="l01905"></a>01905 <span class="comment">       *  @post @c (bool)*this == (bool)x</span>
<a name="l01906"></a>01906 <span class="comment">       *</span>
<a name="l01907"></a>01907 <span class="comment">       *  The newly-created %function contains a copy of the target of @a</span>
<a name="l01908"></a>01908 <span class="comment">       *  x (if it has one).</span>
<a name="l01909"></a>01909 <span class="comment">       */</span>
<a name="l01910"></a>01910       function(<span class="keyword">const</span> function&amp; __x);
<a name="l01911"></a>01911 <span class="comment"></span>
<a name="l01912"></a>01912 <span class="comment">      /**</span>
<a name="l01913"></a>01913 <span class="comment">       *  @brief %Function move constructor.</span>
<a name="l01914"></a>01914 <span class="comment">       *  @param x A %function object rvalue with identical call signature.</span>
<a name="l01915"></a>01915 <span class="comment">       *</span>
<a name="l01916"></a>01916 <span class="comment">       *  The newly-created %function contains the target of @a x</span>
<a name="l01917"></a>01917 <span class="comment">       *  (if it has one).</span>
<a name="l01918"></a>01918 <span class="comment">       */</span>
<a name="l01919"></a><a class="code" href="a00478.html#adae21cbabc722f1919974767cd2e97b5">01919</a>       function(function&amp;&amp; __x) : <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>()
<a name="l01920"></a>01920       {
<a name="l01921"></a>01921     __x.swap(*<span class="keyword">this</span>);
<a name="l01922"></a>01922       }
<a name="l01923"></a>01923 
<a name="l01924"></a>01924       <span class="comment">// TODO: needs allocator_arg_t</span>
<a name="l01925"></a>01925 <span class="comment"></span>
<a name="l01926"></a>01926 <span class="comment">      /**</span>
<a name="l01927"></a>01927 <span class="comment">       *  @brief Builds a %function that targets a copy of the incoming</span>
<a name="l01928"></a>01928 <span class="comment">       *  function object.</span>
<a name="l01929"></a>01929 <span class="comment">       *  @param f A %function object that is callable with parameters of</span>
<a name="l01930"></a>01930 <span class="comment">       *  type @c T1, @c T2, ..., @c TN and returns a value convertible</span>
<a name="l01931"></a>01931 <span class="comment">       *  to @c Res.</span>
<a name="l01932"></a>01932 <span class="comment">       *</span>
<a name="l01933"></a>01933 <span class="comment">       *  The newly-created %function object will target a copy of @a</span>
<a name="l01934"></a>01934 <span class="comment">       *  f. If @a f is @c reference_wrapper&lt;F&gt;, then this function</span>
<a name="l01935"></a>01935 <span class="comment">       *  object will contain a reference to the function object @c</span>
<a name="l01936"></a>01936 <span class="comment">       *  f.get(). If @a f is a NULL function pointer or NULL</span>
<a name="l01937"></a>01937 <span class="comment">       *  pointer-to-member, the newly-created object will be empty.</span>
<a name="l01938"></a>01938 <span class="comment">       *</span>
<a name="l01939"></a>01939 <span class="comment">       *  If @a f is a non-NULL function pointer or an object of type @c</span>
<a name="l01940"></a>01940 <span class="comment">       *  reference_wrapper&lt;F&gt;, this function will not throw.</span>
<a name="l01941"></a>01941 <span class="comment">       */</span>
<a name="l01942"></a>01942       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l01943"></a>01943     function(_Functor __f,
<a name="l01944"></a>01944          <span class="keyword">typename</span> <a class="code" href="a00255.html" title="enable_if">enable_if</a>&lt;
<a name="l01945"></a>01945                !<a class="code" href="a00549.html" title="is_integral">is_integral&lt;_Functor&gt;::value</a>, _Useless&gt;::type
<a name="l01946"></a>01946            = _Useless());
<a name="l01947"></a>01947 <span class="comment"></span>
<a name="l01948"></a>01948 <span class="comment">      /**</span>
<a name="l01949"></a>01949 <span class="comment">       *  @brief %Function assignment operator.</span>
<a name="l01950"></a>01950 <span class="comment">       *  @param x A %function with identical call signature.</span>
<a name="l01951"></a>01951 <span class="comment">       *  @post @c (bool)*this == (bool)x</span>
<a name="l01952"></a>01952 <span class="comment">       *  @returns @c *this</span>
<a name="l01953"></a>01953 <span class="comment">       *</span>
<a name="l01954"></a>01954 <span class="comment">       *  The target of @a x is copied to @c *this. If @a x has no</span>
<a name="l01955"></a>01955 <span class="comment">       *  target, then @c *this will be empty.</span>
<a name="l01956"></a>01956 <span class="comment">       *</span>
<a name="l01957"></a>01957 <span class="comment">       *  If @a x targets a function pointer or a reference to a function</span>
<a name="l01958"></a>01958 <span class="comment">       *  object, then this operation will not throw an %exception.</span>
<a name="l01959"></a>01959 <span class="comment">       */</span>
<a name="l01960"></a>01960       function&amp;
<a name="l01961"></a><a class="code" href="a00478.html#a698ecd83665a25c0c1f9cbe2ea85c2a0">01961</a>       operator=(<span class="keyword">const</span> function&amp; __x)
<a name="l01962"></a>01962       {
<a name="l01963"></a>01963     function(__x).swap(*<span class="keyword">this</span>);
<a name="l01964"></a>01964     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l01965"></a>01965       }
<a name="l01966"></a>01966 <span class="comment"></span>
<a name="l01967"></a>01967 <span class="comment">      /**</span>
<a name="l01968"></a>01968 <span class="comment">       *  @brief %Function move-assignment operator.</span>
<a name="l01969"></a>01969 <span class="comment">       *  @param x A %function rvalue with identical call signature.</span>
<a name="l01970"></a>01970 <span class="comment">       *  @returns @c *this</span>
<a name="l01971"></a>01971 <span class="comment">       *</span>
<a name="l01972"></a>01972 <span class="comment">       *  The target of @a x is moved to @c *this. If @a x has no</span>
<a name="l01973"></a>01973 <span class="comment">       *  target, then @c *this will be empty.</span>
<a name="l01974"></a>01974 <span class="comment">       *</span>
<a name="l01975"></a>01975 <span class="comment">       *  If @a x targets a function pointer or a reference to a function</span>
<a name="l01976"></a>01976 <span class="comment">       *  object, then this operation will not throw an %exception.</span>
<a name="l01977"></a>01977 <span class="comment">       */</span>
<a name="l01978"></a>01978       function&amp;
<a name="l01979"></a><a class="code" href="a00478.html#aef5e5902a947935662963c9b53d5b383">01979</a>       operator=(function&amp;&amp; __x)
<a name="l01980"></a>01980       {
<a name="l01981"></a>01981     function(std::move(__x)).swap(*<span class="keyword">this</span>);
<a name="l01982"></a>01982     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l01983"></a>01983       }
<a name="l01984"></a>01984 <span class="comment"></span>
<a name="l01985"></a>01985 <span class="comment">      /**</span>
<a name="l01986"></a>01986 <span class="comment">       *  @brief %Function assignment to zero.</span>
<a name="l01987"></a>01987 <span class="comment">       *  @post @c !(bool)*this</span>
<a name="l01988"></a>01988 <span class="comment">       *  @returns @c *this</span>
<a name="l01989"></a>01989 <span class="comment">       *</span>
<a name="l01990"></a>01990 <span class="comment">       *  The target of @c *this is deallocated, leaving it empty.</span>
<a name="l01991"></a>01991 <span class="comment">       */</span>
<a name="l01992"></a>01992       function&amp;
<a name="l01993"></a><a class="code" href="a00478.html#a298583547a0091449a5ea8cba01d5490">01993</a>       operator=(nullptr_t)
<a name="l01994"></a>01994       {
<a name="l01995"></a>01995     <span class="keywordflow">if</span> (_M_manager)
<a name="l01996"></a>01996       {
<a name="l01997"></a>01997         _M_manager(_M_functor, _M_functor, __destroy_functor);
<a name="l01998"></a>01998         _M_manager = 0;
<a name="l01999"></a>01999         _M_invoker = 0;
<a name="l02000"></a>02000       }
<a name="l02001"></a>02001     <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l02002"></a>02002       }
<a name="l02003"></a>02003 <span class="comment"></span>
<a name="l02004"></a>02004 <span class="comment">      /**</span>
<a name="l02005"></a>02005 <span class="comment">       *  @brief %Function assignment to a new target.</span>
<a name="l02006"></a>02006 <span class="comment">       *  @param f A %function object that is callable with parameters of</span>
<a name="l02007"></a>02007 <span class="comment">       *  type @c T1, @c T2, ..., @c TN and returns a value convertible</span>
<a name="l02008"></a>02008 <span class="comment">       *  to @c Res.</span>
<a name="l02009"></a>02009 <span class="comment">       *  @return @c *this</span>
<a name="l02010"></a>02010 <span class="comment">       *</span>
<a name="l02011"></a>02011 <span class="comment">       *  This  %function object wrapper will target a copy of @a</span>
<a name="l02012"></a>02012 <span class="comment">       *  f. If @a f is @c reference_wrapper&lt;F&gt;, then this function</span>
<a name="l02013"></a>02013 <span class="comment">       *  object will contain a reference to the function object @c</span>
<a name="l02014"></a>02014 <span class="comment">       *  f.get(). If @a f is a NULL function pointer or NULL</span>
<a name="l02015"></a>02015 <span class="comment">       *  pointer-to-member, @c this object will be empty.</span>
<a name="l02016"></a>02016 <span class="comment">       *</span>
<a name="l02017"></a>02017 <span class="comment">       *  If @a f is a non-NULL function pointer or an object of type @c</span>
<a name="l02018"></a>02018 <span class="comment">       *  reference_wrapper&lt;F&gt;, this function will not throw.</span>
<a name="l02019"></a>02019 <span class="comment">       */</span>
<a name="l02020"></a>02020       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l02021"></a>02021     <span class="keyword">typename</span> <a class="code" href="a00255.html" title="enable_if">enable_if&lt;!is_integral&lt;_Functor&gt;::value</a>, function&amp;&gt;::type
<a name="l02022"></a><a class="code" href="a00478.html#a4695ac70856182b47dca06f272dc339f">02022</a>     operator=(_Functor&amp;&amp; __f)
<a name="l02023"></a>02023     {
<a name="l02024"></a>02024       function(std::forward&lt;_Functor&gt;(__f)).swap(*<span class="keyword">this</span>);
<a name="l02025"></a>02025       <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l02026"></a>02026     }
<a name="l02027"></a>02027 <span class="comment"></span>
<a name="l02028"></a>02028 <span class="comment">      /// @overload</span>
<a name="l02029"></a>02029 <span class="comment"></span>      <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l02030"></a>02030     <span class="keyword">typename</span> <a class="code" href="a00255.html" title="enable_if">enable_if&lt;!is_integral&lt;_Functor&gt;::value</a>, function&amp;&gt;::type
<a name="l02031"></a><a class="code" href="a00478.html#aaee10be326112cabdb9f0e8c5f845ce0">02031</a>     operator=(<a class="code" href="a00681.html" title="Primary class template for reference_wrapper.">reference_wrapper&lt;_Functor&gt;</a> __f)
<a name="l02032"></a>02032     {
<a name="l02033"></a>02033       function(__f).swap(*<span class="keyword">this</span>);
<a name="l02034"></a>02034       <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l02035"></a>02035     }
<a name="l02036"></a>02036 
<a name="l02037"></a>02037       <span class="comment">// [3.7.2.2] function modifiers</span>
<a name="l02038"></a>02038 <span class="comment"></span>
<a name="l02039"></a>02039 <span class="comment">      /**</span>
<a name="l02040"></a>02040 <span class="comment">       *  @brief Swap the targets of two %function objects.</span>
<a name="l02041"></a>02041 <span class="comment">       *  @param f A %function with identical call signature.</span>
<a name="l02042"></a>02042 <span class="comment">       *</span>
<a name="l02043"></a>02043 <span class="comment">       *  Swap the targets of @c this function object and @a f. This</span>
<a name="l02044"></a>02044 <span class="comment">       *  function will not throw an %exception.</span>
<a name="l02045"></a>02045 <span class="comment">       */</span>
<a name="l02046"></a><a class="code" href="a00478.html#a6bcb2484183496e238f5da4e87d7e4e5">02046</a>       <span class="keywordtype">void</span> swap(function&amp; __x)
<a name="l02047"></a>02047       {
<a name="l02048"></a>02048     std::swap(_M_functor, __x._M_functor);
<a name="l02049"></a>02049     std::swap(_M_manager, __x._M_manager);
<a name="l02050"></a>02050     std::swap(_M_invoker, __x._M_invoker);
<a name="l02051"></a>02051       }
<a name="l02052"></a>02052 
<a name="l02053"></a>02053       <span class="comment">// TODO: needs allocator_arg_t</span>
<a name="l02054"></a>02054       <span class="comment">/*</span>
<a name="l02055"></a>02055 <span class="comment">      template&lt;typename _Functor, typename _Alloc&gt;</span>
<a name="l02056"></a>02056 <span class="comment">    void</span>
<a name="l02057"></a>02057 <span class="comment">    assign(_Functor&amp;&amp; __f, const _Alloc&amp; __a)</span>
<a name="l02058"></a>02058 <span class="comment">    {</span>
<a name="l02059"></a>02059 <span class="comment">      function(allocator_arg, __a,</span>
<a name="l02060"></a>02060 <span class="comment">           std::forward&lt;_Functor&gt;(__f)).swap(*this);</span>
<a name="l02061"></a>02061 <span class="comment">    }</span>
<a name="l02062"></a>02062 <span class="comment">      */</span>
<a name="l02063"></a>02063 
<a name="l02064"></a>02064       <span class="comment">// [3.7.2.3] function capacity</span>
<a name="l02065"></a>02065 <span class="comment"></span>
<a name="l02066"></a>02066 <span class="comment">      /**</span>
<a name="l02067"></a>02067 <span class="comment">       *  @brief Determine if the %function wrapper has a target.</span>
<a name="l02068"></a>02068 <span class="comment">       *</span>
<a name="l02069"></a>02069 <span class="comment">       *  @return @c true when this %function object contains a target,</span>
<a name="l02070"></a>02070 <span class="comment">       *  or @c false when it is empty.</span>
<a name="l02071"></a>02071 <span class="comment">       *</span>
<a name="l02072"></a>02072 <span class="comment">       *  This function will not throw an %exception.</span>
<a name="l02073"></a>02073 <span class="comment">       */</span>
<a name="l02074"></a><a class="code" href="a00478.html#a894c0d8716aeda6370db417317d899c1">02074</a>       <span class="keyword">explicit</span> operator bool()<span class="keyword"> const</span>
<a name="l02075"></a>02075 <span class="keyword">      </span>{ <span class="keywordflow">return</span> !_M_empty(); }
<a name="l02076"></a>02076 
<a name="l02077"></a>02077       <span class="comment">// [3.7.2.4] function invocation</span>
<a name="l02078"></a>02078 <span class="comment"></span>
<a name="l02079"></a>02079 <span class="comment">      /**</span>
<a name="l02080"></a>02080 <span class="comment">       *  @brief Invokes the function targeted by @c *this.</span>
<a name="l02081"></a>02081 <span class="comment">       *  @returns the result of the target.</span>
<a name="l02082"></a>02082 <span class="comment">       *  @throws bad_function_call when @c !(bool)*this</span>
<a name="l02083"></a>02083 <span class="comment">       *</span>
<a name="l02084"></a>02084 <span class="comment">       *  The function call operator invokes the target function object</span>
<a name="l02085"></a>02085 <span class="comment">       *  stored by @c this.</span>
<a name="l02086"></a>02086 <span class="comment">       */</span>
<a name="l02087"></a>02087       _Res operator()(_ArgTypes... __args) <span class="keyword">const</span>;
<a name="l02088"></a>02088 
<a name="l02089"></a>02089 <span class="preprocessor">#ifdef __GXX_RTTI</span>
<a name="l02090"></a>02090 <span class="preprocessor"></span>      <span class="comment">// [3.7.2.5] function target access</span><span class="comment"></span>
<a name="l02091"></a>02091 <span class="comment">      /**</span>
<a name="l02092"></a>02092 <span class="comment">       *  @brief Determine the type of the target of this function object</span>
<a name="l02093"></a>02093 <span class="comment">       *  wrapper.</span>
<a name="l02094"></a>02094 <span class="comment">       *</span>
<a name="l02095"></a>02095 <span class="comment">       *  @returns the type identifier of the target function object, or</span>
<a name="l02096"></a>02096 <span class="comment">       *  @c typeid(void) if @c !(bool)*this.</span>
<a name="l02097"></a>02097 <span class="comment">       *</span>
<a name="l02098"></a>02098 <span class="comment">       *  This function will not throw an %exception.</span>
<a name="l02099"></a>02099 <span class="comment">       */</span>
<a name="l02100"></a>02100       <span class="keyword">const</span> <a class="code" href="a00722.html" title="Part of RTTI.">type_info</a>&amp; target_type() <span class="keyword">const</span>;
<a name="l02101"></a>02101 <span class="comment"></span>
<a name="l02102"></a>02102 <span class="comment">      /**</span>
<a name="l02103"></a>02103 <span class="comment">       *  @brief Access the stored target function object.</span>
<a name="l02104"></a>02104 <span class="comment">       *</span>
<a name="l02105"></a>02105 <span class="comment">       *  @return Returns a pointer to the stored target function object,</span>
<a name="l02106"></a>02106 <span class="comment">       *  if @c typeid(Functor).equals(target_type()); otherwise, a NULL</span>
<a name="l02107"></a>02107 <span class="comment">       *  pointer.</span>
<a name="l02108"></a>02108 <span class="comment">       *</span>
<a name="l02109"></a>02109 <span class="comment">       * This function will not throw an %exception.</span>
<a name="l02110"></a>02110 <span class="comment">       */</span>
<a name="l02111"></a>02111       <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;       _Functor* target();
<a name="l02112"></a>02112 <span class="comment"></span>
<a name="l02113"></a>02113 <span class="comment">      /// @overload</span>
<a name="l02114"></a>02114 <span class="comment"></span>      <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt; <span class="keyword">const</span> _Functor* target() <span class="keyword">const</span>;
<a name="l02115"></a>02115 <span class="preprocessor">#endif</span>
<a name="l02116"></a>02116 <span class="preprocessor"></span>
<a name="l02117"></a>02117     <span class="keyword">private</span>:
<a name="l02118"></a>02118       <span class="keyword">typedef</span> _Res (*_Invoker_type)(<span class="keyword">const</span> _Any_data&amp;, _ArgTypes...);
<a name="l02119"></a>02119       _Invoker_type _M_invoker;
<a name="l02120"></a>02120   };
<a name="l02121"></a>02121 
<a name="l02122"></a>02122   <span class="comment">// Out-of-line member definitions.</span>
<a name="l02123"></a>02123   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l02124"></a>02124     function&lt;_Res(_ArgTypes...)&gt;::
<a name="l02125"></a><a class="code" href="a00478.html#a8869fed86e489fcedbf59cd814f440b3">02125</a>     function(<span class="keyword">const</span> function&amp; __x)
<a name="l02126"></a>02126     : <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>()
<a name="l02127"></a>02127     {
<a name="l02128"></a>02128       <span class="keywordflow">if</span> (static_cast&lt;bool&gt;(__x))
<a name="l02129"></a>02129     {
<a name="l02130"></a>02130       _M_invoker = __x._M_invoker;
<a name="l02131"></a>02131       _M_manager = __x._M_manager;
<a name="l02132"></a>02132       __x._M_manager(_M_functor, __x._M_functor, __clone_functor);
<a name="l02133"></a>02133     }
<a name="l02134"></a>02134     }
<a name="l02135"></a>02135 
<a name="l02136"></a>02136   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l02137"></a>02137     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l02138"></a>02138       function&lt;_Res(_ArgTypes...)&gt;::
<a name="l02139"></a><a class="code" href="a00478.html#a94c773f1583605042fdece8a49d6325b">02139</a>       function(_Functor __f,
<a name="l02140"></a>02140            <span class="keyword">typename</span> <a class="code" href="a00255.html" title="enable_if">enable_if</a>&lt;
<a name="l02141"></a>02141             !<a class="code" href="a00549.html" title="is_integral">is_integral&lt;_Functor&gt;::value</a>, _Useless&gt;::type)
<a name="l02142"></a>02142       : <a class="code" href="a00321.html" title="Base class of all polymorphic function object wrappers.">_Function_base</a>()
<a name="l02143"></a>02143       {
<a name="l02144"></a>02144     <span class="keyword">typedef</span> _Function_handler&lt;_Signature_type, _Functor&gt; _My_handler;
<a name="l02145"></a>02145 
<a name="l02146"></a>02146     <span class="keywordflow">if</span> (_My_handler::_M_not_empty_function(__f))
<a name="l02147"></a>02147       {
<a name="l02148"></a>02148         _M_invoker = &amp;_My_handler::_M_invoke;
<a name="l02149"></a>02149         _M_manager = &amp;_My_handler::_M_manager;
<a name="l02150"></a>02150         _My_handler::_M_init_functor(_M_functor, std::move(__f));
<a name="l02151"></a>02151       }
<a name="l02152"></a>02152       }
<a name="l02153"></a>02153 
<a name="l02154"></a>02154   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l02155"></a>02155     _Res
<a name="l02156"></a>02156     function&lt;_Res(_ArgTypes...)&gt;::
<a name="l02157"></a><a class="code" href="a00478.html#a8679700c9c0654b0104ae3d4a285ab8d">02157</a>     operator()(_ArgTypes... __args)<span class="keyword"> const</span>
<a name="l02158"></a>02158 <span class="keyword">    </span>{
<a name="l02159"></a>02159       <span class="keywordflow">if</span> (_M_empty())
<a name="l02160"></a>02160     __throw_bad_function_call();
<a name="l02161"></a>02161       <span class="keywordflow">return</span> _M_invoker(_M_functor, std::forward&lt;_ArgTypes&gt;(__args)...);
<a name="l02162"></a>02162     }
<a name="l02163"></a>02163 
<a name="l02164"></a>02164 <span class="preprocessor">#ifdef __GXX_RTTI</span>
<a name="l02165"></a>02165 <span class="preprocessor"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l02166"></a>02166     <span class="keyword">const</span> <a class="code" href="a00722.html" title="Part of RTTI.">type_info</a>&amp;
<a name="l02167"></a>02167     function&lt;_Res(_ArgTypes...)&gt;::
<a name="l02168"></a><a class="code" href="a00478.html#aa05de936db3bc6945194de5fe001d63d">02168</a>     target_type() <span class="keyword">const</span>
<a name="l02169"></a>02169     {
<a name="l02170"></a>02170       <span class="keywordflow">if</span> (_M_manager)
<a name="l02171"></a>02171     {
<a name="l02172"></a>02172       _Any_data __typeinfo_result;
<a name="l02173"></a>02173       _M_manager(__typeinfo_result, _M_functor, __get_type_info);
<a name="l02174"></a>02174       <span class="keywordflow">return</span> *__typeinfo_result._M_access&lt;<span class="keyword">const</span> <a class="code" href="a00722.html" title="Part of RTTI.">type_info</a>*&gt;();
<a name="l02175"></a>02175     }
<a name="l02176"></a>02176       <span class="keywordflow">else</span>
<a name="l02177"></a>02177     <span class="keywordflow">return</span> <span class="keyword">typeid</span>(void);
<a name="l02178"></a>02178     }
<a name="l02179"></a>02179 
<a name="l02180"></a>02180   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l02181"></a>02181     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l02182"></a>02182       _Functor*
<a name="l02183"></a>02183       function&lt;_Res(_ArgTypes...)&gt;::
<a name="l02184"></a><a class="code" href="a00478.html#ad18f38e9df30b14eeb42aebaa4bf2d4d">02184</a>       target()
<a name="l02185"></a>02185       {
<a name="l02186"></a>02186     <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(_Functor) == target_type() &amp;&amp; _M_manager)
<a name="l02187"></a>02187       {
<a name="l02188"></a>02188         _Any_data __ptr;
<a name="l02189"></a>02189         <span class="keywordflow">if</span> (_M_manager(__ptr, _M_functor, __get_functor_ptr)
<a name="l02190"></a>02190         &amp;&amp; !<a class="code" href="a00539.html" title="is_const">is_const&lt;_Functor&gt;::value</a>)
<a name="l02191"></a>02191           <span class="keywordflow">return</span> 0;
<a name="l02192"></a>02192         <span class="keywordflow">else</span>
<a name="l02193"></a>02193           <span class="keywordflow">return</span> __ptr._M_access&lt;_Functor*&gt;();
<a name="l02194"></a>02194       }
<a name="l02195"></a>02195     <span class="keywordflow">else</span>
<a name="l02196"></a>02196       <span class="keywordflow">return</span> 0;
<a name="l02197"></a>02197       }
<a name="l02198"></a>02198 
<a name="l02199"></a>02199   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _ArgTypes&gt;
<a name="l02200"></a>02200     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Functor&gt;
<a name="l02201"></a>02201       <span class="keyword">const</span> _Functor*
<a name="l02202"></a>02202       function&lt;_Res(_ArgTypes...)&gt;::
<a name="l02203"></a><a class="code" href="a00478.html#aea904c980fa5469cfa7276b6466b7054">02203</a>       target() <span class="keyword">const</span>
<a name="l02204"></a>02204       {
<a name="l02205"></a>02205     <span class="keywordflow">if</span> (<span class="keyword">typeid</span>(_Functor) == target_type() &amp;&amp; _M_manager)
<a name="l02206"></a>02206       {
<a name="l02207"></a>02207         _Any_data __ptr;
<a name="l02208"></a>02208         _M_manager(__ptr, _M_functor, __get_functor_ptr);
<a name="l02209"></a>02209         <span class="keywordflow">return</span> __ptr._M_access&lt;<span class="keyword">const</span> _Functor*&gt;();
<a name="l02210"></a>02210       }
<a name="l02211"></a>02211     <span class="keywordflow">else</span>
<a name="l02212"></a>02212       <span class="keywordflow">return</span> 0;
<a name="l02213"></a>02213       }
<a name="l02214"></a>02214 <span class="preprocessor">#endif</span>
<a name="l02215"></a>02215 <span class="preprocessor"></span>
<a name="l02216"></a>02216   <span class="comment">// [20.7.15.2.6] null pointer comparisons</span>
<a name="l02217"></a>02217 <span class="comment"></span>
<a name="l02218"></a>02218 <span class="comment">  /**</span>
<a name="l02219"></a>02219 <span class="comment">   *  @brief Compares a polymorphic function object wrapper against 0</span>
<a name="l02220"></a>02220 <span class="comment">   *  (the NULL pointer).</span>
<a name="l02221"></a>02221 <span class="comment">   *  @returns @c true if the wrapper has no target, @c false otherwise</span>
<a name="l02222"></a>02222 <span class="comment">   *</span>
<a name="l02223"></a>02223 <span class="comment">   *  This function will not throw an %exception.</span>
<a name="l02224"></a>02224 <span class="comment">   */</span>
<a name="l02225"></a>02225   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args&gt;
<a name="l02226"></a>02226     <span class="keyword">inline</span> <span class="keywordtype">bool</span>
<a name="l02227"></a><a class="code" href="a01137.html#abe44ef96ba2cf2ec5214b0a6d152fc0e">02227</a>     operator==(<span class="keyword">const</span> function&lt;_Res(_Args...)&gt;&amp; __f, nullptr_t)
<a name="l02228"></a>02228     { <span class="keywordflow">return</span> !<span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span><span class="keyword">&gt;</span>(__f); }
<a name="l02229"></a>02229 <span class="comment"></span>
<a name="l02230"></a>02230 <span class="comment">  /// @overload</span>
<a name="l02231"></a>02231 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args&gt;
<a name="l02232"></a>02232     <span class="keyword">inline</span> <span class="keywordtype">bool</span>
<a name="l02233"></a><a class="code" href="a01137.html#aae0af43967188d192e21159beae210f6">02233</a>     operator==(nullptr_t, <span class="keyword">const</span> function&lt;_Res(_Args...)&gt;&amp; __f)
<a name="l02234"></a>02234     { <span class="keywordflow">return</span> !<span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span><span class="keyword">&gt;</span>(__f); }
<a name="l02235"></a>02235 <span class="comment"></span>
<a name="l02236"></a>02236 <span class="comment">  /**</span>
<a name="l02237"></a>02237 <span class="comment">   *  @brief Compares a polymorphic function object wrapper against 0</span>
<a name="l02238"></a>02238 <span class="comment">   *  (the NULL pointer).</span>
<a name="l02239"></a>02239 <span class="comment">   *  @returns @c false if the wrapper has no target, @c true otherwise</span>
<a name="l02240"></a>02240 <span class="comment">   *</span>
<a name="l02241"></a>02241 <span class="comment">   *  This function will not throw an %exception.</span>
<a name="l02242"></a>02242 <span class="comment">   */</span>
<a name="l02243"></a>02243   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args&gt;
<a name="l02244"></a>02244     <span class="keyword">inline</span> <span class="keywordtype">bool</span>
<a name="l02245"></a><a class="code" href="a01137.html#a0a9eee7662358f68ab5a25adeede00a7">02245</a>     operator!=(<span class="keyword">const</span> function&lt;_Res(_Args...)&gt;&amp; __f, nullptr_t)
<a name="l02246"></a>02246     { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span><span class="keyword">&gt;</span>(__f); }
<a name="l02247"></a>02247 <span class="comment"></span>
<a name="l02248"></a>02248 <span class="comment">  /// @overload</span>
<a name="l02249"></a>02249 <span class="comment"></span>  <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args&gt;
<a name="l02250"></a>02250     <span class="keyword">inline</span> <span class="keywordtype">bool</span>
<a name="l02251"></a><a class="code" href="a01137.html#af45f7524b09a9fea67e5ead1c47991e0">02251</a>     operator!=(nullptr_t, <span class="keyword">const</span> function&lt;_Res(_Args...)&gt;&amp; __f)
<a name="l02252"></a>02252     { <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span><span class="keywordtype">bool</span><span class="keyword">&gt;</span>(__f); }
<a name="l02253"></a>02253 
<a name="l02254"></a>02254   <span class="comment">// [20.7.15.2.7] specialized algorithms</span>
<a name="l02255"></a>02255 <span class="comment"></span>
<a name="l02256"></a>02256 <span class="comment">  /**</span>
<a name="l02257"></a>02257 <span class="comment">   *  @brief Swap the targets of two polymorphic function object wrappers.</span>
<a name="l02258"></a>02258 <span class="comment">   *</span>
<a name="l02259"></a>02259 <span class="comment">   *  This function will not throw an %exception.</span>
<a name="l02260"></a>02260 <span class="comment">   */</span>
<a name="l02261"></a>02261   <span class="keyword">template</span>&lt;<span class="keyword">typename</span> _Res, <span class="keyword">typename</span>... _Args&gt;
<a name="l02262"></a>02262     <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l02263"></a><a class="code" href="a01137.html#aa405c230de976111d4f99f7cd8b3b01f">02263</a>     swap(function&lt;_Res(_Args...)&gt;&amp; __x, function&lt;_Res(_Args...)&gt;&amp; __y)
<a name="l02264"></a>02264     { __x.swap(__y); }
<a name="l02265"></a>02265 
<a name="l02266"></a>02266 _GLIBCXX_END_NAMESPACE_VERSION
<a name="l02267"></a>02267 } <span class="comment">// namespace std</span>
<a name="l02268"></a>02268 
<a name="l02269"></a>02269 <span class="preprocessor">#endif // __GXX_EXPERIMENTAL_CXX0X__</span>
<a name="l02270"></a>02270 <span class="preprocessor"></span>
<a name="l02271"></a>02271 <span class="preprocessor">#endif // _GLIBCXX_FUNCTIONAL</span>
</pre></div></div>
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="a00884.html">functional</a>      </li>
      <li class="footer">Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </li>
    </ul>
  </div>

</body>
</html>