BWAPI
Skynet/Skynet/UnitFilter.cpp
Go to the documentation of this file.
00001 #include "UnitFilter.h"
00002 
00003 #include "UnitHelper.h"
00004 
00005 UnitFilter::UnitFilter()
00006         : mType(UnitFilterType::None)
00007         , mOperatorType(OperatorType::None)
00008         , mLFilter()
00009         , mRFilter()
00010         , mExpectedValue(true)
00011         , mUnitType(BWAPI::UnitTypes::None)
00012         , mUnitFlags(UnitFilterFlags::None)
00013 {
00014 }
00015 
00016 UnitFilter::UnitFilter(BWAPI::UnitType type)
00017         : mType(UnitFilterType::UnitOfType)
00018         , mOperatorType(OperatorType::None)
00019         , mLFilter()
00020         , mRFilter()
00021         , mExpectedValue(true)
00022         , mUnitType(type)
00023         , mUnitFlags(UnitFilterFlags::None)
00024 {
00025 }
00026 
00027 UnitFilter::UnitFilter(UnitFilterFlags::type flags)
00028         : mType(UnitFilterType::PassesFlags)
00029         , mOperatorType(OperatorType::None)
00030         , mLFilter()
00031         , mRFilter()
00032         , mExpectedValue(true)
00033         , mUnitType(BWAPI::UnitTypes::None)
00034         , mUnitFlags(flags)
00035 {
00036 }
00037 
00038 UnitFilter &UnitFilter::operator!()
00039 {
00040         mExpectedValue = !mExpectedValue;
00041         return *this;
00042 }
00043 
00044 bool UnitFilter::operator!=(const UnitFilter& other) const
00045 {
00046         return !operator==(other);
00047 }
00048 
00049 bool UnitFilter::operator==(const UnitFilter& other) const
00050 {
00051         if(mType != other.mType)
00052                 return false;
00053         else if(mOperatorType != other.mOperatorType)
00054                 return false;
00055         else if(*mLFilter != *other.mLFilter)
00056                 return false;
00057         else if(*mRFilter != *other.mRFilter)
00058                 return false;
00059         else if(mExpectedValue != other.mExpectedValue)
00060                 return false;
00061         else if(mUnitType != other.mUnitType)
00062                 return false;
00063         else if(mUnitFlags != other.mUnitFlags)
00064                 return false;
00065         else
00066                 return true;
00067 }
00068 
00069 bool UnitFilter::operator<(const UnitFilter& other) const
00070 {
00071         if(mType < other.mType)
00072                 return true;
00073         else if(mType != other.mType)
00074                 return false;
00075 
00076         if(mOperatorType < other.mOperatorType)
00077                 return true;
00078         else if(mOperatorType != other.mOperatorType)
00079                 return false;
00080 
00081         if(*mLFilter < *other.mLFilter)
00082                 return true;
00083         else if(*mLFilter != *other.mLFilter)
00084                 return false;
00085 
00086         if(*mRFilter < *other.mRFilter)
00087                 return true;
00088         else if(*mRFilter != *other.mRFilter)
00089                 return false;
00090 
00091         if(mExpectedValue < other.mExpectedValue)
00092                 return true;
00093         else if(mExpectedValue != other.mExpectedValue)
00094                 return false;
00095 
00096         if(mUnitType < other.mUnitType)
00097                 return true;
00098         else if(mUnitType != other.mUnitType)
00099                 return false;
00100 
00101         if(mUnitFlags < other.mUnitFlags)
00102                 return true;
00103         else if(mUnitFlags != other.mUnitFlags)
00104                 return false;
00105 
00106         return false;
00107 }
00108 
00109 bool UnitFilter::filter(const Unit &unit) const
00110 {
00111         switch(mType.underlying())
00112         {
00113         case UnitFilterType::None:
00114                 return mExpectedValue;
00115         case UnitFilterType::UnitOfType:
00116                 return (unit->getType() == mUnitType) == mExpectedValue;
00117         case UnitFilterType::PassesFlags:
00118                 {
00119                         if((mUnitFlags & UnitFilterFlags::IsComplete) != 0 && unit->isCompleted() != mExpectedValue)
00120                                 return false;
00121                         if((mUnitFlags & UnitFilterFlags::HasAddon) != 0 && unit->hasAddon() != mExpectedValue)
00122                                 return false;
00123                         if((mUnitFlags & UnitFilterFlags::IsLifted) != 0 && unit->isLifted() != mExpectedValue)
00124                                 return false;
00125                         if((mUnitFlags & UnitFilterFlags::IsWorker) != 0 && unit->getType().isWorker() != mExpectedValue)
00126                                 return false;
00127                         if((mUnitFlags & UnitFilterFlags::IsArmyUnit) != 0 && UnitHelper::isArmyUnit(unit->getType()) != mExpectedValue)
00128                                 return false;
00129                         if((mUnitFlags & UnitFilterFlags::CanAttackGround) != 0 && unit->canAttackGround() != mExpectedValue)
00130                                 return false;
00131                         if((mUnitFlags & UnitFilterFlags::CanAttackAir) != 0 && unit->canAttackAir() != mExpectedValue)
00132                                 return false;
00133                         if((mUnitFlags & UnitFilterFlags::IsSpellCaster) != 0 && unit->getType().isSpellcaster() != mExpectedValue)
00134                                 return false;
00135 
00136                         return true;
00137                 }
00138         }
00139 
00140         return false;
00141 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines