Hauptseite   Klassenhierarchie   Übersicht   Auflistung der Dateien   Datenstruktur-Elemente   Datei-Elemente  

rpointer.h

gehe zur Dokumentation dieser Datei
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       { // Initialisierung 
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         // wie anderer Zeiger
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 

Erzeugt am Sat Nov 29 19:45:39 2003 für rams_persito von doxygen1.2.14 geschrieben von Dimitri van Heesch, © 1997-2002