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
53
~ObjArray
() {
54
}
55
56
ObjArray
&
copyFrom
(
ObjArray
const
& a) {
57
self
().
copyFrom
(a.self);
58
return
*
this
;
59
}
60
61
ObjArray
&
referenceFrom
(
ObjArray
const
& a) {
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
106
ObjArray
&
operator=
(
ObjArray
const
& a) {
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__
meowpp
oo
ObjArray.h
Generated on Sun Jun 1 2014 13:54:33 for Templates -- Meow by
1.8.3.1