00001 #ifndef ross_state_header
00002 #define ross_state_header
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 #include <map>
00045 #include <vector>
00046 #include "debug.hpp"
00047 #include "infinite_tape.hpp"
00048
00053 template <typename T>
00054 class state
00055 {
00056 public:
00057 enum transition_result{run, halt};
00058
00063 state()
00064 {
00065 #ifdef ross_debug_mode
00066 std::cout<<"["<<this<<"]state constructed"<<std::endl;
00067 #endif
00068 }
00069
00074 ~state()
00075 {
00076 #ifdef ross_debug_mode
00077 std::cout<<"["<<this<<"]state destructed"<<std::endl;
00078 #endif
00079 }
00080
00081
00082
00093 void create_transition(T read, T write, typename std::vector<state<T> >::size_type next_state, typename infinite_tape<T>::direction move)
00094 {
00095 #ifdef kyle_debug_mode
00096 if(transition_map.find(transition_struct(write, next_state, move))!=transition_map.end())
00097 {
00098 std::cout<<"["<<this<<"]state::create-transition WARNING: transition has been replaced"<<std::endl;
00099 }
00100 #endif
00101 transition_map[read]=transition_struct(write, next_state, move);
00102 }
00103
00113 void create_write_transition(T read, T write, typename std::vector<state<T> >::size_type next_state)
00114 {
00115 create_transition(read, write, next_state, infinite_tape<T>::do_nothing);
00116 }
00117
00127 void create_move_transition(T read, typename std::vector<state<T> >::size_type next_state, typename infinite_tape<T>::direction move)
00128 {
00129 create_transition(read, read, next_state, move);
00130 }
00131
00141 transition_result perform_transition(infinite_tape<T> &tape, typename std::vector<state<T> >::size_type &state_index)
00142 {
00143 typename std::map<T, transition_struct>::iterator lookup_result(transition_map.find(tape.read()));
00144 if(lookup_result==transition_map.end())
00145 {
00146 return halt;
00147 }
00148 else
00149 {
00150 tape.write((*lookup_result).second.write);
00151 tape.move((*lookup_result).second.move);
00152 state_index=(*lookup_result).second.next_state;
00153 return run;
00154 }
00155 }
00156
00168 transition_result simulate_transition(T tape_read, T &tape_write, typename infinite_tape<T>::direction &tape_move, typename std::vector<state<T> >::size_type &state_index) const
00169 {
00170
00171 typename std::map<T, transition_struct>::const_iterator lookup_result=transition_map.find(tape_read);
00172 if(lookup_result==transition_map.end())
00173 {
00174 return halt;
00175 }
00176 else
00177 {
00178 tape_write=(*lookup_result).second.write;
00179 tape_move=(*lookup_result).second.move;
00180 state_index=(*lookup_result).second.next_state;
00181 return run;
00182 }
00183 }
00184
00185
00186
00187
00194 void print(std::ostream & out) const
00195 {
00196 if(transition_map.begin()==transition_map.end())
00197 {
00198 out<<" < no transitions defined >"<<std::endl;
00199 }
00200 else
00201 {
00202 for(typename std::map<T, transition_struct>::const_iterator i=transition_map.begin(); i!=transition_map.end(); ++i)
00203 {
00204 out<<" read("<<(*i).first<<") -> ";
00205 (*i).second.print(out);
00206 out<<std::endl;
00207 }
00208 }
00209 }
00210 protected:
00214 struct transition_struct
00215 {
00220 transition_struct()
00221 {}
00222
00230 transition_struct(T new_write, typename std::vector<state<T> >::size_type new_next_state, typename infinite_tape<T>::direction new_move)
00231 :write(new_write), next_state(new_next_state), move(new_move)
00232 {}
00233
00240 void print(std::ostream &out) const
00241 {
00242 out<<"write("<<write<<") move(";
00243 switch(move)
00244 {
00245 case infinite_tape<T>::left:
00246 out<<"left";
00247 break;
00248 case infinite_tape<T>::right:
00249 out<<"right";
00250 break;
00251 case infinite_tape<T>::do_nothing:
00252 out<<"do_nothing";
00253 }
00254 out<<") next_state("<<next_state<<")";
00255 }
00256 T write;
00257 typename std::vector<state<T> >::size_type next_state;
00258 typename infinite_tape<T>::direction move;
00259
00260 };
00264 typename std::map<T, transition_struct> transition_map;
00265 };
00266
00267
00275 template <typename T>
00276 std::ostream& operator<<(std::ostream &out, const state<T> &to_print)
00277 {
00278 to_print.print(out);
00279 return out;
00280 }
00281
00282 #endif
00283
00284