Cube  Diff

Differences From Artifact [8ddc91f166]:

To Artifact [9188f1112b]:


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

109
110
111
112
113
114
115
116
117
118

119
120

121
122
123
124
125
126
127












128
129
130
131
132




133
134
135


136
137
138
139



140
141
142
143
144
















145
146
147


148
149
150

151
152
153
154
155




156
157
158
159
160
161
162
163
164
165
166
167
168
















169

170
171
172
173
174
175
176












177
178
179
180
181
182




183



184
185
186












187



188
189
190
191
192

















193


194
195
196



197
198
199



200









201
202
203
204
205
206
207








208

209
210
211
212
213
214
215








216
217



218
219





220
221

222
223





224
225
226
227
228
229





230
231
232
233
234
235
236
237
238









239
240
241


242

243
244
245
246
247
248







249
250
251
252
253
254
255
256
257











258
259
260
261
262
263
264
265
266
267









268
269






270

271
272
273
274
275
276
















277
278
279
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123





124
125
126
127
128


129

130
131
132

133
134


135
136
137
138
139
140

141
142

143







144
145
146
147
148
149
150
151
152
153
154
155
156




157
158
159
160
161


162
163
164



165
166
167
168




169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185


186
187
188
189

190





191
192
193
194
195












196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213







214
215
216
217
218
219
220
221
222
223
224
225






226
227
228
229
230
231
232
233



234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249





250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266

267
268
269


270
271
272



273
274
275
276
277
278
279
280
281
282
283
284
285







286
287
288
289
290
291
292
293
294
295







296
297
298
299
300
301
302
303
304
305
306
307
308


309
310
311
312
313
314

315


316
317
318
319
320
321





322
323
324
325
326
327








328
329
330
331
332
333
334
335
336
337


338
339
340
341






342
343
344
345
346
347
348









349
350
351
352
353
354
355
356
357
358
359










360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376

377

378




379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396








-
-
-
-
-
-
+
+
+
+
+
+















-
-
-
+
+
+

+
+
-
-
-
-
-
-
+
+
+
+
+
+
+


-
-
+
+







-



-
+

+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+


-
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+



-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+




+
+
-
-
-
-
-
+
+
+
+
+
-
-

-
+


-
+

-
-






-
+

-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+

-
-
-
-
+
+
+
+

-
-
+
+

-
-
-
+
+
+

-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

-
-
+
+


-
+
-
-
-
-
-
+
+
+
+

-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+

+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+

-
-
+
+
+
-
-
-
+
+
+

+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+

+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+


+
+
+
-
-
+
+
+
+
+

-
+
-
-
+
+
+
+
+

-
-
-
-
-
+
+
+
+
+

-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+

-
-
+
+

+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+


+
+
+
+
+
+
-
+
-

-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+


-

#include <math.h>

#ifdef __GNUC__
#undef gamma
#endif

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <limits.h>
#include <assert.h>
#include <assert.h>
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __GNUC__
#include <new>
#else
#include <new.h>
#endif

#ifdef NULL
#undef NULL
#endif
#define NULL 0

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;

#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define rnd(max) (rand()%(max))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define rnd(max) (rand() % (max))
#define rndreset() (srand(1))
#define rndtime()                                                              \
	{                                                                      \
#define rndtime() { loopi(lastmillis&0xF) rnd(i+1); }
#define loop(v,m) for(int v = 0; v<(m); v++)
#define loopi(m) loop(i,m)
#define loopj(m) loop(j,m)
#define loopk(m) loop(k,m)
#define loopl(m) loop(l,m)
		loopi(lastmillis & 0xF) rnd(i + 1);                            \
	}
#define loop(v, m) for (int v = 0; v < (m); v++)
#define loopi(m) loop(i, m)
#define loopj(m) loop(j, m)
#define loopk(m) loop(k, m)
#define loopl(m) loop(l, m)

#ifdef WIN32
#pragma warning( 3 : 4189 ) 
//#pragma comment(linker,"/OPT:NOWIN98")
#pragma warning(3 : 4189)
// #pragma comment(linker,"/OPT:NOWIN98")
#define PATHDIV '\\'
#else
#define __cdecl
#define _vsnprintf vsnprintf
#define PATHDIV '/'
#endif


// easy safe strings

#define _MAXDEFSTR 260
typedef char string[_MAXDEFSTR]; 
typedef char string[_MAXDEFSTR];

inline void
inline void strn0cpy(char *d, const char *s, size_t m) { strncpy(d,s,m); d[(m)-1] = 0; };
inline void strcpy_s(char *d, const char *s) { strn0cpy(d,s,_MAXDEFSTR); };
inline void strcat_s(char *d, const char *s) { size_t n = strlen(d); strn0cpy(d+n,s,_MAXDEFSTR-n); };

inline void formatstring(char *d, const char *fmt, va_list v)
strn0cpy(char *d, const char *s, size_t m)
{
	strncpy(d, s, m);
	d[(m)-1] = 0;
};
inline void
strcpy_s(char *d, const char *s)
{
	strn0cpy(d, s, _MAXDEFSTR);
};
inline void
strcat_s(char *d, const char *s)
{
	size_t n = strlen(d);
	strn0cpy(d + n, s, _MAXDEFSTR - n);
};

inline void
formatstring(char *d, const char *fmt, va_list v)
{
    _vsnprintf(d, _MAXDEFSTR, fmt, v);
    d[_MAXDEFSTR-1] = 0;
	_vsnprintf(d, _MAXDEFSTR, fmt, v);
	d[_MAXDEFSTR - 1] = 0;
};

struct sprintf_s_f
struct sprintf_s_f {
{
    char *d;
    sprintf_s_f(char *str): d(str) {};
    void operator()(const char* fmt, ...)
    {
        va_list v;
        va_start(v, fmt);
        _vsnprintf(d, _MAXDEFSTR, fmt, v);
        va_end(v);
        d[_MAXDEFSTR-1] = 0;
    };
	char *d;
	sprintf_s_f(char *str) : d(str) {};
	void
	operator()(const char *fmt, ...)
	{
		va_list v;
		va_start(v, fmt);
		_vsnprintf(d, _MAXDEFSTR, fmt, v);
		va_end(v);
		d[_MAXDEFSTR - 1] = 0;
	};
};

#define sprintf_s(d) sprintf_s_f((char *)d)
#define sprintf_sd(d) string d; sprintf_s(d)
#define sprintf_sdlv(d,last,fmt) string d; { va_list ap; va_start(ap, last); formatstring(d, fmt, ap); va_end(ap); }
#define sprintf_sdv(d,fmt) sprintf_sdlv(d,fmt,fmt)

#define sprintf_sd(d)                                                          \
	string d;                                                              \
	sprintf_s(d)
#define sprintf_sdlv(d, last, fmt)                                             \
	string d;                                                              \
	{                                                                      \
		va_list ap;                                                    \
		va_start(ap, last);                                            \
		formatstring(d, fmt, ap);                                      \
		va_end(ap);                                                    \
	}
#define sprintf_sdv(d, fmt) sprintf_sdlv(d, fmt, fmt)

// fast pentium f2i

#ifdef _MSC_VER
inline int
fast_f2nat(float a)
inline int fast_f2nat(float a) {        // only for positive floats
    static const float fhalf = 0.5f;
    int retval;
    
    __asm fld a
{ // only for positive floats
	static const float fhalf = 0.5f;
	int retval;

	__asm fld a __asm fsub fhalf __asm fistp retval // perf regalloc?
    __asm fsub fhalf
    __asm fistp retval      // perf regalloc?

    return retval;
	    return retval;
};
#else
#define fast_f2nat(val) ((int)(val)) 
#define fast_f2nat(val) ((int)(val))
#endif



extern char *path(char *s);
extern char *loadfile(char *fn, int *size);
extern void endianswap(void *, int, int);

// memory pool that uses buckets and linear allocation for small objects
// VERY fast, and reasonably good memory reuse 
// VERY fast, and reasonably good memory reuse

struct pool
struct pool {
{
    enum { POOLSIZE = 4096 };   // can be absolutely anything
    enum { PTRSIZE = sizeof(char *) };
    enum { MAXBUCKETS = 65 };   // meaning up to size 256 on 32bit pointer systems
    enum { MAXREUSESIZE = MAXBUCKETS*PTRSIZE-PTRSIZE };
    inline size_t bucket(size_t s) { return (s+PTRSIZE-1)>>PTRBITS; };
    enum { PTRBITS = PTRSIZE==2 ? 1 : PTRSIZE==4 ? 2 : 3 };
	enum { POOLSIZE = 4096 }; // can be absolutely anything
	enum { PTRSIZE = sizeof(char *) };
	enum {
		MAXBUCKETS = 65
	}; // meaning up to size 256 on 32bit pointer systems
	enum { MAXREUSESIZE = MAXBUCKETS * PTRSIZE - PTRSIZE };
	inline size_t
	bucket(size_t s)
	{
		return (s + PTRSIZE - 1) >> PTRBITS;
	};
	enum { PTRBITS = PTRSIZE == 2 ? 1 : PTRSIZE == 4 ? 2 : 3 };

    char *p;
    size_t left;
    char *blocks;
    void *reuse[MAXBUCKETS];
	char *p;
	size_t left;
	char *blocks;
	void *reuse[MAXBUCKETS];

    pool();
    ~pool() { dealloc_block(blocks); };
	pool();
	~pool() { dealloc_block(blocks); };

    void *alloc(size_t size);
    void dealloc(void *p, size_t size);
    void *realloc(void *p, size_t oldsize, size_t newsize);
	void *alloc(size_t size);
	void dealloc(void *p, size_t size);
	void *realloc(void *p, size_t oldsize, size_t newsize);

    char *string(char *s, size_t l);
    char *string(char *s) { return string(s, strlen(s)); };
    void deallocstr(char *s) { dealloc(s, strlen(s)+1); }; 
    char *stringbuf(char *s) { return string(s, _MAXDEFSTR-1); }; 
	char *string(char *s, size_t l);
	char *
	string(char *s)
	{
		return string(s, strlen(s));
	};
	void
	deallocstr(char *s)
	{
		dealloc(s, strlen(s) + 1);
	};
	char *
	stringbuf(char *s)
	{
		return string(s, _MAXDEFSTR - 1);
	};

    void dealloc_block(void *b);
    void allocnext(size_t allocsize);
	void dealloc_block(void *b);
	void allocnext(size_t allocsize);
};

template <class T> struct vector
template <class T> struct vector {
{
    T *buf;
    int alen;
    int ulen;
    pool *p;
	T *buf;
	int alen;
	int ulen;
	pool *p;

    vector()
    {
        this->p = gp();
        alen = 8;
        buf = (T *)p->alloc(alen*sizeof(T));
        ulen = 0;
    };
    
    ~vector() { setsize(0); p->dealloc(buf, alen*sizeof(T)); };
    
    vector(vector<T> &v);
    void operator=(vector<T> &v);
	vector()
	{
		this->p = gp();
		alen = 8;
		buf = (T *)p->alloc(alen * sizeof(T));
		ulen = 0;
	};

	~vector()
	{
		setsize(0);
		p->dealloc(buf, alen * sizeof(T));
	};

	vector(vector<T> &v);
	void operator=(vector<T> &v);

	T &
    T &add(const T &x)
    {
        if(ulen==alen) realloc();
        new (&buf[ulen]) T(x);
        return buf[ulen++];
    };

	add(const T &x)
	{
		if (ulen == alen)
			realloc();
		new (&buf[ulen]) T(x);
		return buf[ulen++];
	};

	T &
	add()
	{
		if (ulen == alen)
    T &add()
    {
        if(ulen==alen) realloc();
        new (&buf[ulen]) T;
        return buf[ulen++];
    };
			realloc();
		new (&buf[ulen]) T;
		return buf[ulen++];
	};

	T &
	pop()
	{
    T &pop() { return buf[--ulen]; };
    T &last() { return buf[ulen-1]; };
    bool empty() { return ulen==0; };
		return buf[--ulen];
	};
	T &
	last()
	{
		return buf[ulen - 1];
	};
	bool
	empty()
	{
		return ulen == 0;
	};

	int
	length()
	{
    int length() { return ulen; };
    T &operator[](int i) { assert(i>=0 && i<ulen); return buf[i]; };
    void setsize(int i) { for(; ulen>i; ulen--) buf[ulen-1].~T(); };
    T *getbuf() { return buf; };
    
		return ulen;
	};
	T &
	operator[](int i)
	{
		assert(i >= 0 && i < ulen);
		return buf[i];
	};
	void
	setsize(int i)
	{
		for (; ulen > i; ulen--)
			buf[ulen - 1].~T();
	};
	T *
	getbuf()
	{
    void sort(void *cf) { qsort(buf, ulen, sizeof(T), (int (__cdecl *)(const void *,const void *))cf); };
		return buf;
	};

    void realloc()
    {
	void
	sort(void *cf)
	{
        int olen = alen;
        buf = (T *)p->realloc(buf, olen*sizeof(T), (alen *= 2)*sizeof(T));
    };
		qsort(buf, ulen, sizeof(T),
		    (int(__cdecl *)(const void *, const void *))cf);
	};

	void
	realloc()
	{
		int olen = alen;
		buf = (T *)p->realloc(
		    buf, olen * sizeof(T), (alen *= 2) * sizeof(T));
	};

	T
    T remove(int i)
    {
        T e = buf[i];
        for(int p = i+1; p<ulen; p++) buf[p-1] = buf[p];
        ulen--;
        return e;
    };
	remove(int i)
	{
		T e = buf[i];
		for (int p = i + 1; p < ulen; p++)
			buf[p - 1] = buf[p];
		ulen--;
		return e;
	};

	T &
    T &insert(int i, const T &e)
    {
        add(T());
        for(int p = ulen-1; p>i; p--) buf[p] = buf[p-1];
        buf[i] = e;
        return buf[i];
    };
	insert(int i, const T &e)
	{
		add(T());
		for (int p = ulen - 1; p > i; p--)
			buf[p] = buf[p - 1];
		buf[i] = e;
		return buf[i];
	};
};

#define loopv(v)                                                               \
	if (false) {                                                           \
	} else                                                                 \
#define loopv(v)    if(false) {} else for(int i = 0; i<(v).length(); i++)    
#define loopvrev(v) if(false) {} else for(int i = (v).length()-1; i>=0; i--)
		for (int i = 0; i < (v).length(); i++)
#define loopvrev(v)                                                            \
	if (false) {                                                           \
	} else                                                                 \
		for (int i = (v).length() - 1; i >= 0; i--)

template <class T> struct hashtable
template <class T> struct hashtable {
{
    struct chain { chain *next; char *key; T data; };
	struct chain {
		chain *next;
		char *key;
		T data;
	};

    int size;
    int numelems;
    chain **table;
    pool *parent;
    chain *enumc;
	int size;
	int numelems;
	chain **table;
	pool *parent;
	chain *enumc;

    hashtable()
    {
        this->size = 1<<10;
        this->parent = gp();
        numelems = 0;
        table = (chain **)parent->alloc(size*sizeof(T));
        for(int i = 0; i<size; i++) table[i] = NULL;
    };
	hashtable()
	{
		this->size = 1 << 10;
		this->parent = gp();
		numelems = 0;
		table = (chain **)parent->alloc(size * sizeof(T));
		for (int i = 0; i < size; i++)
			table[i] = NULL;
	};

    hashtable(hashtable<T> &v);
    void operator=(hashtable<T> &v);
	hashtable(hashtable<T> &v);
	void operator=(hashtable<T> &v);

	T *
    T *access(char *key, T *data = NULL)
    {
        unsigned int h = 5381;
        for(int i = 0, k; k = key[i]; i++) h = ((h<<5)+h)^k;    // bernstein k=33 xor
        h = h&(size-1);                                         // primes not much of an advantage
        for(chain *c = table[h]; c; c = c->next)
	access(char *key, T *data = NULL)
	{
		unsigned int h = 5381;
		for (int i = 0, k; k = key[i]; i++)
			h = ((h << 5) + h) ^ k; // bernstein k=33 xor
		h = h & (size - 1); // primes not much of an advantage
		for (chain *c = table[h]; c; c = c->next) {
        {
            for(char *p1 = key, *p2 = c->key, ch; (ch = *p1++)==*p2++; ) if(!ch)    //if(strcmp(key,c->key)==0)
            {
                T *d = &c->data;
                if(data) c->data = *data;
                return d;
            };
        };
        if(data)
			for (char *p1 = key, *p2 = c->key, ch;
			     (ch = *p1++) == *p2++;)
				if (!ch) // if(strcmp(key,c->key)==0)
				{
					T *d = &c->data;
					if (data)
						c->data = *data;
					return d;
				};
		};
		if (data) {
        {
            chain *c = (chain *)parent->alloc(sizeof(chain));
            c->data = *data;
            c->key = key;
            c->next = table[h];
            table[h] = c;
            numelems++;
        };
        return NULL;
    };
			chain *c = (chain *)parent->alloc(sizeof(chain));
			c->data = *data;
			c->key = key;
			c->next = table[h];
			table[h] = c;
			numelems++;
		};
		return NULL;
	};
};

#define enumerate(ht, t, e, b)                                                 \
	loopi(ht->size) for (ht->enumc = ht->table[i]; ht->enumc;              \
	                     ht->enumc = ht->enumc->next)                      \
	{                                                                      \
		t e = &ht->enumc->data;                                        \
		b;                                                             \

	}
#define enumerate(ht,t,e,b) loopi(ht->size) for(ht->enumc = ht->table[i]; ht->enumc; ht->enumc = ht->enumc->next) { t e = &ht->enumc->data; b; }

pool *gp(); 
inline char *newstring(char *s)        { return gp()->string(s);    };
inline char *newstring(char *s, size_t l) { return gp()->string(s, l); };
inline char *newstringbuf(char *s)     { return gp()->stringbuf(s); };
pool *gp();
inline char *
newstring(char *s)
{
	return gp()->string(s);
};
inline char *
newstring(char *s, size_t l)
{
	return gp()->string(s, l);
};
inline char *
newstringbuf(char *s)
{
	return gp()->stringbuf(s);
};

#endif