00001
00018 #ifndef RPOINTER_H
00019 #define RPOINTER_H
00020 #include<assert.h>
00021 #include"mseg.h"
00022 #include<sys/types.h>
00023
00024 namespace RAMS
00025 {
00026
00032 class RPointer_s
00033 {
00034 protected:
00036 Mseg *seg;
00038 off_t* off;
00040 off_t soff;
00041 public:
00042 RPointer_s() { seg=(Mseg *)NULL;off=(off_t *)NULL; }
00046 RPointer_s(Mseg *s,off_t& o):seg(s),off(&o) {}
00047 RPointer_s(Mseg *s,off_t& o,off_t koff):seg(s),off(&o) { *off=koff; }
00049 RPointer_s(off_t koff,Mseg *s):seg(s),off(&soff),soff(koff) {}
00050 void init(Mseg *s,off_t& o) { seg=s; off=&o; }
00051 void init(off_t koff,Mseg *s) { off=&soff; soff=koff; seg=s; }
00052 off_t offset() const { return *off; }
00053
00057 int ok() { return *off>=0 && *off < off_t(seg->length()); }
00061 size_t operator-(RPointer_s a)
00062 {
00063 assert(a.seg->begin()==seg->begin());
00064 return (*off-*(a.off));
00065 }
00066
00068 void setoff(off_t o) { *off=o; }
00072 RPointer_s& cast(const RPointer_s &anderer)
00073 {
00074 seg=anderer.seg;
00075 *off=*(anderer.off);
00076 return *this;
00077 }
00078
00082 void *operator=(void *p)
00083 {
00084 *off=(char *)p - (char *)(seg->begin());
00085 assert(ok());
00086 return p;
00087 }
00088
00092 bool operator==(const RPointer_s& other) const
00093 {
00094 return (seg->begin()==other.seg->begin() && offset() == other.offset());
00095 }
00096 };
00097
00101 template<class T,int SIZE=sizeof(T)> class RPointer : public RPointer_s
00102 {
00103 public:
00104 RPointer():RPointer_s() {}
00105 RPointer(Mseg *s,off_t& o):RPointer_s(s,o) {}
00106 RPointer(Mseg *s,off_t& o,off_t koff):RPointer_s(s,o,koff) {}
00107 RPointer(off_t o,Mseg *s):RPointer_s(o,s) {}
00108 RPointer(const RPointer_s& a) { cast(a); }
00109 RPointer(Mseg *s,T* ap):RPointer_s((char *)ap - (char *)(s->begin()),s) {}
00110 RPointer(Mseg *s,off_t &o,T* ap)
00111 :RPointer(s,o,(char *)ap - (char *)(s->begin())) {}
00112 T *ptr() { return (T *)((char *)(seg->begin()) + *off); }
00113 T *operator->() { return ptr(); }
00114 T& operator*() { return *ptr(); }
00115 RPointer<T,SIZE>& operator=(RPointer<T,SIZE>& anderer)
00116 {
00117 if(seg == 0)
00118 {
00119 seg=anderer.seg;
00120 off=&soff;
00121 *off=*(anderer.off);
00122 }
00123 else if(seg->begin()==anderer.seg->begin())
00124 {
00125 *off=*(anderer.off);
00126 }
00127 else
00128 {
00129
00130 *off=(char *)(anderer.ptr()) - (char *)(seg->begin());
00131 }
00132 assert(ok());
00133 return *this;
00134 }
00135 T *operator+=(off_t dazu)
00136 { *off+=dazu*SIZE;
00137 assert(ok());
00138 return ptr();
00139 }
00140 T *operator-=(off_t dazu)
00141 { *off-=dazu*SIZE;
00142 assert(*off >= 0);
00143 return ptr();
00144 }
00148 T *operator=(T *p)
00149 {
00150 *off=(char *)p - (char *)(seg->begin());
00151 assert(ok());
00152 return p;
00153 }
00154 };
00155
00156 typedef RPointer<char> RcharPointer;
00157 };
00158
00165 inline long align2(long a,long w)
00166 {
00167 long e= (w & ~(a-1));
00168 if(e == w) return e;
00169 else return e+a;
00170 }
00171 #endif
00172
00173
00174
00175
00176