00001 // $Id$ 00002 00003 /* ---------------------------------------------------------------- */ 00004 /* Copyright 2005 (c) by RWTH Aachen - Lehrstuhl fuer Informatik VI */ 00005 /* Richard Zens */ 00006 /* ---------------------------------------------------------------- */ 00007 00008 #ifndef moses_FilePtr_h 00009 #define moses_FilePtr_h 00010 00011 #include "File.h" 00012 00013 namespace Moses 00014 { 00015 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 // direct access to pointer, use with care! 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