#include "dmm.hh"
#ifdef DMM_ONLINE
class Menu_Button;
const int ARRAY_SIZE_PRIME_NUMBER = 1000003;//9973;//5;
class Node
{
public:
Node* next;
void* data;
};
Node* dmm_array[ARRAY_SIZE_PRIME_NUMBER];
void debug_dmm_print()
{
dmp::cout << "(\n";
for (int i=0; i<ARRAY_SIZE_PRIME_NUMBER; i++)
{
//dmp::cout << " (\n";
for (Node* n = dmm_array[i]; n != null; n = n->next)
{
dmp::Root* r = reinterpret_cast<dmp::Root*>(n->data);
dmp::cout << " " << dmm_decode(r->debug_code) << '\n';
// if (r->debug_code == DCODE_SPRITE)
// {
// Single_G_C* sgc = reinterpret_cast<Single_G_C*>(r);
// Sprite* s = reinterpret_cast<Sprite*>(sgc);
// if (s != null)
// {
// BITMAP* bmp = s->get_bitmap();
// if (bmp != null)
// {
// for (int y=0; y<bmp->h; y++)
// {
// for (int x=0; x<bmp->w; x++)
// {
// if (getpixel(bmp,x,y) == allegro_col_white)
// {
// dmp::cout << "W";
// }
// else if (getpixel(bmp,x,y) != allegro_col_trans)
// {
// dmp::cout << "#";
// }
// else
// {
// dmp::cout << "-";
// }
// }
// dmp::cout << "\n";
// }
// }
// else
// {
// dmp::cout << "bmp == null\n";
// }
// RLE_SPRITE* rle = s->get_rle_sprite();
// if (rle != null)
// {
// dmp::cout << "rle_sprite != null\n";
// }
// else
// {
// dmp::cout << "rle_sprite == null\n";
// }
// }
// }
// if (r->debug_code == DCODE_R4_SAVE)
// {
// Single_G_C* sgc = reinterpret_cast<Single_G_C*>(r);
// Save* s = reinterpret_cast<Save*>(sgc);
// dmp::cout << *s << "\n";
// dmp::cout << s->get_s() << " " << s->get_level() << "\n";
// //ptr<List<Save> > list = Bank::get_list();
// //ASSERT(list != null);
// //dmp::cout << list->get_name() << "\n";
// //dmp::cout << *s << "\n";
// }
//if (r->debug_code == DCODE_MENU_BUTTON)
//{
// //Menu_Button* m = reinterpret_cast<Menu_Button*>(r);
// //PRINT(m->prop_name);
//}
}
//dmp::cout << " )\n";
}
dmp::cout << ")\n";
}
void* operator new (size_t size)
{
///
/// YEHAR: cout works even before the main function is run!
///
/// WARNING: careful with the ordering of linking... the last file in the list is executed first...
///
//dmp::cout << "*** Called operator new(" << (int)size << ")\n";
void* address = ::calloc(size,1);
if (address == null)
{
#ifdef ALLEGRO_MESSAGE_AND_EXIT
ALLEGRO_MESSAGE_AND_EXIT(("Memory exhausted"));
#else
printf("*** Memory exhausted");
exit(EXIT_FAILURE);
#endif
}
unsigned int address_int = reinterpret_cast<unsigned int>(address);
unsigned int i = address_int % ARRAY_SIZE_PRIME_NUMBER;
Node* n = reinterpret_cast<Node*>(::malloc(sizeof(Node)));
ASSERT(n != null);
n->data = address;
n->next = dmm_array[i];
dmm_array[i] = n;
return address;
}
void operator delete (void* p)
{
if (p == null)
{
return;
}
unsigned int address_int = reinterpret_cast<unsigned int>(p);
unsigned int i = address_int % ARRAY_SIZE_PRIME_NUMBER;
Node* n_old = null;
//CHECKPOINT;
for (Node* n = dmm_array[i]; n != null; n = n->next)
{
void* q = n->data;
//CHECKPOINT;
if (q == p)
{
if (n_old == null)
{
dmm_array[i] = null;
}
else
{
n_old->next = n->next;
}
ASSERT(n != null);
::free(n);
//CHECKPOINT;
break;
}
//CHECKPOINT;
n_old = n;
}
//CHECKPOINT;
//dmp::cout << "*** Called operator delete(" << (int)address_int << ")\n";
::free(p);
//CHECKPOINT;
}
// Map map;
//
// void traverse(Node* node)
// {
// //BEGIN_FUNCTION();
// ASSERT(node != null);
// if (node->left != null)
// {
// //CHECKPOINT;
// traverse(node->left);
// }
// {
// int* addr = reinterpret_cast<int*>(node->key);
// int code = *(addr + 1);
// enum_debug_code edc = static_cast<enum_debug_code>(code);
// map.increment_key(edc);
// }
// if (node->right != null)
// {
// //CHECKPOINT;
// traverse(node->right);
// }
// //END_FUNCTION();
// }
//
// void debug_dmm_print()
// {
// //BEGIN_FUNCTION();
// //Bst::debug_print();
// cout << "*** depth=" << Bst::debug_depth() << '\n';
// if (Bst::root != null)
// {
// traverse(Bst::root);
// }
// map.print();
// //END_FUNCTION();
// exit(EXIT_SUCCESS);
// }
#undef DCODE_CASE
#define DCODE_CASE(var) case dmp::var: return #var;
const char* dmm_decode(dmp::enum_debug_code code)
{
switch (code)
{
DCODE_CASE(DCODE_GENERIC);
DCODE_CASE(DCODE_BOOLEAN);
DCODE_CASE(DCODE_INTEGER);
DCODE_CASE(DCODE_QUICK);
DCODE_CASE(DCODE_FLOAT);
DCODE_CASE(DCODE_DOUBLE);
DCODE_CASE(DCODE_STRING);
DCODE_CASE(DCODE_XYI);
DCODE_CASE(DCODE_XYQ);
DCODE_CASE(DCODE_XYD);
DCODE_CASE(DCODE_V3I);
DCODE_CASE(DCODE_V3Q);
DCODE_CASE(DCODE_V3D);
DCODE_CASE(DCODE_BITMAP);
DCODE_CASE(DCODE_SAMPLE);
DCODE_CASE(DCODE_GULPER);
DCODE_CASE(DCODE_LIST);
DCODE_CASE(DCODE_LIST_NODE);
DCODE_CASE(DCODE_LIST_ITERATOR);
DCODE_CASE(DCODE_ARRAY);
DCODE_CASE(DCODE_MENU_BUTTON);
DCODE_CASE(DCODE_MENU_LIST);
DCODE_CASE(DCODE_SPRITE);
DCODE_CASE(DCODE_SPRITE_2);
DCODE_CASE(DCODE_SPRITE_GRABBER_ACTION);
DCODE_CASE(DCODE_SPRITE_EDITOR_RECT);
DCODE_CASE(DCODE_WIDGET);
DCODE_CASE(DCODE_FILE);
DCODE_CASE(DCODE_TRI_RANDOM_OUTER);
DCODE_CASE(DCODE_TRI_INPUT_DEVICE);
DCODE_CASE(DCODE_TRI_PLAYER);
DCODE_CASE(DCODE_TRI_PONG_FADER);
DCODE_CASE(DCODE_TRI_PONG_BALL);
DCODE_CASE(DCODE_TRI_SLIMER);
DCODE_CASE(DCODE_TRI_STRATEGY);
DCODE_CASE(DCODE_TRI_TRICKS_NODE);
DCODE_CASE(DCODE_TRI_TRICKS);
DCODE_CASE(DCODE_TRI_PAIR);
DCODE_CASE(DCODE_R4_SAVE);
DCODE_CASE(DCODE_X1);
DCODE_CASE(DCODE_X2);
DCODE_CASE(DCODE_Y1);
DCODE_CASE(DCODE_Y2);
DCODE_CASE(DCODE_BOARD);
}
return "<Unknown>";
}
#endif /* DMM_ONLINE */
| Back |