Templates -- Meow  1.1.2
不能,也不應該先編譯成obj-file的templates
ObjArray.h
Go to the documentation of this file.
1 #ifndef oo_ObjArray_H__
2 #define oo_ObjArray_H__
3 
4 #include "ObjBase.h"
5 
6 #include "../Self.h"
7 
8 #include <vector>
9 #include <string>
10 #include <typeinfo>
11 
12 #include <cstdio>
13 #include <cstdlib>
14 
15 namespace meow {
16 
22 template<class T>
23 class ObjArray: public ObjBase {
24 private:
25  struct Myself {
26  std::vector<T> array_;
27  Myself() {
28  }
29  ~Myself() {
30  }
31  Myself& copyFrom(Myself const& b) {
32  array_ = b.array_;
33  return *this;
34  }
35  };
36  Self<Myself> const self;
37 public:
38  ObjArray(): self(true) {
39  }
40 
41  ObjArray(ObjArray const& a): self(false) {
42  self().copyFrom(a.self);
43  }
44 
45  ObjArray(std::vector<T> const& a): self(true) {
46  self()->array_ = a;
47  }
48 
49  ObjArray(size_t sz, T const& e): self(true) {
50  self()->array_.resize(sz, e);
51  }
52 
54  }
55 
56  ObjArray& copyFrom(ObjArray const& a) {
57  self().copyFrom(a.self);
58  return *this;
59  }
60 
62  self().referenceFrom(a.self);
63  return *this;
64  }
65 
66  size_t size() const {
67  return self->array_.size();
68  }
69  bool empty() const {
70  return self->array_.empty();
71  }
72 
73  size_t size(size_t res, T const& i) {
74  self()->array_.resize(res, i);
75  return size();
76  }
77 
78  size_t size(size_t res) {
79  self()->array_.resize(res);
80  return size();
81  }
82 
83  void clear() {
84  self()->array_.clear();
85  }
86 
87  T const& entry(size_t i) const {
88  return self->array_[i];
89  }
90  T const& entry(size_t i, T const& e) {
91  self()->array_[i] = e;
92  return entry(i);
93  }
94 
95  T const& putBack(T const& e) {
96  self()->array_.push_back(e);
97  return entry(size() - 1);
98  }
99 
100  bool popBack() {
101  if (empty()) return false;
102  self()->array_.pop_back();
103  return true;
104  }
105 
107  return copyFrom(a);
108  }
109 
110  T const& operator[](size_t i) const {
111  return self->array_[i];
112  }
113 
114  T& operator[](size_t i) {
115  return self()->array_[i];
116  }
117 
118  bool write(FILE* f, bool bin, unsigned int fg) const {
119  size_t sz = size();
120  if (bin) {
121  if (fwrite(&sz, sizeof(size_t), 1, f) < 1) return false;
122  }
123  else {
124  if (fprintf(f, "%lu\n", sz) < 1) return false;
125  }
126  for (size_t i = 0; i < sz; i++) {
127  if (self->array_[i].write(f, bin, fg) == false) return false;
128  }
129  return true;
130  }
131 
132  bool read(FILE* f, bool bin, unsigned int fg) {
133  size_t sz;
134  if (bin) {
135  if (fread(&sz, sizeof(size_t), 1, f) < 1) return false;
136  }
137  else {
138  if (fscanf(f, "%lu\n", &sz) < 0) return false;
139  }
140  size(sz);
141  for (size_t i = 0; i < sz; i++) {
142  if (self()->array_[i].read(f, bin, fg) == false) return false;
143  }
144  return true;
145  }
146 
147  ObjBase* create() const {
148  return new ObjArray();
149  }
150 
151  ObjBase* copyFrom(ObjBase const* b) {
152  return &(copyFrom(*b));
153  }
154 
155  char const* ctype() const {
156  return typeid(*this).name();
157  }
158 
159  std::string type() const {
160  return std::string(ctype());
161  }
162 };
163 
164 }
165 
166 #endif // oo_ObjArray_H__