Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | Related Pages | Search for

# eoDetSelect.h

    00001
    00025 //-----------------------------------------------------------------------------
    00026
    00027 #ifndef _eoDetSelect_h
    00028 #define _eoDetSelect_h
    00029
    00030
    00031 //-----------------------------------------------------------------------------
    00032 #include <eoSelect.h>
    00033 #include <utils/eoHowMany.h>
    00034 #include <math.h>
    00035 //-----------------------------------------------------------------------------
    00036
    00039 template<class EOT>
    00040 class eoDetSelect : public eoSelect<EOT>
    00041 {
    00042  public:
    00044      eoDetSelect(double _rate = 1.0, bool _interpret_as_rate = true)
    00045          : howMany(_rate, _interpret_as_rate)  {}
    00046
    00053   virtual void operator()(const eoPop<EOT>& _source, eoPop<EOT>& _dest)
    00054   {
    00055     unsigned int pSize = _source.size();
    00056     size_t target = howMany(pSize);
    00057
    00058     _dest.resize(target);
    00059
    00060     unsigned remain = target % pSize;
    00061     unsigned entireCopy = target / pSize;
    00062     typename eoPop<EOT>::iterator it = _dest.begin();
    00063
    00064     if (target >= pSize)
    00065       {
    00066         for (unsigned i=0; i<entireCopy; i++)
    00067           {
    00068               std::copy(_source.begin(), _source.end(), it);
    00069             it += pSize;
    00070           }
    00071       }
    00072     // the last ones
    00073     if (remain)
    00074       {
    00075           std::copy(_source.begin(), _source.begin()+remain, it);
    00076       }
    00077   }
    00078
    00079 private :
    00080   eoHowMany howMany;
    00081 };
    00082
    00083 #endif