17 #include <libbdilog.h>
18 #include <new_strdup.h>
19 #include <bdiDataTracker.h>
20 #include <bdi_macros.h>
22 #define CLASS_NAME_AS_STRING(x) xCLASS_NAME_AS_STRING(x)
23 #define xCLASS_NAME_AS_STRING(x) #x
25 #ifdef LIBBDIOBJECT_ARRAY_INLINE
26 #define BDI_INLINE inline
38 data_tracker(new bdiDataTracker())
54 bdi_log_printf(BDI_LOG_ERROR,
55 "ERROR: Array out of memory trying to allocate %d objects.\n",
105 for (i = 0; i <
size; i++)
348 for (i = 0; i <
size; i++)
373 #ifdef LIBBDIOBJECT_ARRAY_DISABLE_BOUNDS_CHECKING
383 bdi_log_printf(BDI_LOG_WARN,
"WARNING: Index %d out of bounds in %s; legal indices are %d to %d.\n",
404 #ifdef LIBBDIOBJECT_ARRAY_DISABLE_BOUNDS_CHECKING
414 bdi_log_printf(BDI_LOG_WARN,
"WARNING: Index %d out of bounds in %s; legal indices are %d to %d.\n",
454 BDI_ASSERT_AND_RET_IF_NULL(indices);
461 for (i = 0; i < src.
size(); i++)
471 unsigned int htsize = 2;
472 while (htsize < (2 * (
unsigned int)
m_num_objects)) htsize <<= 1;
479 int *htvals =
new int[htsize];
480 for (i = 0; i < htsize; i++)
486 unsigned int total_search = 0;
487 unsigned int longest_search = 0;
494 unsigned int h1 = ((
unsigned int)(lookfor -
m_objects[0])) % htsize;
495 unsigned int h2 = (((
unsigned int)(lookfor -
m_objects[0])) * 2 + 1) % htsize;
496 for (i = 0; i <= htsize; i++)
498 j = (h1 + i * h2) % htsize;
504 else if (
m_objects[htvals[j]] == lookfor)
513 if (i > longest_search)
521 bdi_log_printf(BDI_LOG_DEBUG_LV6,
"libbdiobject_array::get_indices: n = %d, m = %u, total = %u, longest = %u, avg = %g\n",
522 m_num_objects, htsize, total_search, longest_search, m_num_objects ? (((
double)total_search) / m_num_objects) : 0.0);
527 for (k = 0; k < nk; k++)
530 unsigned int h1 = ((
unsigned int)(lookfor -
m_objects[0])) % htsize;
531 unsigned int h2 = (((
unsigned int)(lookfor -
m_objects[0])) * 2 + 1) % htsize;
533 for (i = 0; i <= htsize; i++)
535 j = (h1 + i * h2) % htsize;
536 if ((
m_objects[htvals[j]] == lookfor) || (htvals[j] == -1))
538 indices[k] = htvals[j];
553 BDI_ASSERT_AND_RET_IF_NULL(indices);
560 for (i = 0; i < src.
size(); i++)
562 indices[i] = (
unsigned short)
get_index(src[i]);
570 unsigned int htsize = 2;
571 while (htsize < (2 * (
unsigned int)
m_num_objects)) htsize <<= 1;
578 int *htvals =
new int[htsize];
579 for (i = 0; i < htsize; i++)
585 unsigned int total_search = 0;
586 unsigned int longest_search = 0;
593 unsigned int h1 = ((
unsigned int)(lookfor -
m_objects[0])) % htsize;
594 unsigned int h2 = (((
unsigned int)(lookfor -
m_objects[0])) * 2 + 1) % htsize;
595 for (i = 0; i <= htsize; i++)
597 j = (h1 + i * h2) % htsize;
603 else if (
m_objects[htvals[j]] == lookfor)
612 if (i > longest_search)
620 bdi_log_printf(BDI_LOG_DEBUG_LV6,
"libbdiobject_array::get_indices: n = %d, m = %u, total = %u, longest = %u, avg = %g\n",
621 m_num_objects, htsize, total_search, longest_search, m_num_objects ? (((
double)total_search) / m_num_objects) : 0.0);
626 for (k = 0; k < nk; k++)
629 unsigned int h1 = ((
unsigned int)(lookfor -
m_objects[0])) % htsize;
630 unsigned int h2 = (((
unsigned int)(lookfor -
m_objects[0])) * 2 + 1) % htsize;
631 indices[k] = (
unsigned short)-1;
632 for (i = 0; i <= htsize; i++)
634 j = (h1 + i * h2) % htsize;
635 if ((
m_objects[htvals[j]] == lookfor) || (htvals[j] == -1))
637 indices[k] = (
unsigned short)htvals[j];
668 bdi_log_printf(BDI_LOG_ERROR,
"ERROR: %s %d Out of memory.\n",
683 memset(&
m_objects[old_num_objects_allocated],
690 delete[] old_objects;
711 bdi_log_printf(BDI_LOG_ERROR,
"ERROR: %s %d Out of memory.\n",
731 for (i = new_num_objects; i < old_num_objects; i++)
734 delete[] old_objects[i];
736 delete old_objects[i];
743 delete[] old_objects;
782 bdi_log_printf(BDI_LOG_ERROR,
"ERROR: %s %d Out of memory.\n",
790 if (old_num_objects_allocated > 0)
795 memset(&
m_objects[old_num_objects_allocated],
802 delete[] old_objects;
827 if (name && (strlen(name) > 0))
828 m_name = new_strdup(name);
834 #ifdef LIBBDIOBJECT_ARRAY_DEEP_COPY
846 for (i = 0; i < rhs.
size(); i++)
855 #endif // LIBBDIOBJECT_ARRAY_DEEP_COPY
858 #ifdef LIBBDIOBJECT_ARRAY_PACKABLE
862 LIBBDIOBJECT_ARRAY_CLASS_NAME::create_cfg_entry(bdiCfgEntry *e,
const char * array_name)
867 bdiCfgEntry* sub_ent =
new bdiCfgEntry(array_name,
"");
869 for (i = 0; i <
size(); i++)
871 bdiCfgEntryLine * l =
new bdiCfgEntryLine(
"value");
873 sub_ent->add_line(l);
877 e->add_subentry(sub_ent);
885 LIBBDIOBJECT_ARRAY_CLASS_NAME::parse_cfg_entry(bdiCfgEntry *e)
891 for (i = 0; i < e->get_num_lines(); i++)
893 bdiCfgEntryLine * l = e->get_line(i);
897 new_object->pack_unpack(0, l);
903 #endif // LIBBDIOBJECT_ARRAY_PACKABLE
906 #ifdef LIBBDIOBJECT_ARRAY_PACKABLE_SUBENTRIES
910 LIBBDIOBJECT_ARRAY_CLASS_NAME::create_cfg_entry(bdiCfgEntry *e,
const char * array_name)
915 bdiCfgEntry* sub_ent =
new bdiCfgEntry(array_name,
"keys");
917 for (i = 0; i <
size(); i++)
919 bdiCfgEntry * l =
new bdiCfgEntry(
"value",
"");
921 sub_ent->add_subentry(l);
925 e->add_subentry(sub_ent);
933 LIBBDIOBJECT_ARRAY_CLASS_NAME::parse_cfg_entry(bdiCfgEntry *e)
939 for (i = 0; i < e->get_num_subentries(); i++)
941 bdiCfgEntry * l = e->get_subentry(i);
945 new_object->pack_unpack(0, l);
951 #endif // LIBBDIOBJECT_ARRAY_PACKABLE_SUBENTRIES
958 retval +=
sizeof(*this);
973 #ifdef LIBBDIOBJECT_GET_MEMORY_USAGE
977 retval +=
m_objects[i]->get_memory_usage();
LIBBDIOBJECT_ARRAY_TYPE ** m_objects
Definition: libbdiobject_array_declaration_template.h:324
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * remove(LIBBDIOBJECT_ARRAY_TYPE *object)
Definition: libbdiobject_array_definition_template.h:304
bdiDataTracker * data_tracker
Definition: libbdiobject_array_declaration_template.h:294
virtual size_t get_memory_usage()
Definition: libbdiobject_array_definition_template.h:955
#define BDI_INLINE
Definition: libbdiobject_array_definition_template.h:28
virtual size_t get_children_memory_usage()
Definition: libbdiobject_array_definition_template.h:969
int m_geometric_growth
Definition: libbdiobject_array_declaration_template.h:356
BDI_INLINE LIBBDIOBJECT_ARRAY_CLASS_NAME(int initial_size=16, int increment=16)
Definition: libbdiobject_array_definition_template.h:35
BDI_INLINE int resize_allocation(int num_objects)
Definition: libbdiobject_array_definition_template.h:649
voidpf void uLong size
Definition: ioapi.h:39
BDI_INLINE int size(void) const
Definition: libbdiobject_array_declaration_template.h:178
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * operator[](int index) const
Definition: libbdiobject_array_definition_template.h:401
BDI_INLINE int push_back(LIBBDIOBJECT_ARRAY_TYPE *object)
Definition: libbdiobject_array_definition_template.h:145
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * replace_at_index(int index, LIBBDIOBJECT_ARRAY_TYPE *object)
Definition: libbdiobject_array_definition_template.h:166
Definition: libbdiobject_array_declaration_template.h:40
int m_pop_back_delete
Definition: libbdiobject_array_declaration_template.h:341
BDI_INLINE int remove_all(void)
Definition: libbdiobject_array_definition_template.h:327
BDI_INLINE int get_index(LIBBDIOBJECT_ARRAY_TYPE *object) const
Definition: libbdiobject_array_definition_template.h:432
#define CLASS_NAME_AS_STRING(x)
Definition: libbdiobject_array_definition_template.h:22
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * pop_back(void)
Definition: libbdiobject_array_definition_template.h:230
#define LIBBDIOBJECT_ARRAY_TYPE
Definition: DtFxCollisionObject.h:138
char * m_name
Definition: libbdiobject_array_declaration_template.h:346
int m_num_objects_allocated
Definition: libbdiobject_array_declaration_template.h:318
BDI_INLINE void set_name(const char *name)
Definition: libbdiobject_array_definition_template.h:819
BDI_INLINE const char * get_name(void) const
Definition: libbdiobject_array_definition_template.h:811
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * remove_at_index(int index)
Definition: libbdiobject_array_definition_template.h:248
BDI_INLINE int push_front(LIBBDIOBJECT_ARRAY_TYPE *object)
Definition: libbdiobject_array_definition_template.h:137
int m_num_objects
Definition: libbdiobject_array_declaration_template.h:313
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * get_at_index(int index) const
Definition: libbdiobject_array_definition_template.h:370
int m_own_objects
Definition: libbdiobject_array_declaration_template.h:330
BDI_INLINE void get_indices(int *indices, const LIBBDIOBJECT_ARRAY_CLASS_NAME &src) const
Definition: libbdiobject_array_definition_template.h:451
BDI_INLINE void get_ushort_indices(unsigned short *indices, const LIBBDIOBJECT_ARRAY_CLASS_NAME &src) const
Definition: libbdiobject_array_definition_template.h:550
int m_increment
Definition: libbdiobject_array_declaration_template.h:351
BDI_INLINE int insert_at_index(int index, LIBBDIOBJECT_ARRAY_TYPE *object)
Definition: libbdiobject_array_definition_template.h:185
int m_array_delete
Definition: libbdiobject_array_declaration_template.h:336
BDI_INLINE LIBBDIOBJECT_ARRAY_TYPE * pop_front(void)
Definition: libbdiobject_array_definition_template.h:222
virtual BDI_INLINE ~LIBBDIOBJECT_ARRAY_CLASS_NAME()
Definition: libbdiobject_array_definition_template.h:82
BDI_INLINE int delete_at_index(int index)
Definition: libbdiobject_array_definition_template.h:279
BDI_INLINE int check_object_allocation(int min_objects)
Definition: libbdiobject_array_definition_template.h:750