TGridClientFutureVariantMap GridClientDataProjectionImpl::getAllAsync(const TGridClientVariantSet& keys) {
    if (invalidated) return TGridClientFutureVariantMap(
            new GridFailFutureImpl<TGridClientVariantMap, GridClientClosedException>());

    GridFutureImpl<TGridClientVariantMap>* fut = new GridFutureImpl<TGridClientVariantMap>(threadPool);
    TGridClientFutureVariantMap res(fut);

    boost::packaged_task<TGridClientVariantMap> pt(boost::bind(&GridClientDataProjectionImpl::getAll, this, keys));

    fut->task(pt);

    return res;
}
TGridClientFutureVariant GridClientDataProjectionImpl::getAsync(const GridClientVariant& key) {
    if (invalidated) return TGridClientFutureVariant(
            new GridFailFutureImpl<GridClientVariant, GridClientClosedException>());

    GridFutureImpl<GridClientVariant>* fut = new GridFutureImpl<GridClientVariant>(threadPool);
    TGridClientFutureVariant res(fut);

    boost::packaged_task<GridClientVariant> pt(boost::bind(&GridClientDataProjectionImpl::get, this, key));

    fut->task(pt);

    return res;
}
TGridClientFutureDataMetrics GridClientDataProjectionImpl::metricsAsync() {
    if (invalidated) return TGridClientFutureDataMetrics(
            new GridFailFutureImpl<GridClientDataMetrics, GridClientClosedException>());

    GridFutureImpl<GridClientDataMetrics>* fut = new GridFutureImpl<GridClientDataMetrics>(threadPool);
    TGridClientFutureDataMetrics res(fut);

    boost::packaged_task<GridClientDataMetrics> pt(
            boost::bind(
                    static_cast<GridClientDataMetrics (GridClientDataProjectionImpl::*)(
                            void)> (&GridClientDataProjectionImpl::metrics), this));

    fut->task(pt);

    return res;
}
/**
 * Asynchronously gets contents of custom log file.
 *
 * @param path Log file path. Can be absolute or relative to GRIDGAIN_HOME.
 * @param lineFrom Index of line from which log is get, inclusive (starting from 0).
 * @param lineTo Index of line to which log is get, inclusive (starting from 0).
 * @return Future.
 */
TGridFutureStringList GridClientComputeProjectionImpl::logAsync(const string& path, int lineFrom, int lineTo) {
    if (invalidated)
        return TGridFutureStringList(
            new GridFailFutureImpl<vector<string>, GridClientClosedException>());

    GridFutureImpl<vector<string> >* fut = new GridFutureImpl<vector<string> >(threadPool);
    TGridFutureStringList res(fut);

    boost::packaged_task<vector<string> > pt(
            boost::bind(static_cast<vector<string> (GridClientComputeProjectionImpl::*)(const string&, int, int)>
            (&GridClientComputeProjectionImpl::log), this, path, lineFrom, lineTo));

    fut->task(pt);

    return res;
}
/**
 * Asynchronously executes task.
 *
 * @param taskName Task name or task class name.
 * @param taskArg Optional task argument.
 * @return Future.
 */
TGridClientFutureVariant GridClientComputeProjectionImpl::executeAsync(const string& taskName,
        const GridClientVariant& taskArg) {
    if (invalidated)
        return TGridClientFutureVariant(
            new GridFailFutureImpl<GridClientVariant, GridClientClosedException>());

    GridFutureImpl<GridClientVariant>* fut = new GridFutureImpl<GridClientVariant>(threadPool);
    TGridClientFutureVariant res(fut);

    boost::packaged_task<GridClientVariant> pt(
            boost::bind(&GridClientComputeProjectionImpl::execute, this, taskName, taskArg));

    fut->task(pt);

    return res;
}
/**
 * Asynchronously gets current topology.
 *
 * @param includeAttrs Whether to include node attributes.
 * @param includeMetrics Whether to include node metrics.
 * @return Future.
 */
TGridClientNodeFutureList GridClientComputeProjectionImpl::refreshTopologyAsync(bool includeAttrs,
        bool includeMetrics) {
    if (invalidated)
        return TGridClientNodeFutureList(
            new GridFailFutureImpl<TGridClientNodeList, GridClientClosedException>());

    GridFutureImpl<TGridClientNodeList>* fut = new GridFutureImpl<TGridClientNodeList>(threadPool);
    TGridClientNodeFutureList res(fut);

    boost::packaged_task<TGridClientNodeList> pt(
            boost::bind(static_cast<TGridClientNodeList (GridClientComputeProjectionImpl::*)(bool, bool)>
            (&GridClientComputeProjectionImpl::refreshTopology), this, includeAttrs, includeMetrics));

    fut->task(pt);

    return res;
}
/**
 * Asynchronously gets node by IP address.
 *
 * @param ip IP address.
 * @param includeAttrs Whether to include node attributes.
 * @param includeMetrics Whether to include node metrics.
 * @return Future.
 */
TGridClientNodeFuturePtr GridClientComputeProjectionImpl::refreshNodeAsync(const string& ip, bool includeAttrs,
        bool includeMetrics) {
    if (invalidated)
        return TGridClientNodeFuturePtr(
            new GridFailFutureImpl<TGridClientNodePtr, GridClientClosedException>());

    GridFutureImpl<TGridClientNodePtr>* fut = new GridFutureImpl<TGridClientNodePtr>(threadPool);
    TGridClientNodeFuturePtr res(fut);

    boost::packaged_task<TGridClientNodePtr> pt(
            boost::bind(static_cast<TGridClientNodePtr (GridClientComputeProjectionImpl::*)(const string&, bool, bool)>
            (&GridClientComputeProjectionImpl::refreshNode), this, ip, includeAttrs, includeMetrics));

    fut->task(pt);

    return res;
}