Author: tschmitz
Date: Tue Aug 2 12:17:48 2011
New Revision: 50563
URL: http://svn.gna.org/viewcvs/wesnoth?rev=50563&view=rev
Log:
Reimplemented a lot of iteration code using the new visitor_base template.
Removed visitor.cpp because all the code is in visitor.hpp now.
Removed:
trunk/src/whiteboard/visitor.cpp
Modified:
trunk/projectfiles/VC9/wesnoth.vcproj
trunk/src/CMakeLists.txt
trunk/src/SConscript
trunk/src/whiteboard/highlight_visitor.cpp
trunk/src/whiteboard/highlight_visitor.hpp
trunk/src/whiteboard/manager.cpp
trunk/src/whiteboard/mapbuilder_visitor.cpp
trunk/src/whiteboard/mapbuilder_visitor.hpp
trunk/src/whiteboard/validate_visitor.cpp
trunk/src/whiteboard/validate_visitor.hpp
trunk/src/whiteboard/visitor.hpp
Modified: trunk/projectfiles/VC9/wesnoth.vcproj
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/projectfiles/VC9/wesnoth.vcproj?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/projectfiles/VC9/wesnoth.vcproj (original)
+++ trunk/projectfiles/VC9/wesnoth.vcproj Tue Aug 2 12:17:48 2011
@@ -7009,34 +7009,6 @@
>
</File>
<File
- RelativePath="..\..\src\whiteboard\visitor.cpp"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
-
ObjectFile="$(IntDir)\Whiteboard\"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
-
ObjectFile="$(IntDir)\Whiteboard\"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug (fast)|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
-
ObjectFile="$(IntDir)\Whiteboard\"
- />
- </FileConfiguration>
- </File>
- <File
RelativePath="..\..\src\whiteboard\visitor.hpp"
>
</File>
Modified: trunk/src/CMakeLists.txt
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/CMakeLists.txt?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/CMakeLists.txt (original)
+++ trunk/src/CMakeLists.txt Tue Aug 2 12:17:48 2011
@@ -577,7 +577,6 @@
whiteboard/suppose_dead.cpp
whiteboard/utility.cpp
whiteboard/validate_visitor.cpp
- whiteboard/visitor.cpp
widgets/combo.cpp
widgets/combo_drag.cpp
widgets/drop_target.cpp
Modified: trunk/src/SConscript
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/SConscript?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/SConscript (original)
+++ trunk/src/SConscript Tue Aug 2 12:17:48 2011
@@ -437,7 +437,6 @@
whiteboard/suppose_dead.cpp
whiteboard/utility.cpp
whiteboard/validate_visitor.cpp
- whiteboard/visitor.cpp
widgets/combo.cpp
widgets/combo_drag.cpp
widgets/drop_target.cpp
Modified: trunk/src/whiteboard/highlight_visitor.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/highlight_visitor.cpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/highlight_visitor.cpp (original)
+++ trunk/src/whiteboard/highlight_visitor.cpp Tue Aug 2 12:17:48 2011
@@ -378,25 +378,20 @@
// viewing side assignments after victory
//assert(side_actions_->team_index() ==
resources::screen->viewing_team());
- //Iterate backwards over all actions from all teams until the main
highlight is found
- size_t current_team = resources::controller->current_side() - 1;
- size_t num_teams = resources::teams->size();
- for(size_t iteration = 0; iteration < num_teams; ++iteration)
- {
- size_t team_index = (current_team+num_teams-1-iteration) %
num_teams;
- side_actions& sa =
*resources::teams->at(team_index).get_side_actions();
- side_actions::reverse_iterator rend = sa.rend();
- side_actions::reverse_iterator action = sa.rbegin();
- for (; action != rend; ++action )
- {
- (*action)->accept(*this);
- if (action_ptr main = main_highlight_.lock())
- {
- owner_unit_ = main->get_unit();
- return;
- }
- }
- }
+ //Find the main highlight -- see visit(), below.
+ visitor_base<highlight_visitor>::reverse_visit_all();
+}
+
+//Used only by find_main_highlight()
+bool highlight_visitor::visit(size_t, team&, side_actions&,
side_actions::iterator itor)
+{
+ (*itor)->accept(*this);
+ if (action_ptr main = main_highlight_.lock())
+ {
+ owner_unit_ = main->get_unit();
+ return false;
+ }
+ return true;
}
void highlight_visitor::find_secondary_highlights()
@@ -404,7 +399,7 @@
assert(owner_unit_);
assert(secondary_highlights_.empty());
mode_ = FIND_SECONDARY_HIGHLIGHTS;
- visit_all_actions();
+ visitor::visit_all(); //< Standard visitation procedure.
}
} // end namespace wb
Modified: trunk/src/whiteboard/highlight_visitor.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/highlight_visitor.hpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/highlight_visitor.hpp (original)
+++ trunk/src/whiteboard/highlight_visitor.hpp Tue Aug 2 12:17:48 2011
@@ -37,8 +37,12 @@
* Visitor that handles highlighting planned actions as you hover over them,
* and determine the right target for contextual execution.
*/
-class highlight_visitor: public wb::visitor
+class highlight_visitor
+ : private visitor
+ , private visitor_base<highlight_visitor>
{
+ friend class visitor_base<highlight_visitor>;
+
public:
highlight_visitor(const unit_map& unit_map, side_actions_ptr
side_actions);
virtual ~highlight_visitor();
@@ -66,6 +70,11 @@
virtual void visit_recruit(recruit_ptr recruit);
virtual void visit_recall(recall_ptr recall);
virtual void visit_suppose_dead(suppose_dead_ptr sup_d);
+
+ //"Inherited" from visitor_base
+ bool visit(size_t team_index, team&, side_actions&,
side_actions::iterator);
+ using visitor::pre_visit_team;
+ using visitor::post_visit_team;
void unhighlight();
Modified: trunk/src/whiteboard/manager.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/manager.cpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/manager.cpp (original)
+++ trunk/src/whiteboard/manager.cpp Tue Aug 2 12:17:48 2011
@@ -343,6 +343,35 @@
}
}
+namespace
+{
+ //Only used by manager::draw_hex()
+ struct draw_visitor
+ : private visitor_base<draw_visitor>
+ {
+ friend class visitor_base<draw_visitor>;
+
+ public:
+ draw_visitor(map_location const& hex, side_actions::numbers_t&
numbers)
+ : hex_(hex)
+ , numbers_(numbers)
+ {}
+
+ void operator()() {visit_all();}
+
+ private:
+ //"Inherited" from visitor_base
+ bool visit(size_t team_index, team&, side_actions&,
side_actions::iterator itor)
+ { (*itor)->draw_hex(hex_); return true; }
+ //using default pre_visit_team()
+ bool post_visit_team(size_t team_index, team&, side_actions& sa)
+ { sa.get_numbers(hex_,numbers_); return true; }
+
+ map_location const& hex_;
+ side_actions::numbers_t& numbers_;
+ };
+}
+
void manager::draw_hex(const map_location& hex)
{
if (!wait_for_side_init_)
@@ -350,17 +379,7 @@
//Info about the action numbers to be displayed on screen.
side_actions::numbers_t numbers;
- //Draw graphics from every team's actions, beginning with the
current_team.
- size_t current_team = resources::controller->current_side() - 1;
- size_t num_teams = resources::teams->size();
- for(size_t iteration = 0; iteration < num_teams; ++iteration)
- {
- size_t team_index = (current_team+iteration) %
num_teams;
- side_actions& sa =
*resources::teams->at(team_index).get_side_actions();
- foreach(action_ptr act, sa)
- act->draw_hex(hex);
- sa.get_numbers(hex,numbers);
- }
+ draw_visitor(hex,numbers)();
draw_numbers(hex,numbers); //< helper fcn
}
Modified: trunk/src/whiteboard/mapbuilder_visitor.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/mapbuilder_visitor.cpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/mapbuilder_visitor.cpp (original)
+++ trunk/src/whiteboard/mapbuilder_visitor.cpp Tue Aug 2 12:17:48 2011
@@ -63,31 +63,18 @@
void mapbuilder_visitor::build_map()
{
- mode_ = BUILD_PLANNED_MAP;
-
- size_t current_team = resources::controller->current_side() - 1;
-
//Temporarily reset all units' moves to full EXCEPT for the ones on
current_team.
reset_moves();
- //Apply modifiers from every team's action_queue, ...
- size_t viewing_team = viewer_team();
- size_t num_teams = resources::teams->size();
- for(size_t iteration = 0; iteration < num_teams; ++iteration)
- {
- //... beginning with the current_team, ...
- size_t team_index = (current_team+iteration) % num_teams;
+ mode_ = BUILD_PLANNED_MAP;
+ visit_all(); //< Inherited from visitor_base
+}
- foreach(action_ptr act,
*resources::teams->at(team_index).get_side_actions())
- {
- if(act->is_valid())
- act->accept(*this);
- }
-
- //... and ending with the viewer_team.
- if(team_index == viewing_team)
- break;
- }
+bool mapbuilder_visitor::visit(size_t, team&, side_actions&,
side_actions::iterator itor)
+{
+ if((*itor)->is_valid())
+ (*itor)->accept(*this);
+ return true;
}
void mapbuilder_visitor::visit_move(move_ptr move)
Modified: trunk/src/whiteboard/mapbuilder_visitor.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/mapbuilder_visitor.hpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/mapbuilder_visitor.hpp (original)
+++ trunk/src/whiteboard/mapbuilder_visitor.hpp Tue Aug 2 12:17:48 2011
@@ -22,9 +22,9 @@
#include <boost/ptr_container/ptr_vector.hpp>
+#include "action.hpp"
+#include "utility.hpp"
#include "visitor.hpp"
-
-#include "action.hpp"
struct unit_movement_resetter;
@@ -35,8 +35,11 @@
* Visitor that collects and applies unit_map modifications from the actions
it visits
* and reverts all changes on destruction.
*/
-class mapbuilder_visitor: public visitor
+class mapbuilder_visitor
+ : protected visitor
+ , private visitor_base<mapbuilder_visitor>
{
+ friend class visitor_base<mapbuilder_visitor>;
public:
mapbuilder_visitor(unit_map& unit_map);
@@ -56,11 +59,19 @@
virtual void visit_recall(recall_ptr recall);
virtual void visit_suppose_dead(suppose_dead_ptr sup_d);
+ //"Inherited" from visitor_base
+ bool visit(size_t team_index, team&, side_actions&,
side_actions::iterator);
+ using visitor::pre_visit_team;
+ bool post_visit_team(size_t team_index, team&, side_actions&)
+ {return team_index != viewer_team();} //< Stop after visiting
viewer_team
+
//Helper fcn: Temporarily resets all units' moves to max EXCEPT for
//the ones controlled by the player whose turn it is currently.
void reset_moves();
private:
+ void visit_all() {visitor_base<mapbuilder_visitor>::visit_all();}
+
void restore_normal_map();
unit_map& unit_map_;
Modified: trunk/src/whiteboard/validate_visitor.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/validate_visitor.cpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/validate_visitor.cpp (original)
+++ trunk/src/whiteboard/validate_visitor.cpp Tue Aug 2 12:17:48 2011
@@ -56,22 +56,10 @@
//Temporarily reset all units' moves to full EXCEPT for the ones on
viewer_side().
reset_moves(); //< protected fcn inherited from mapbuilder_visitor
- //Apply modifiers from every team's action_queue, beginning with the
current_team.
- size_t current_team = resources::controller->current_side() - 1;
- size_t num_teams = resources::teams->size();
- for(size_t iteration = 0; iteration < num_teams; ++iteration)
- {
- size_t team_index = (current_team+iteration) % num_teams;
-
- side_actions& actions =
*resources::teams->at(team_index).get_side_actions();
- arg_itor_ = actions.begin(); //< Parameter for the visit_***()
fcns
- side_actions::iterator end = actions.end();
- for(; arg_itor_!=end; ++arg_itor_)
- (*arg_itor_)->accept(*this);
- }
+ visit_all();
//FIXME: by reverse iterating this can be done in a more efficiant way
- // by using the iterator returned by remove_action it could even be
done in the loop above
+ // by using the iterator returned by remove_action it could even be
done in visit_all above
if (!actions_to_erase_.empty())
{
int side_actions_size_before = viewer_actions_.actions().size();
Modified: trunk/src/whiteboard/validate_visitor.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/validate_visitor.hpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/validate_visitor.hpp (original)
+++ trunk/src/whiteboard/validate_visitor.hpp Tue Aug 2 12:17:48 2011
@@ -34,8 +34,12 @@
* * actions are evaluated for validity along the way.
* * Some invalid actions are deleted.
*/
-class validate_visitor: private mapbuilder_visitor
+class validate_visitor
+ : private mapbuilder_visitor
+ , private visitor_base<validate_visitor>
{
+ friend class visitor_base<validate_visitor>;
+
public:
explicit validate_visitor(unit_map& unit_map);
virtual ~validate_visitor();
@@ -55,6 +59,13 @@
VALIDITY evaluate_move_validity(move_ptr);
bool no_previous_invalids(side_actions::iterator const&);
+ //"Inherited" from visitor_base
+ bool visit(size_t team_index, team& t, side_actions& sa,
side_actions::iterator itor)
+ { arg_itor_=itor; return
visitor::visit(team_index,t,sa,itor); }
+ using mapbuilder_visitor::pre_visit_team;
+ using visitor_base<validate_visitor>::post_visit_team;
+ using visitor_base<validate_visitor>::visit_all;
+
side_actions& viewer_actions_;
std::set<action_ptr> actions_to_erase_;
Removed: trunk/src/whiteboard/visitor.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/visitor.cpp?rev=50562&view=auto
==============================================================================
--- trunk/src/whiteboard/visitor.cpp (original)
+++ trunk/src/whiteboard/visitor.cpp (removed)
@@ -1,45 +1,0 @@
-/* $Id$ */
-/*
- Copyright (C) 2010 - 2011 by Gabriel Morin <gabrielmorin (at) gmail (dot) com>
- Part of the Battle for Wesnoth Project http://www.wesnoth.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY.
-
- See the COPYING file for more details.
- */
-
-/**
- * @file
- */
-
-#include "visitor.hpp"
-
-#include "action.hpp"
-#include "foreach.hpp"
-#include "side_actions.hpp"
-
-#include "play_controller.hpp"
-#include "resources.hpp"
-#include "team.hpp"
-
-namespace wb
-{
-
-void visitor::visit_all_actions()
-{
- size_t current_team = resources::controller->current_side() - 1;
- size_t num_teams = resources::teams->size();
- for(size_t iteration = 0; iteration < num_teams; ++iteration)
- {
- size_t team_index = (current_team+iteration) % num_teams;
- foreach(action_ptr act,
*resources::teams->at(team_index).get_side_actions())
- act->accept(*this);
- }
-}
-
-}//end namespace wb
Modified: trunk/src/whiteboard/visitor.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/whiteboard/visitor.hpp?rev=50563&r1=50562&r2=50563&view=diff
==============================================================================
--- trunk/src/whiteboard/visitor.hpp (original)
+++ trunk/src/whiteboard/visitor.hpp Tue Aug 2 12:17:48 2011
@@ -42,6 +42,7 @@
* Derived classes should declare visitor_base<Derived> as a friend, or
* else make the overridden functions public.
* I recommend making the inheritance private or protected.
+ * See class visitor for an example.
*/
template<typename Derived>
class visitor_base
@@ -108,19 +109,31 @@
* Abstract base class for all the visitors (cf GoF Visitor Design Pattern)
* the whiteboard uses.
*/
-class visitor : private boost::noncopyable
+class visitor
+ : private boost::noncopyable
+ , private visitor_base<visitor>
{
+ friend class visitor_base<visitor>;
+
friend class move;
friend class attack;
friend class recruit;
friend class recall;
friend class suppose_dead;
+public:
+ using visitor_base<visitor>::visit_all;
+ using visitor_base<visitor>::reverse_visit_all;
+
protected:
visitor() {}
virtual ~visitor() {} //Not intended for polymorphic deletion
- void visit_all_actions(); //< weird utility function for derived classes
+ //"Inherited" from visitor_base
+ bool visit(size_t, team&, side_actions&, side_actions::iterator itor)
+ { (*itor)->accept(*this); return true; }
+ using visitor_base<visitor>::pre_visit_team;
+ using visitor_base<visitor>::post_visit_team;
virtual void visit_move(move_ptr move) = 0;
virtual void visit_attack(attack_ptr attack) = 0;
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits