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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/*****
* runtimebase.in
* Andy Hammerlindl 2009/07/28
*
* Common declarations needed for all code-generating .in files.
*
*****/
// Basic types need by almost all .in files.
// Use Void f() instead of void f() to force an explicit Stack argument.
void => primVoid()
Void => primVoid()
Int => primInt()
bool => primBoolean()
double => primReal()
real => primReal()
string* => primString()
string => primString()
#include "stack.h"
#include "types.h"
#include "builtin.h"
#include "entry.h"
#include "errormsg.h"
#include "array.h"
#include "triple.h"
#include "callable.h"
#include "opsymbols.h"
using vm::stack;
using vm::error;
using vm::array;
using vm::read;
using vm::callable;
using types::formal;
using types::function;
using camp::triple;
#define PRIMITIVE(name,Name,asyName) using types::prim##Name;
#include <primitives.h>
#undef PRIMITIVE
typedef double real;
void unused(void *);
namespace run {
array *copyArray(array *a);
array *copyArray2(array *a);
array *copyArray3(array *a);
inline size_t checkdimension(const array *a, size_t dim)
{
size_t size=checkArray(a);
if(dim && size != dim) {
ostringstream buf;
buf << "array of length " << dim << " expected";
error(buf);
}
return size;
}
template<class T>
void copyArrayC(T* &dest, const array *a, size_t dim=0,
GCPlacement placement=NoGC)
{
size_t size=checkdimension(a,dim);
dest=(placement == NoGC) ? new T[size] : new(placement) T[size];
for(size_t i=0; i < size; i++)
dest[i]=read<T>(a,i);
}
template<class T>
void copyArray2C(T* &dest, const array *a, bool square=true, size_t dim2=0,
GCPlacement placement=NoGC)
{
size_t n=checkArray(a);
size_t m=(square || n == 0) ? n : checkArray(read<array*>(a,0));
if(n > 0 && dim2 && m != dim2) {
ostringstream buf;
buf << "second matrix dimension must be " << dim2;
error(buf);
}
dest=(placement == NoGC) ? new T[n*m] : new(placement) T[n*m];
for(size_t i=0; i < n; i++) {
array *ai=read<array*>(a,i);
size_t aisize=checkArray(ai);
if(aisize == m) {
T *desti=dest+i*m;
for(size_t j=0; j < m; j++)
desti[j]=read<T>(ai,j);
} else
error(square ? "matrix must be square" : "matrix must be rectangular");
}
}
double *copyTripleArray2Components(array *a, bool square=true, size_t dim2=0,
GCPlacement placement=NoGC);
}
function *realRealFunction();
#define CURRENTPEN processData().currentpen
|