00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "hex.h"
00025
00026 #include <cassert>
00027
00028 namespace hex {
00029
00030
00031 Area
00032 Path::to_area(void) const
00033 {
00034 std::set<Hex*> result;
00035 std::copy(_hexes.begin(), _hexes.end(), std::inserter(result,result.end()));
00036 return result;
00037 }
00038
00039
00040 int
00041 Path::length(void) const
00042 {
00043 return int( _hexes.size() );
00044 }
00045
00046
00047 std::string
00048 Path::steps(void) const
00049 {
00050 std::string result ="";
00051 const Hex* curr =NULL;
00052 for(std::list<Hex*>::const_iterator h=_hexes.begin(); h!=_hexes.end(); ++h)
00053 {
00054 if(curr)
00055 result += hex::steps(curr,*h);
00056 curr = *h;
00057 }
00058 return result;
00059 }
00060
00061
00062 std::string
00063 Path::str(void) const
00064 {
00065 assert(!this->_hexes.empty());
00066 std::string result =this->_hexes.front()->str();
00067 result+=":"+this->steps();
00068 return result;
00069 }
00070
00071
00073 inline std::list<Hex*>
00074 path(Hex* start, const std::string& steps)
00075 throw(hex::out_of_range,hex::invalid_argument)
00076 {
00077
00078 std::list<Hex*> hexes;
00079 hexes.push_back(start);
00080 std::string::size_type cur =0;
00081 while(cur<steps.size() && steps[cur]!='?')
00082 {
00083
00084 Direction dir =to_direction( steps[cur] );
00085 ++cur;
00086 bool repeat =(cur<steps.size() && steps[cur]=='*');
00087 do{
00088 Hex* next =hexes.back()->go( dir );
00089 if(next)
00090 hexes.push_back( next );
00091 else if(*steps.rbegin()=='?' || repeat)
00092 return hexes;
00093 else
00094 throw hex::out_of_range(start->str()+":"+steps);
00095 } while(repeat);
00096 }
00097 return hexes;
00098 }
00099
00100
00101 Path::Path(Hex* start, const std::string& steps)
00102 throw(hex::out_of_range,hex::invalid_argument)
00103 : _hexes( path(start,steps) )
00104 {}
00105
00106
00107 Path::Path(Hex* from, const Hex* to) throw()
00108 : _hexes( path(from,hex::steps(from,to)) )
00109 {}
00110
00111
00112 }