Requests StoragesAssigner::PerformAssignment(Requests& requests)
{
    Requests assignedRequests; // the result set

    Requests::iterator it = requests.begin();
    Requests::iterator itEnd = requests.end();

    // generate the assosiative set of nodes
    RequestsStorages requestsStorages;

    // form the vector from the set to have an ability to sort it
    std::vector<Request::Storages * > storages;
    storages.reserve(requests.size());
    for ( ; it != itEnd; ++it )
    {
        requestsStorages[&(*it)->getStorages()] = (*it);
        storages.push_back(&(*it)->getStorages());
    }

    std::sort(storages.begin(), storages.end(), requestStoragesCompare);

    for ( unsigned requestIndex = 0; requestIndex < storages.size(); ++requestIndex )
    {
        Request::Storages * st = storages[requestIndex];
        // generate new assignment for the chosen storage
        Assignment* reqAssignment = new Assignment();
        requestAssignment[requestsStorages[st]] = reqAssignment;

        bool result = assignOneRequest(st, reqAssignment);
        if ( result ) // virtual machine assigned successfully 
            assignedRequests.insert(requestsStorages[st]);
        else
        {
            requestAssignment.erase(requestsStorages[st]);
            delete reqAssignment;
        }
    }

    return assignedRequests;
}