Sirikata
libcore/include/sirikata/core/transfer/MaxPriorityAggregation.hpp
Go to the documentation of this file.
00001 /*  Sirikata Transfer -- Content Transfer management system
00002  *  MaxPriorityAggregation.hpp
00003  *
00004  *  Copyright (c) 2010, Jeff Terrace
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 /*  Created on: Jan 22th, 2010 */
00033 
00034 #ifndef SIRIKATA_MaxPriorityAggregation_HPP__
00035 #define SIRIKATA_MaxPriorityAggregation_HPP__
00036 
00037 #include "TransferPool.hpp"
00038 
00039 namespace Sirikata {
00040 namespace Transfer {
00041 
00042 /*
00043  * Just take the highest priority. Stupid aggregation.
00044  */
00045 class MaxPriorityAggregation : public PriorityAggregationAlgorithm {
00046 
00047 public:
00048 
00049     virtual Priority aggregate(
00050         const std::vector<Priority>& l) const {
00051         Priority max = (*l.begin());
00052         for (std::vector<Priority>::const_iterator it = ++(l.begin()); it != l.end(); it++) {
00053             if ((*it) > max) max = *it;
00054         }
00055         return max;
00056     }
00057 
00058     //Return an aggregated priority given the list of priorities
00059     virtual Priority aggregate(
00060         const std::map<std::string, TransferRequestPtr > & l) const {
00061 
00062         //don't feel like making compare func for max_element so just manual laziness
00063         std::map<std::string, TransferRequestPtr>::const_iterator findMax = l.begin();
00064         Priority max = findMax->second->getPriority();
00065         findMax++;
00066         while(findMax != l.end()) {
00067             if(findMax->second->getPriority() > max) {
00068                 max = findMax->second->getPriority();
00069             }
00070             findMax++;
00071         }
00072 
00073         return max;
00074     }
00075 
00076     virtual Priority aggregate(
00077         const std::vector<TransferRequestPtr>& l) const {
00078         Priority max = (*l.begin())->getPriority();
00079         for(std::vector<TransferRequestPtr>::const_iterator it = ++(l.begin()); it != l.end(); it++) {
00080             if ((*it)->getPriority() > max) max = (*it)->getPriority();
00081         }
00082         return max;
00083     }
00084 };
00085 
00086 }
00087 }
00088 
00089 #endif