00001
00002
00003
00004
00005
00006
00007
00008 #ifndef moses_FilePtr_h
00009 #define moses_FilePtr_h
00010
00011 #include "File.h"
00012
00013 namespace Moses
00014 {
00015
00016
00017
00018
00019 template<typename T> class FilePtr
00020 {
00021 public:
00022 typedef T* Ptr;
00023 private:
00024 FILE* f;
00025 OFF_T pos;
00026 mutable Ptr t;
00027 public:
00028 FilePtr(FILE* f_=0,OFF_T p=0) : f(f_),pos(p),t(0) {}
00029 ~FilePtr() {}
00030
00031 void set(FILE* f_,OFF_T p) {
00032 f=f_;
00033 pos=p;
00034 }
00035 void free() {
00036 delete t;
00037 t=0;
00038 }
00039
00040 T& operator* () {
00041 load();
00042 return *t;
00043 }
00044 Ptr operator->() {
00045 load();
00046 return t;
00047 }
00048 operator Ptr () {
00049 load();
00050 return t;
00051 }
00052
00053 const T& operator* () const {
00054 load();
00055 return *t;
00056 }
00057 Ptr operator->() const {
00058 load();
00059 return t;
00060 }
00061 operator Ptr () const {
00062 load();
00063 return t;
00064 }
00065
00066
00067 Ptr getPtr() {
00068 return t;
00069 }
00070 Ptr getPtr() const {
00071 return t;
00072 }
00073
00074 operator bool() const {
00075 return (f && pos!=InvalidOffT);
00076 }
00077
00078 void load() const {
00079 if(t) return;
00080 if(f && pos!=InvalidOffT) {
00081 fSeek(f,pos);
00082 t=new T(f);
00083 }
00084 }
00085 };
00086
00087 }
00088
00089 #endif