@ -28,29 +28,29 @@
# define HASH_ENTRY_CHUNK_SIZE 128
# define HASH_ENTRY_CHUNK_SIZE 128
static void _updateHashSize ( DYNTYPE_HASH _ this) ;
static void _updateHashSize ( DYNTYPE_HASH this ) ;
INIT_CC LASS ( DYNTYPE_HASH ) ;
INIT_CLASS ( DYNTYPE_HASH ) ;
__construct ( DYNTYPE_HASH )
__construct ( DYNTYPE_HASH )
{
{
_ this- > size = 0 ;
_ this- > used = 0 ;
_updateHashSize ( _ this) ;
this - > size = 0 ;
this - > used = 0 ;
_updateHashSize ( this ) ;
}
}
# undef __construct
# undef __construct
__jsonConst ( DYNTYPE_HASH )
__jsonConst ( DYNTYPE_HASH )
{
{
__construct ( _ this, NULL ) ;
__construct ( this , NULL ) ;
if ( json_type_object ! = json_object_get_type ( json ) ) {
if ( json_type_object ! = json_object_get_type ( json ) ) {
return ;
return ;
}
}
json_object_object_foreach ( json , key , value ) {
json_object_object_foreach ( json , key , value ) {
dyntype_hash_set ( _ this, key , newFromJson ( DYNTYPE , value ) ) ;
dyntype_hash_set ( this , key , newFromJson ( DYNTYPE , value ) ) ;
}
}
}
}
@ -60,16 +60,16 @@ __destruct(DYNTYPE_HASH)
{
{
size_t index ;
size_t index ;
for ( index = 0 ; index < _ this- > used ; index + + ) {
free ( _ this- > keys [ index ] ) ;
delete ( _ this- > values [ index ] ) ;
for ( index = 0 ; index < this - > used ; index + + ) {
free ( this - > keys [ index ] ) ;
delete ( this - > values [ index ] ) ;
}
}
free ( _ this- > keys ) ;
free ( _ this- > values ) ;
free ( this - > keys ) ;
free ( this - > values ) ;
_ this- > size = _ this- > used = 0 ;
_updateHashSize ( _ this) ;
this - > size = this - > used = 0 ;
_updateHashSize ( this ) ;
}
}
__toJson ( DYNTYPE_HASH )
__toJson ( DYNTYPE_HASH )
@ -77,31 +77,31 @@ __toJson(DYNTYPE_HASH)
size_t index ;
size_t index ;
* json = json_object_new_object ( ) ;
* json = json_object_new_object ( ) ;
for ( index = 0 ; index < _ this- > used ; index + + ) {
for ( index = 0 ; index < this - > used ; index + + ) {
struct json_object * values ;
struct json_object * values ;
toJson ( _ this- > values [ index ] , & values ) ;
toJson ( this - > values [ index ] , & values ) ;
json_object_object_add ( * json , _ this- > keys [ index ] , values ) ;
json_object_object_add ( * json , this - > keys [ index ] , values ) ;
}
}
}
}
static
static
void
void
_updateHashSize ( DYNTYPE_HASH _ this)
_updateHashSize ( DYNTYPE_HASH this )
{
{
if ( _ this- > used = = _ this- > size ) {
_ this- > size + = HASH_ENTRY_CHUNK_SIZE ;
if ( this - > used = = this - > size ) {
this - > size + = HASH_ENTRY_CHUNK_SIZE ;
_ this- > keys = realloc ( _ this- > keys , sizeof ( char * ) * _ this- > size ) ;
memset ( _ this- > keys + ( _ this- > used * sizeof ( char * ) ) ,
this - > keys = realloc ( this - > keys , sizeof ( char * ) * this - > size ) ;
memset ( this - > keys + ( this - > used * sizeof ( char * ) ) ,
0 ,
0 ,
HASH_ENTRY_CHUNK_SIZE * sizeof ( char * ) ) ;
HASH_ENTRY_CHUNK_SIZE * sizeof ( char * ) ) ;
_ this- > values = realloc (
_ this- > values ,
sizeof ( DYNTYPE ) * _ this- > size ) ;
memset ( _ this- > values + ( _ this- > used * sizeof ( DYNTYPE ) ) ,
this - > values = realloc (
this - > values ,
sizeof ( DYNTYPE ) * this - > size ) ;
memset ( this - > values + ( this - > used * sizeof ( DYNTYPE ) ) ,
0 ,
0 ,
HASH_ENTRY_CHUNK_SIZE * sizeof ( DYNTYPE ) ) ;
HASH_ENTRY_CHUNK_SIZE * sizeof ( DYNTYPE ) ) ;
}
}
@ -109,66 +109,66 @@ _updateHashSize(DYNTYPE_HASH _this)
static
static
size_t
size_t
_getHashIdx ( DYNTYPE_HASH _ this, const char * key )
_getHashIdx ( DYNTYPE_HASH this , const char * key )
{
{
size_t index ;
size_t index ;
for ( index = 0 ;
for ( index = 0 ;
index < _ this- > used & & strcmp ( _ this- > keys [ index ] , key ) ;
index < this - > used & & strcmp ( this - > keys [ index ] , key ) ;
index + + ) ;
index + + ) ;
return index ;
return index ;
}
}
void
void
dyntype_hash_set ( DYNTYPE_HASH _ this, const char * key , DYNTYPE value )
dyntype_hash_set ( DYNTYPE_HASH this , const char * key , DYNTYPE value )
{
{
size_t index = _getHashIdx ( _ this, key ) ;
size_t index = _getHashIdx ( this , key ) ;
_ this- > keys [ index ] = calloc ( strlen ( key ) + 1 , sizeof ( char ) ) ;
memcpy ( _ this- > keys [ index ] , key , strlen ( key ) ) ;
this - > keys [ index ] = calloc ( strlen ( key ) + 1 , sizeof ( char ) ) ;
memcpy ( this - > keys [ index ] , key , strlen ( key ) ) ;
_ this- > values [ index ] = value ;
this - > values [ index ] = value ;
if ( index = = _ this- > used ) {
_ this- > used + = 1 ;
if ( index = = this - > used ) {
this - > used + = 1 ;
}
}
_updateHashSize ( _ this) ;
_updateHashSize ( this ) ;
}
}
DYNTYPE
DYNTYPE
dyntype_hash_get ( DYNTYPE_HASH _ this, const char * key )
dyntype_hash_get ( DYNTYPE_HASH this , const char * key )
{
{
size_t index = _getHashIdx ( _ this, key ) ;
size_t index = _getHashIdx ( this , key ) ;
if ( index = = _ this- > used ) {
if ( index = = this - > used ) {
return NULL ;
return NULL ;
}
}
return _ this- > values [ index ] ;
return this - > values [ index ] ;
}
}
void
void
dyntype_hash_del ( DYNTYPE_HASH _ this, const char * key )
dyntype_hash_del ( DYNTYPE_HASH this , const char * key )
{
{
size_t index = _getHashIdx ( _ this, key ) ;
size_t index = _getHashIdx ( this , key ) ;
if ( index = = _ this- > used ) {
return NULL ;
if ( index = = this - > used ) {
return ;
}
}
free ( _ this- > keys [ index ] ) ;
free ( this - > keys [ index ] ) ;
memmove ( _ this- > keys + index + 1 ,
_ this- > keys + index ,
( _ this- > size - index ) * sizeof ( char * ) ) ;
memmove ( this - > keys + index + 1 ,
this - > keys + index ,
( this - > size - index ) * sizeof ( char * ) ) ;
memmove ( _ this- > values + index + 1 ,
_ this- > values + index ,
( _ this- > size - index ) * sizeof ( DYNTYPE ) ) ;
memmove ( this - > values + index + 1 ,
this - > values + index ,
( this - > size - index ) * sizeof ( DYNTYPE ) ) ;
_ this- > used - = 1 ;
this - > used - = 1 ;
}
}
/ / vim : set et ts = 4 sw = 4 :
/ / vim : set et ts = 4 sw = 4 :