remove unit inheritence, twas a silly idea, and remove usage of shared ptr and unique ptr not needed anymore

This commit is contained in:
Marc Di Luzio 2014-12-16 13:13:01 +00:00
parent 0700a13129
commit 0c7721cb17
8 changed files with 101 additions and 142 deletions

View file

@ -13,7 +13,6 @@ set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11" )
# Add the sources # Add the sources
set( SOURCES set( SOURCES
game.cpp game.cpp
unitv.cpp
unit.cpp unit.cpp
orders.cpp orders.cpp
) )

View file

@ -64,33 +64,32 @@ int CTTRTSGame::SimulateToNextTurn()
} }
// Add a unit, nonzero return value indicates error // Add a unit, nonzero return value indicates error
int CTTRTSGame::AddUnit( std::shared_ptr<CUnit> unit ) int CTTRTSGame::AddUnit( CUnit&& unit )
{ {
// Verify the unit // Verify the unit
const int val = unit->valid(); const int val = unit.valid();
if( val ) if( val )
return val; return val;
// Verify if the unit can be placed on the current board // Verify if the unit can be placed on the current board
const uvector2 pos = unit->getPos(); const uvector2 pos = unit.getPos();
if( (pos.x < dimentions.x) && (pos.y < dimentions.y) ) if( (pos.x < dimentions.x) && (pos.y < dimentions.y) )
return 1; return 1;
m_allUnits.push_back(unit); m_allUnits.push_back(std::move(unit));
return 0; return 0;
} }
// Add a units, nonzero return value indicates error // Add a units, nonzero return value indicates error
int CTTRTSGame::AddUnits( sharedUnitVector_t units ) int CTTRTSGame::AddUnits( CUnitVector&& units )
{ {
sharedUnitVector_t::iterator it; CUnitVector::iterator it;
for ( it = units.begin(); it != units.end(); it++ ) for ( it = units.begin(); it != units.end(); it++ )
{ {
// Attempt the unit add // Attempt the unit add
if ( AddUnit(*it) ) if ( AddUnit( std::move(*it) ) )
return 1; return 1;
} }
@ -106,9 +105,9 @@ int CTTRTSGame::VerifyOrder( player_id_t player, const COrder& order )
// Attempt to find the unit // Attempt to find the unit
bool unitFound = false; bool unitFound = false;
for ( sharedUnitVector_t::const_iterator it = m_allUnits.begin(); it != m_allUnits.end(); it++ ) for ( CUnitVector::const_iterator it = m_allUnits.begin(); it != m_allUnits.end(); it++ )
{ {
if ( (*it)->getID() == unitID ) if ( (*it).getID() == unitID )
{ {
unitFound = true; unitFound = true;
break; break;

View file

@ -7,7 +7,7 @@
#include <memory> // unique_ptr and shared_ptr #include <memory> // unique_ptr and shared_ptr
typedef std::vector< std::shared_ptr<CUnit> > sharedUnitVector_t; typedef std::vector< CUnit > CUnitVector;
class CTTRTSGame class CTTRTSGame
{ {
@ -33,16 +33,16 @@ public:
int SimulateToNextTurn(); int SimulateToNextTurn();
// Add a unit, nonzero return value indicates error // Add a unit, nonzero return value indicates error
int AddUnit( std::shared_ptr<CUnit> unit ); int AddUnit( CUnit&& unit );
// Add a units, nonzero return value indicates error // Add a units, nonzero return value indicates error
int AddUnits( sharedUnitVector_t units ); int AddUnits( CUnitVector&& units );
// Get the number of units // Get the number of units
inline unsigned int GetNumUnits() const { return m_allUnits.size(); } inline unsigned int GetNumUnits() const { return m_allUnits.size(); }
// Get unit by index as above (not unit ID) // Get unit by index as above (not unit ID)
inline const CUnit& GetUnitByIndex( unsigned int i ) const { return *m_allUnits[i]; } inline const CUnit& GetUnitByIndex( unsigned int i ) const { return m_allUnits[i]; }
// Get the number of order // Get the number of order
inline unsigned int GetNumOrders() const { return m_orders.size(); } inline unsigned int GetNumOrders() const { return m_orders.size(); }
@ -68,7 +68,7 @@ private:
int VerifyUnit( const CUnit& unit ); int VerifyUnit( const CUnit& unit );
// Vector to store points to all units // Vector to store points to all units
sharedUnitVector_t m_allUnits; CUnitVector m_allUnits;
// Orders to execute this turn // Orders to execute this turn
COrderVector m_orders; COrderVector m_orders;

View file

@ -1,7 +1,6 @@
#include "unit.h" #include "unit.h"
// Unit types #include <map> // for std::map
#include "unitv.h"
namespace namespace
{ {
@ -11,37 +10,83 @@ namespace
static unit_id_t p = 0; static unit_id_t p = 0;
return p++; return p++;
} }
// Map of visual representation of unit V
typedef std::map< dir_t, unitVis_c > dir_to_vis_map;
// Helper function to get the vis map during static init
const dir_to_vis_map& get_vis_map_V()
{
static const dir_to_vis_map sk_visMap =
{
{dir_t::N,'^'},
{dir_t::E,'>'},
{dir_t::S,'v'},
{dir_t::W,'<'},
};
return sk_visMap;
}
} }
// Plain constructor
CUnit::CUnit() CUnit::CUnit()
: unit_id ( get_unique_unit_id() ) : unit_id ( get_unique_unit_id() )
, team_id ( team_id_invalid ) , team_id ( team_id_invalid )
, player_id ( player_id_invalid ) , player_id ( player_id_invalid )
, unit_vis ( unitVis_invalid ) , unit_vis ( unitVis_invalid )
, dir ( dir_t::S )
{ {
updateMyVisual();
}; };
std::unique_ptr<CUnit> CUnit::getUnitFromVis( unitVis_c vis ) // Move constructor
CUnit::CUnit(CUnit&& unit)
: unit_id ( std::move(unit.unit_id) )
, team_id ( std::move(unit.team_id) )
, player_id ( std::move(unit.player_id) )
, unit_vis ( std::move(unit.unit_vis) )
, dir ( std::move(unit.dir) )
{ {
switch( vis ) updateMyVisual();
}
CUnit&& CUnit::getUnitFromVis( unitVis_c vis )
{
CUnit unit;
unit.setFromVisual(vis);
return std::move(unit);
}
// Update the visual representation of the unit
unitVis_c CUnit::updateMyVisual()
{
// Start at invalid
setVisual(unitVis_invalid);
dir_to_vis_map::const_iterator it = get_vis_map_V().find(dir);
// If found set to new vis
if( it != get_vis_map_V().end() )
setVisual(it->second);
return getVisual();
}
bool CUnit::setFromVisual( const unitVis_c& vis )
{
dir_to_vis_map::const_iterator it;
for( it = get_vis_map_V().begin(); it != get_vis_map_V().end(); it++ )
{ {
// Match with any image for a V if( it->second == vis )
case '^':
case '>':
case 'v':
case '<':
{ {
// Create a V dir == it->first;
std::unique_ptr<CUnit> p = std::unique_ptr<CUnit>(new CUnitV); updateMyVisual();
if( (bool)p && p->setFromVisual(vis) ) return true;
{
return std::move(p);
}
break;
} }
} }
// No unit found, return nullptr // No matching direction to visual
return std::move(std::unique_ptr<CUnit>(nullptr)); return false;
} }

View file

@ -11,8 +11,10 @@
class CUnit class CUnit
{ {
public: public:
virtual ~CUnit() = default;
CUnit();
CUnit(CUnit&& unit);
~CUnit() = default;
inline const unit_id_t& getID() const { return unit_id; } inline const unit_id_t& getID() const { return unit_id; }
inline const team_id_t& getTeam() const { return team_id; } inline const team_id_t& getTeam() const { return team_id; }
@ -31,19 +33,20 @@ public:
inline bool valid() const; inline bool valid() const;
// Set a unit based solely on it's visual // Set a unit based solely on it's visual
// Maybe make non-virtual at some point to avoid vtable lookups bool setFromVisual( const unitVis_c& vis);
virtual bool setFromVisual(unitVis_c& vis) = 0;
// Factory function for creating units from a visual // Factory function for creating units from a visual
static std::unique_ptr<CUnit> getUnitFromVis( unitVis_c vis ); static CUnit&& getUnitFromVis( unitVis_c vis );
protected: protected:
// Protected constructor, cannot be constructed as base type
CUnit();
private: private:
// Update the visual of V
unitVis_c updateMyVisual();
// Unit ID // Unit ID
const unit_id_t unit_id; const unit_id_t unit_id;
@ -56,8 +59,10 @@ private:
// Owner ID // Owner ID
player_id_t player_id; player_id_t player_id;
// Direction
dir_t dir;
// All units must have position // Position
uvector2 pos; uvector2 pos;
}; };

View file

@ -1,63 +0,0 @@
#include "unitv.h"
#include <map> // for std::map
CUnitV::CUnitV()
: dir(dir_t::S)
{
updateMyVisual();
}
// Map of visual representation of unitv
namespace
{
typedef std::map< dir_t, unitVis_c > dir_to_vis_map;
// Helper function to get the vis map during static init
const dir_to_vis_map& get_vis_map()
{
static const dir_to_vis_map sk_visMap =
{
{dir_t::N,'^'},
{dir_t::E,'>'},
{dir_t::S,'v'},
{dir_t::W,'<'},
};
return sk_visMap;
}
}
// Update the visual representation of the unit
unitVis_c CUnitV::updateMyVisual()
{
// Start at invalid
setVisual(unitVis_invalid);
dir_to_vis_map::const_iterator it = get_vis_map().find(dir);
// If found set to new vis
if( it != get_vis_map().end() )
setVisual(it->second);
return getVisual();
}
bool CUnitV::setFromVisual( unitVis_c& vis )
{
dir_to_vis_map::const_iterator it;
for( it = get_vis_map().begin(); it != get_vis_map().end(); it++ )
{
if( it->second == vis )
{
dir == it->first;
updateMyVisual();
return true;
}
}
// No matching direction to visual
return false;
}

View file

@ -1,26 +0,0 @@
#ifndef _UNITV_H_
#define _UNITV_H_
#include "unit.h"
// V unit
class CUnitV
: public CUnit
{
public:
CUnitV();
virtual ~CUnitV() = default;
// Set from a visual
virtual bool setFromVisual( unitVis_c& vis ) override;
private:
// Update the visual of V
unitVis_c updateMyVisual();
// V also has a direction
dir_t dir;
};
#endif //_UNITV_H_

View file

@ -1,6 +1,5 @@
#include <iostream> // std::cout #include <iostream> // std::cout
#include "unitv.h"
#include "board.h" #include "board.h"
#include "orders.h" #include "orders.h"
#include "game.h" #include "game.h"
@ -14,21 +13,22 @@ const char* tests()
} }
{ {
CUnitV myV; CUnit unit;
if( myV.getVisual() != 'v' && myV.getVisual() != '<' && myV.getVisual() != '^' && myV.getVisual() != '>' ) unit.setFromVisual('v');
if( unit.getVisual() != 118 )
return "failed to properly create V unit"; return "failed to properly create V unit";
} }
{ {
CUnitV myV; CUnit unit;
CUnitV myV2; CUnit unit2;
if( myV.getID() == myV2.getID() ) if( unit.getID() == unit2.getID() )
return "Unit IDs the same"; return "Unit IDs the same";
} }
{ {
std::unique_ptr<CUnit> myV = CUnit::getUnitFromVis('v'); CUnit unit = CUnit::getUnitFromVis('v');
if( myV->getVisual() != 'v' ) if( unit.getVisual() != 'v' )
return "failed to properly create V unit"; return "failed to properly create V unit";
} }