00001
00002
00003
#ifndef __program_h__
00004
#define __program_h__
00005
00006
00007
00008
#include "common.h"
00009
00010
00011
00013 class program
00014 :
public std::vector<char>
00015 {
00016
public:
00017 program() {}
00018 ~program() {}
00019
00021
00025
void generate(uInt seed);
00026
00028
00034
template <
typename T>
00035 T
read(
address addr)
00036 {
00037
ASSERT(size()>0,
"cannot read from 0 length program");
00038
00039
00040
address size_ = static_cast<address>(size());
00041
00042
00043 addr%=size_;
00044
00045
00046
if(addr+
sizeof(T)<size_)
00047 {
00048
00049
00050
return *reinterpret_cast<T*>( &( (*this)[addr] ) );
00051 }
00052
00053
00054
00055
00056
00057
00058 T data_;
00059
00060
00061
uInt split = size_-addr;
00062
00063
00064
00065 memcpy(&data_, &((*
this)[addr]), split);
00066
00067
00068
00069 memcpy(reinterpret_cast<char*>((&data_))+split, &((*
this)[0]),
sizeof(T)-split);
00070
00071
00072
return data_;
00073 }
00074
00076
00082
template <
typename T>
00083 void write(address addr, T val)
00084 {
00085
ASSERT(size()>0,
"cannot write to 0 length program");
00086
00087
address size_ = static_cast<address>(size());
00088
00089
00090 addr%=size_;
00091
00092
00093
if(addr+
sizeof(T)<size_)
00094 {
00095
00096
00097 *reinterpret_cast<T*>( &( (*this)[addr] ) ) = val;
00098 }
else
00099 {
00100
00101
00102
00103
00104
00105
00106
uInt split = size_-addr;
00107
00108
00109
00110 memcpy(&((*
this)[addr]), &val, split);
00111
00112
00113
00114 memcpy(&((*
this)[0]), reinterpret_cast<char*>((&val))+split,
sizeof(T)-split);
00115 }
00116 }
00117
00118
protected:
00119
private:
00120 };
00121
00122
00123
00124
#endif
00125