BWAPI
|
00001 #pragma once 00002 #include "StaticLocationBase.h" 00003 #include "PrimitiveLocationBase.h" 00004 00005 class CompositeLocation; 00006 class StaticLocation; 00007 00008 class CompositeLocationBase : public virtual StaticLocationBase 00009 { 00010 protected: 00011 friend class StaticLocation; 00012 00013 template <class UnitType> 00014 class UnitWrapper 00015 { 00016 public: 00017 UnitWrapper(UnitType* unit) 00018 : m_unit(unit) 00019 {} 00020 UnitType* getUnit() { return m_unit; } 00021 const UnitType* getUnit() const { return m_unit; } 00022 protected: 00023 friend class CompositeLocation; 00024 UnitType* const m_unit; 00025 typename stdext::hash_multimap<BWAPI::UnitType, UnitWrapper>::const_iterator m_posInContainer; 00026 }; 00027 template <class UnitType> 00028 struct extract_unit : std::unary_function<UnitWrapper<UnitType>, UnitType*> 00029 { 00030 UnitType* operator()(UnitWrapper<UnitType>& unitWrapper) const 00031 { 00032 return unitWrapper.getUnit(); 00033 } 00034 }; 00035 template <class UnitType> 00036 struct extract_unit_const : std::unary_function<UnitWrapper<UnitType>, const UnitType*> 00037 { 00038 extract_unit_const() {} 00039 extract_unit_const(const extract_unit<UnitType>&) {} 00040 00041 const UnitType* operator()(const UnitWrapper<UnitType>& unitWrapper) const 00042 { 00043 return unitWrapper.getUnit(); 00044 } 00045 }; 00046 00047 typedef boost::transform_iterator<composite_functor<extract_unit_const<OwnUnit>, extract_pair_second_const<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<OwnUnit>>::const_iterator::value_type>>, 00048 stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<OwnUnit>>::const_iterator> 00049 own_unit_const_iterator; 00050 typedef own_unit_const_iterator 00051 own_unit_type_const_iterator; 00052 typedef boost::filter_iterator<IsBuilding<OwnUnit>, own_unit_const_iterator> 00053 own_building_const_iterator; 00054 00055 typedef boost::transform_iterator<composite_functor<extract_unit<EnemyUnit>, extract_pair_second<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::iterator::value_type>>, 00056 stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::iterator> 00057 enemy_unit_iterator; 00058 typedef enemy_unit_iterator 00059 enemy_unit_type_iterator; 00060 typedef boost::filter_iterator<IsBuilding<EnemyUnit>, enemy_unit_iterator> 00061 enemy_building_iterator; 00062 typedef boost::transform_iterator<composite_functor<extract_unit_const<EnemyUnit>, extract_pair_second_const<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::const_iterator::value_type>>, 00063 stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<EnemyUnit>>::const_iterator> 00064 enemy_unit_const_iterator; 00065 typedef enemy_unit_const_iterator 00066 enemy_unit_type_const_iterator; 00067 typedef boost::filter_iterator<IsBuilding<EnemyUnit>, enemy_unit_const_iterator> 00068 enemy_building_const_iterator; 00069 00070 typedef boost::transform_iterator<composite_functor<extract_unit<NeutralUnit>, extract_pair_second<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::iterator::value_type>>, 00071 stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::iterator> 00072 neutral_unit_iterator; 00073 typedef neutral_unit_iterator 00074 neutral_unit_type_iterator; 00075 typedef boost::filter_iterator<IsBuilding<NeutralUnit>, neutral_unit_iterator> 00076 neutral_building_iterator; 00077 typedef boost::transform_iterator<composite_functor<extract_unit_const<NeutralUnit>, extract_pair_second_const<stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::const_iterator::value_type>>, 00078 stdext::hash_multimap<BWAPI::UnitType, UnitWrapper<NeutralUnit>>::const_iterator> 00079 neutral_unit_const_iterator; 00080 typedef neutral_unit_const_iterator 00081 neutral_unit_type_const_iterator; 00082 typedef boost::filter_iterator<IsBuilding<NeutralUnit>, neutral_unit_const_iterator> 00083 neutral_building_const_iterator; 00084 };