feisty meow concerns codebase 2.140
test_symbol_table.cpp
Go to the documentation of this file.
1/*
2* Name : test_symbol_table
3* Author : Chris Koeritz
4**
5* Copyright (c) 1994-$now By Author. This program is free software; you can *
6* redistribute it and/or modify it under the terms of the GNU General Public *
7* License as published by the Free Software Foundation; either version 2 of *
8* the License or (at your option) any later version. This is online at: *
9* http://www.fsf.org/copyleft/gpl.html *
10* Please send any updates to: fred@gruntose.com *
11*/
12
13#include <basis/byte_array.h>
14#include <basis/guards.h>
15#include <basis/astring.h>
16#include <structures/matrix.h>
18#include <timely/time_stamp.h>
23#include <unit_test/unit_base.h>
24
25#include <stdio.h>
26#include <stdlib.h>
27
28using namespace application;
29using namespace basis;
30using namespace mathematics;
31using namespace filesystem;
32using namespace loggers;
33using namespace structures;
34using namespace textual;
35using namespace timely;
36using namespace unit_test;
37
38//#define DEBUG_SYMBOL_TABLE
39 // uncomment for noisy version.
40
41const int test_iterations = 4;
42
43const int FIND_ITERATIONS = 10;
44const int MAXIMUM_RANDOM_ADDS = 20;
45
46#define LOG(to_print) EMERGENCY_LOG(program_wide_logger::get(), astring(to_print))
47
48//#define OLD_TEST
49 // uncomment for the older version of symbol table.
50
51double time_in_add = 0;
54double time_in_pack = 0;
55double time_in_unpack = 0;
56double time_in_copy = 0;
57
59
60class my_table_def : virtual public hoople_standard, virtual public symbol_table<byte_array>
62{
63public:
64 DEFINE_CLASS_NAME("my_table_def");
65
66 virtual void text_form(base_string &state_fill) const {
67 state_fill.assign(astring(class_name()) + ": uhhh not really implemented");
68 }
69
70 virtual bool equal_to(const equalizable &s2) const {
71 const my_table_def *to_compare = dynamic_cast<const my_table_def *>(&s2);
72 if (!to_compare) return false;
73 if (symbols() != to_compare->symbols()) return false;
74 for (int i = 0; i < symbols(); i++) {
75 if (name(i) != to_compare->name(i)) return false;
76 if (operator [](i) != (*to_compare)[i]) return false;
77 }
78 return true;
79 }
80};
81
83
84// jethro is a simple object for containment below.
85class jethro
86{
87public:
88 astring _truck;
89
90 bool operator ==(const jethro &tc) const { return tc._truck == _truck; }
91 bool operator !=(const jethro &tc) const { return !(*this == tc); }
92};
93
95
96// the test_content object is an object with proper copy constructor
97// and assignment operator that also has deep contents.
98class test_content : public packable
99{
100public:
101 int _q;
102 astring _ted;
103 astring _jed;
104 int_array _ned;
105 matrix<jethro> _med;
106
107 test_content() : _q(9) {}
108
109 test_content(const astring &ted, const astring &jed) : _q(4), _ted(ted),
110 _jed(jed) {}
111
112//hmmm: pack and unpack don't do everything.
113 void pack(byte_array &packed_form) const {
114 attach(packed_form, _q);
115 _ted.pack(packed_form);
116 _jed.pack(packed_form);
117 }
118 int packed_size() const {
119 return sizeof(_q) + _ted.packed_size() + _jed.packed_size();
120 }
121 bool unpack(byte_array &packed_form) {
122 if (!detach(packed_form, _q)) return false;
123 if (!_ted.unpack(packed_form)) return false;
124 if (!_jed.unpack(packed_form)) return false;
125 return true;
126 }
127
128 bool operator ==(const test_content &tc) const {
129 if (tc._q != _q) return false;
130 if (tc._ted != _ted) return false;
131 if (tc._jed != _jed) return false;
132 if (tc._ned.length() != _ned.length()) return false;
133 for (int i = 0; i < _ned.length(); i++)
134 if (tc._ned[i] != _ned[i]) return false;
135
136 if (tc._med.rows() != _med.rows()) return false;
137 if (tc._med.columns() != _med.columns()) return false;
138 for (int c = 0; c < _med.columns(); c++)
139 for (int r = 0; r < _med.rows(); r++)
140 if (tc._med.get(r, c) != _med.get(r, c)) return false;
141
142 return true;
143 }
144 bool operator !=(const test_content &tc) const { return !operator ==(tc); }
145
146 operator int() const { return _q; }
147};
148
150
151class second_table_def : virtual public hoople_standard, virtual public symbol_table<test_content>
152{
153public:
154 DEFINE_CLASS_NAME("second_table_def")
155
156 virtual void text_form(base_string &state_fill) const {
157 state_fill.assign(astring(class_name()) + ": uhhh not really implemented");
158 }
159
160 virtual bool equal_to(const equalizable &s2) const {
161 const second_table_def *to_compare = dynamic_cast<const second_table_def *>(&s2);
162 if (symbols() != to_compare->symbols()) return false;
163 for (int i = 0; i < symbols(); i++) {
164 if ((*this)[i] != (*to_compare)[i]) return false;
165 }
166 return true;
167 }
168};
169
171
172class test_symbol_table : public virtual application_shell, public virtual unit_base
173{
174public:
175 test_symbol_table() {}
176 DEFINE_CLASS_NAME("test_symbol_table");
177
178 void test_1();
179
180 virtual int execute();
181
182 void ADD(my_table_def &syms, const astring &name, const astring &to_add);
183 void FIND(const my_table_def &syms, const astring &name, const astring &to_find);
184
185 void ADD2(second_table_def &syms, const astring &name, const test_content &to_add);
186
187 void pack(byte_array &packed_form, const my_table_def &to_pack);
188 bool unpack(byte_array &packed_form, my_table_def &to_unpack);
189
190 void pack(byte_array &packed_form, const second_table_def &to_pack);
191 bool unpack(byte_array &packed_form, second_table_def &to_unpack);
192
193 void test_byte_table();
194 void test_tc_table();
195};
196
198
199void test_symbol_table::ADD(my_table_def &syms, const astring &name, const astring &to_add)
200{
201 FUNCDEF("ADD")
202 byte_array to_stuff(to_add.length() + 1, (abyte *)to_add.s());
203 time_stamp start;
204 outcome added = syms.add(name, to_stuff);
205 ASSERT_EQUAL(added.value(), common::IS_NEW, "should not already be in table");
206 time_stamp end;
207 time_in_add += end.value() - start.value();
208 start.reset();
209#ifdef OLD_TEST
210 int indy = syms.find(name);
211 ASSERT_FALSE(negative(indy), "should be in table after add");
212 end.reset();
213 time_in_dep_find += end.value() - start.value();
214 const byte_array *found = &syms[indy];
215#else
216 byte_array *found = syms.find(name);
217 ASSERT_TRUE(found, "really should be in table after add");
218 end.reset();
219 time_in_new_find += end.value() - start.value();
220#endif
221 ASSERT_EQUAL(*found, to_stuff, "value should be right in table after add");
222}
223
224void test_symbol_table::FIND(const my_table_def &syms, const astring &name, const astring &to_add)
225{
226 FUNCDEF("FIND")
227 byte_array to_stuff(to_add.length() + 1, (abyte *)to_add.s());
228 for (int i = 0; i < FIND_ITERATIONS; i++) {
229 time_stamp start;
230#ifdef OLD_TEST
231 // double the calls so we roughly match the other test.
232 int indy = syms.find(name);
233 ASSERT_FALSE(negative(indy), "should locate item in table");
234 indy = syms.find(name);
235 ASSERT_FALSE(negative(indy), "second find should locate item in table");
236 byte_array *found = &syms[indy];
237 time_stamp end;
238 time_in_dep_find += end.value() - start.value();
239#else
240 int indy = syms.dep_find(name);
241 ASSERT_FALSE(negative(indy), "should locate item in table (dep_find)");
242 time_stamp end;
243 time_in_dep_find += end.value() - start.value();
244 start.reset();
245 byte_array *found = syms.find(name);
246 ASSERT_TRUE(found, "second find should see item in table (new_find)");
247 end.reset();
248 time_in_new_find += end.value() - start.value();
249#endif
250 }
251}
252
253void test_symbol_table::pack(byte_array &packed_form, const my_table_def &to_pack)
254{
255 attach(packed_form, to_pack.symbols());
257 byte_array content;
258 for (int i = 0; i < to_pack.symbols(); i++) {
259 to_pack.retrieve(i, name, content);
260 name.pack(packed_form);
261 attach(packed_form, content);
262 }
263}
264
265bool test_symbol_table::unpack(byte_array &packed_form, my_table_def &to_unpack)
266{
267 to_unpack.reset();
268 int syms = 0;
269 if (!detach(packed_form, syms)) return false;
271 byte_array chunk;
272 for (int i = 0; i < syms; i++) {
273 if (!name.unpack(packed_form)) return false;
274 if (!detach(packed_form, chunk)) return false;
275 ADD(to_unpack, name, (char *)chunk.observe());
276 }
277 return true;
278}
279
280void test_symbol_table::pack(byte_array &packed_form, const second_table_def &to_pack)
281{
282 attach(packed_form, to_pack.symbols());
284 test_content content;
285 for (int i = 0; i < to_pack.symbols(); i++) {
286 to_pack.retrieve(i, name, content);
287 name.pack(packed_form);
288 content.pack(packed_form);
289 }
290}
291
292bool test_symbol_table::unpack(byte_array &packed_form, second_table_def &to_unpack)
293{
294 to_unpack.reset();
295 int syms = 0;
296 if (!detach(packed_form, syms)) return false;
298 test_content chunk;
299 for (int i = 0; i < syms; i++) {
300 if (!name.unpack(packed_form)) return false;
301 if (!chunk.unpack(packed_form)) return false;
302 to_unpack.add(name, chunk);
303 }
304 return true;
305}
306
308
309my_table_def creatapose()
310{
311 my_table_def to_return;
312 astring name;
313 astring content;
314 for (int y = 0; y < MAXIMUM_RANDOM_ADDS; y++) {
316 content = string_manipulation::make_random_name(300, 1000);
317 byte_array to_stuff(content.length() + 1, (abyte *)content.s());
318 to_return.add(name, to_stuff);
319 }
320 return to_return;
321}
322
324
325void test_symbol_table::test_byte_table()
326{
327 FUNCDEF("test_byte_table")
328 my_table_def syms;
329 my_table_def new_syms;
330 my_table_def newer_syms;
331 for (int qq = 0; qq < test_iterations; qq++) {
332 syms.reset(); // still could be costly.
333#ifdef DEBUG_SYMBOL_TABLE
334 LOG(astring(astring::SPRINTF, "index %d", qq));
335#endif
336 astring freudname("blurgh");
337 astring freud("Sigmund Freud was a very freaked dude.");
338 ADD(syms, freudname, freud);
339 astring borgname("borg");
340 astring borg("You will be assimilated.");
341 ADD(syms, borgname, borg);
342 astring xname("X-Men");
343 astring x("The great unknown superhero cartoon.");
344 ADD(syms, xname, x);
345 astring aname("fleeny-brickle");
346 astring a("lallax menick publum.");
347 ADD(syms, aname, a);
348 astring axname("ax");
349 astring ax("Lizzy Borden has a very large hatchet.");
350 ADD(syms, axname, ax);
351 astring bloinkname("urg.");
352 astring bloink("this is a short and stupid string");
353 ADD(syms, bloinkname, bloink);
354 astring faxname("fax");
355 astring fax("alligators in my teacup.");
356 ADD(syms, faxname, fax);
357 astring zname("eagle ovaries");
358 astring z("malfeasors beware");
359 ADD(syms, zname, z);
360
361 FIND(syms, freudname, freud);
362 FIND(syms, borgname, borg);
363 FIND(syms, xname, x);
364 FIND(syms, aname, a);
365 FIND(syms, axname, ax);
366 FIND(syms, bloinkname, bloink);
367 FIND(syms, faxname, fax);
368 FIND(syms, zname, z);
369
371 astring content;
372 for (int y = 0; y < MAXIMUM_RANDOM_ADDS; y++) {
374 content = string_manipulation::make_random_name(300, 1000);
375 ADD(syms, name, content);
376 FIND(syms, name, content);
377 }
378
379 // test copying the table.
380 time_stamp start; // click, on.
381 my_table_def copy1(syms);
382 {
383 my_table_def joe(copy1);
384 my_table_def joe2 = joe;
385 ASSERT_EQUAL(joe2, joe, "copy test A: symbol tables should be same");
386 my_table_def joe3 = creatapose(); // on stack.
387 my_table_def joe4 = joe3;
388 my_table_def joe5 = joe4;
389 ASSERT_EQUAL(joe5, joe3, "copy test A2: symbol tables should be same");
390 }
391 ASSERT_FALSE(! (syms == copy1), "copy test B: symbol tables should be same still");
392 time_stamp end;
393 time_in_copy += end.value() - start.value();
394
395#ifdef DEBUG_SYMBOL_TABLE
397 LOG("now packing the symbol table...");
398#endif
399
400#ifdef DEBUG_SYMBOL_TABLE
401 LOG("now unpacking from packed form");
402#endif
403 byte_array packed_form;
404 pack(packed_form, syms);
405 ASSERT_TRUE(unpack(packed_form, new_syms), "unpack test should not fail to unpack");
406
407#ifdef DEBUG_SYMBOL_TABLE
409#endif
410 ASSERT_FALSE(! (syms == new_syms), "unpacked test symbol tables must be equal");
411
412#ifdef DEBUG_SYMBOL_TABLE
414 LOG("packing the symbol table again...");
415#endif
416 byte_array packed_again(0);
417 start.reset(); // click, on.
418 pack(packed_again, new_syms);
419 end.reset(); // click, off.
420 time_in_pack += end.value() - start.value();
421#ifdef DEBUG_SYMBOL_TABLE
422 LOG("now unpacking from packed form again...");
423#endif
424 start = time_stamp();
425 ASSERT_TRUE(unpack(packed_again, newer_syms), "newer unpacking should working be");
426 end = time_stamp();
427 time_in_unpack += end.value() - start.value();
428#ifdef DEBUG_SYMBOL_TABLE
430#endif
431 ASSERT_EQUAL(new_syms, newer_syms,
432 "unpacked test these just aren't getting it but should be same");
433 }
434}
435
437
438void test_symbol_table::ADD2(second_table_def &syms, const astring &name,
439 const test_content &to_add)
440{
441 FUNCDEF("ADD2")
442 time_stamp start;
443 outcome added = syms.add(name, to_add);
444 ASSERT_EQUAL(added.value(), common::IS_NEW, "new item should not already be in table");
445 time_stamp end;
446 time_in_add += end.value() - start.value();
447 start = time_stamp(); // reset start.
448#ifdef OLD_TEST
449 int indy = syms.find(name);
450 ASSERT_FALSE(negative(indy), "item should be found after add");
451 // refind to balance timing.
452 indy = syms.find(name);
453 ASSERT_FALSE(negative(indy), "item should be found after second add");
454 end = time_stamp(); // reset end.
455 time_in_dep_find += end.value() - start.value();
456#else
457 int indy = syms.dep_find(name);
458 ASSERT_FALSE(negative(indy), "finding item after add should work");
459 end = time_stamp(); // reset end.
460 time_in_dep_find += end.value() - start.value();
461 start = time_stamp();
462 test_content *found = syms.find(name);
463 ASSERT_TRUE(found, "item shouldn't be nil that we found");
464 end = time_stamp(); // reset end.
465 time_in_new_find += end.value() - start.value();
466#endif
467 astring name_out;
468 test_content content_out;
469 if (syms.retrieve(indy, name_out, content_out) != common::OKAY) {
470 ASSERT_EQUAL(name_out, name, "name should be correct after retrieve");
471 ASSERT_EQUAL(content_out, to_add, "content should be correct after retrieve");
472 }
473}
474
476
477void test_symbol_table::test_tc_table()
478{
479 FUNCDEF("test_tc_table")
480 second_table_def syms;
481 second_table_def new_syms;
482 second_table_def newer_syms;
483 for (int qq = 0; qq < test_iterations; qq++) {
484 syms.reset();
485#ifdef DEBUG_SYMBOL_TABLE
486 LOG(astring(astring::SPRINTF, "index %d", qq));
487#endif
488 astring freudname("blurgh");
489 test_content freud("Sigmund Freud was a very freaked dude.", "flutenorf");
490 ADD2(syms, freudname, freud);
491 astring borgname("borg");
492 test_content borg("You will be assimilated.", "alabaster");
493 ADD2(syms, borgname, borg);
494 astring xname("X-Men");
495 test_content x("The great unknown superhero cartoon.", "somnambulist");
496 ADD2(syms, xname, x);
497 astring aname("fleeny-brickle");
498 test_content a("lallax menick publum.", "aglos bagnort pavlod");
499 ADD2(syms, aname, a);
500 astring axname("ax");
501 test_content ax("Lizzy Borden has a very large hatchet.", "chop");
502 ADD2(syms, axname, ax);
503 astring bloinkname("urg.");
504 test_content bloink("this is a short and stupid string", "not that short");
505 ADD2(syms, bloinkname, bloink);
506 astring faxname("fax");
507 test_content fax("alligators in my teacup.", "lake placid");
508 ADD2(syms, faxname, fax);
509 astring zname("eagle ovaries");
510 test_content z("malfeasors beware", "endangered");
511 ADD2(syms, zname, z);
512
513 // test copying the table.
514 time_stamp start;
515 second_table_def copy1(syms);
516 {
517 second_table_def joe(copy1);
518 second_table_def joe2 = joe;
519 ASSERT_EQUAL(joe2, joe, "copy test C: should have same symbol tables");
520 }
521 ASSERT_FALSE(! (syms == copy1), "copy test D: symbol tables shouldn't be different");
522 time_stamp end;
523 time_in_copy += end.value() - start.value();
524
525#ifdef DEBUG_SYMBOL_TABLE
526 astring texto;
527 syms.text_form(texto);
528 LOG(astring("This is the symbol table before any manipulation\n") + texto);
529 LOG("now packing the symbol table...");
530#endif
531
532#ifdef DEBUG_SYMBOL_TABLE
533 LOG("now unpacking from packed form");
534#endif
535 byte_array packed_form;
536 pack(packed_form, syms);
537 ASSERT_TRUE(unpack(packed_form, new_syms), "crikey all these unpacks should work");
538#ifdef DEBUG_SYMBOL_TABLE
539 new_syms.text_form(texto);
540 LOG(astring("unpacked form has:\n") + texto);
541#endif
542 ASSERT_FALSE(! (syms == new_syms), "unpacked test symbol tables should be equivalent");
543
544#ifdef DEBUG_SYMBOL_TABLE
545 new_syms.text_form(texto);
546 LOG(astring("got the unpacked form, and dumping it:\n") + texto);
547 LOG("packing the symbol table again...");
548#endif
549 byte_array packed_again(0);
550 pack(packed_again, new_syms);
551#ifdef DEBUG_SYMBOL_TABLE
552 LOG("now unpacking from packed form again...");
553#endif
554 ASSERT_TRUE(unpack(packed_again, newer_syms), "unpacking should get back the goods");
555#ifdef DEBUG_SYMBOL_TABLE
556 newer_syms.text_form(texto);
557 LOG(astring("got the unpacked form, and dumping it:\n") + texto);
558#endif
559 ASSERT_FALSE(! (new_syms == newer_syms), "unpacked test symbol tables should stay same");
560 }
561}
562
564
565int test_symbol_table::execute()
566{
567#ifdef DEBUG_SYMBOL_TABLE
568 LOG(astring("starting test 1: ") + time_stamp::notarize(false));
569#endif
570 test_byte_table();
571#ifdef DEBUG_SYMBOL_TABLE
572 LOG(astring("done test 1: ") + time_stamp::notarize(false));
573 LOG(astring("starting test 2: ") + time_stamp::notarize(false));
574#endif
575
576 test_tc_table();
577#ifdef DEBUG_SYMBOL_TABLE
578 LOG(astring("done test 2: ") + time_stamp::notarize(false));
579 LOG(astring(astring::SPRINTF, "time in add=%f", time_in_add));
580 LOG(astring(astring::SPRINTF, "time in dep_find=%f", time_in_dep_find));
581 LOG(astring(astring::SPRINTF, "time in new_find=%f", time_in_new_find));
582 LOG(astring(astring::SPRINTF, "time in pack=%f", time_in_pack));
583 LOG(astring(astring::SPRINTF, "time in unpack=%f", time_in_unpack));
584#endif
585 return final_report();
586}
587
589
590HOOPLE_MAIN(test_symbol_table, )
591
#define ADD(name, value)
#define FIND(name, value)
The application_shell is a base object for console programs.
virtual int execute()=0
< retrieves the command line from the /proc hierarchy on linux.
const contents * observe() const
Returns a pointer to the underlying C array of data.
Definition array.h:172
int length() const
Returns the current reported length of the allocated C array.
Definition array.h:115
Provides a dynamically resizable ASCII character string.
Definition astring.h:35
void pack(byte_array &target) const
stores this string in the "target". it can later be unpacked again.
Definition astring.cpp:964
int packed_size() const
Reports the size required to pack this string into a byte array.
Definition astring.cpp:962
const char * s() const
synonym for observe. the 's' stands for "string", if that helps.
Definition astring.h:113
int length() const
Returns the current length of the string.
Definition astring.cpp:132
bool unpack(byte_array &source)
retrieves a string (packed with pack()) from "source" into this string.
Definition astring.cpp:967
Defines the base class for all string processing objects in hoople.
Definition base_string.h:28
virtual base_string & assign(const base_string &s)=0
Sets the contents of this string to "s".
A very common template for a dynamic array of bytes.
Definition byte_array.h:36
the "common" class defines our common_outcomes.
Base class for object that can tell itself apart from other instances.
Definition contracts.h:44
virtual bool equal_to(const equalizable &s2) const =0
the base class of the most easily used and tested objects in the library.
Definition contracts.h:161
A simple object that wraps a templated array of ints.
Definition array.h:275
Outcomes describe the state of completion for an operation.
Definition outcome.h:31
A base class for objects that can pack into an array of bytes.
Definition byte_array.h:87
virtual int packed_size() const =0
Estimates the space needed for the packed structure.
virtual bool unpack(byte_array &packed_form)=0
Restores the packable from the "packed_form".
virtual void pack(byte_array &packed_form) const =0
Creates a packed form of the packable object in "packed_form".
virtual void text_form(base_string &state_fill) const =0
Provides a text view of all the important info owned by this object.
virtual const char * class_name() const =0
Returns the bare name of this class as a constant character pointer.
Represents a two-dimensional array of objects.
Definition matrix.h:32
contents & get(int row, int column)
Definition matrix.h:180
int columns() const
Definition matrix.h:41
int rows() const
Definition matrix.h:40
Maintains a list of names, where each name has a type and some contents.
const basis::astring & name(int index) const
returns the name held at the "index".
int symbols() const
returns the number of symbols listed in the table.
static basis::astring make_random_name(int min=1, int max=64)
creates a random name, where the letters are between 'a' and 'z'.
Represents a point in time relative to the operating system startup time.
Definition time_stamp.h:38
static basis::astring notarize(bool add_space=true)
a useful method for getting a textual version of the time "right now".
void reset()
sets the stamp time back to now.
time_representation value() const
returns the time_stamp in terms of the lower level type.
Definition time_stamp.h:61
#define DEFINE_CLASS_NAME(objname)
Defines the name of a class by providing a couple standard methods.
Definition enhance_cpp.h:42
#define FUNCDEF(func_in)
FUNCDEF sets the name of a function (and plugs it into the callstack).
Definition enhance_cpp.h:54
Provides macros that implement the 'main' program of an application.
#define HOOPLE_MAIN(obj_name, obj_args)
options that should work for most unix and linux apps.
Definition hoople_main.h:61
Implements an application lock to ensure only one is running at once.
The guards collection helps in testing preconditions and reporting errors.
Definition array.h:30
unsigned char abyte
A fairly important unit which is seldom defined...
Definition definitions.h:51
void attach(byte_array &packed_form, const char *to_attach)
Packs a character string "to_attach" into "packed_form".
Definition astring.cpp:1018
bool detach(byte_array &packed_form, astring &to_detach)
Unpacks a character string "to_attach" from "packed_form".
Definition astring.cpp:1026
bool negative(const type &a)
negative returns true if "a" is less than zero.
Definition functions.h:43
A platform independent way to obtain the timestamp of a file.
A logger that sends to the console screen using the standard output device.
An extension to floating point primitives providing approximate equality.
Definition averager.h:21
A dynamic container class that holds any kind of object via pointers.
Definition amorph.h:55
bool unpack(basis::byte_array &packed_form, set< contents > &to_unpack)
provides a way to unpack any set that stores packable objects.
Definition set.h:139
void pack(basis::byte_array &packed_form, const set< contents > &to_pack)
provides a way to pack any set that stores packable objects.
Definition set.h:131
#include <time.h>
Useful support functions for unit testing, especially within hoople.
Definition unit_base.cpp:35
my_table_def creatapose()
double time_in_unpack
double time_in_dep_find
double time_in_copy
double time_in_pack
const int test_iterations
const int MAXIMUM_RANDOM_ADDS
#define LOG(to_print)
double time_in_new_find
double time_in_add
const int FIND_ITERATIONS
#define ASSERT_EQUAL(a, b, test_name)
Definition unit_base.h:38
#define ASSERT_TRUE(a, test_name)
Definition unit_base.h:46
#define ASSERT_FALSE(a, test_name)
Definition unit_base.h:50