Welcome to mirror list, hosted at ThFree Co, Russian Federation.

FilePtr.h « moses - github.com/moses-smt/mosesdecoder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b9c835e5945ef53dd6fd4db546471e28281b63ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// $Id$

/* ---------------------------------------------------------------- */
/* Copyright 2005 (c) by RWTH Aachen - Lehrstuhl fuer Informatik VI */
/* Richard Zens                                                     */
/* ---------------------------------------------------------------- */

#ifndef moses_FilePtr_h
#define moses_FilePtr_h

#include "File.h"

namespace Moses
{

/** smart pointer for on-demand loading from file
 *  requirement: T has a constructor T(FILE*)
 */
template<typename T> class FilePtr
{
public:
  typedef T* Ptr;
private:
  FILE* f;
  OFF_T pos;
  mutable Ptr t;
public:
  FilePtr(FILE* f_=0,OFF_T p=0) : f(f_),pos(p),t(0) {}
  ~FilePtr() {}

  void set(FILE* f_,OFF_T p) {
    f=f_;
    pos=p;
  }
  void free() {
    delete t;
    t=0;
  }

  T& operator* () {
    load();
    return *t;
  }
  Ptr operator->() {
    load();
    return t;
  }
  operator Ptr () {
    load();
    return t;
  }

  const T& operator* () const {
    load();
    return *t;
  }
  Ptr operator->() const {
    load();
    return t;
  }
  operator Ptr  () const {
    load();
    return t;
  }

  // direct access to pointer, use with care!
  Ptr getPtr() {
    return t;
  }
  Ptr getPtr() const {
    return t;
  }

  operator bool() const {
    return (f && pos!=InvalidOffT);
  }

  void load() const {
    if(t) return;
    if(f && pos!=InvalidOffT) {
      fSeek(f,pos);
      t=new T(f);
    }
  }
};

}

#endif