Exports typeadapter which allows containers in the data store to manage the lifetime of stored objects or to compare objects and keys.
This program is free software. You can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
© 2012 Jörg Seebohn
Header file Typeadapt.
Implementation file Typeadapt impl.
typedef struct typeadapt_t typeadapt_t
Export typeadapt_t into global namespace.
typedef struct typeadapt_member_t typeadapt_member_t
Export typeadapt_member_t into global namespace.
test | |
unittest_ds_typeadapt | Test typeadapt_t functionality. |
int unittest_ds_typeadapt( void )
Test typeadapt_t functionality.
struct typeadapt_member_t
Relates typeadapt_nodeoffset_t with typeadapt_t. With this object it is possible to call services on a pointer. The pointer needs not point to the start address of the object but could point to any struct member. The variable nodeoff stores the information to cast the pointer into the generic type typeadapt_object_t which is used to tag any object type.
typeadapt_t * typeadp
Pointer to typeadapt_t.
typeadapt_nodeoffset_t nodeoff
Stores typeadapt_nodeoffset_t.
bool isequal_typeadaptmember( const typeadapt_member_t * ltypeadp, const typeadapt_member_t * rtypeadp )
Returns true if both typeadapt_member_ts are equal.
int calldelete_typeadaptmember( typeadapt_member_t * nodeadp, ... )
See calldelete_typeadapt.
int callcmpobj_typeadaptmember( typeadapt_member_t * nodeadp, ... )
See callcmpobj_typeadapt.
struct typeadapt_t
Interface to services needed by containers in the data store. With this interface you adapt any type to be manageable by containers in the data store.
typeadapt_comparator_it comparator
Interface to adapt comparison of key and object. See typeadapt_comparator_it.
typeadapt_gethash_it gethash
Interface to adapt reading of a hash value. See typeadapt_gethash_it.
typeadapt_getkey_it getkey
Interface to adapt reading of a key as binary data. See typeadapt_getkey_it.
typeadapt_lifetime_it lifetime
Interface to adapt the lifetime of an object type. See typeadapt_lifetime_it.
#define typeadapt_INIT_LIFETIME( newcopyobj_f, deleteobj_f ) { typeadapt_comparator_FREE, typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer. Uses <typeadapt_lifetime_INIT> to init interface typeadapt_t.lifetime.
#define typeadapt_INIT_CMP( cmpkeyobj_f, cmpobj_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_FREE }
Static initializer. Uses <typeadapt_comparator_INIT> to init interface typeadapt_t.comparator.
#define typeadapt_INIT_LIFECMP( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer. Initializes typeadapt_t.lifetime and typeadapt_t.comparator service interfaces.
#define typeadapt_INIT_LIFEKEY( newcopyobj_f, deleteobj_f, getbinarykey_f ) { typeadapt_comparator_FREE, typeadapt_gethash_FREE, typeadapt_getkey_INIT(getbinarykey_f), typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer. Initializes typeadapt_t.lifetime and typeadapt_t.getkey service interfaces.
#define typeadapt_INIT_LIFECMPKEY( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f, getbinarykey_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_FREE, typeadapt_getkey_INIT(getbinarykey_f), typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer. Initializes typeadapt_t.lifetime, typeadapt_t.comparator, and typeadapt_t.getkey service interfaces.
#define typeadapt_INIT_LIFECMPHASH( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f, hashobject_f, hashkey_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_INIT(hashobject_f, hashkey_f), typeadapt_getkey_FREE, typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer. Initializes typeadapt_t.lifetime, typeadapt_t.comparator, and typeadapt_t.gethash service interfaces.
#define typeadapt_INIT_LIFECMPHASHKEY( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f, hashobject_f, hashkey_f, getbinarykey_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_INIT(hashobject_f, hashkey_f), typeadapt_getkey_INIT(getbinarykey_f), typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer. Initializes typeadapt_t.lifetime, typeadapt_t.comparator, typeadapt_t.gethash, and typeadapt_t.getkey service interfaces.
bool isequal_typeadapt( const typeadapt_t * ltypeadp, const typeadapt_t * rtypeadp )
Returns true if both typeadapt_t are equal.
bool iscalldelete_typeadapt( const typeadapt_t * typeadp )
Returns true if typeadapt_lifetime_it.delete_object is not NULL.
int callnewcopy_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callnewcopy_typeadaptlifetime.
int calldelete_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call calldelete_typeadaptlifetime.
int callcmpkeyobj_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callcmpkeyobj_typeadaptcomparator.
int callcmpobj_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callcmpobj_typeadaptcomparator.
int callhashobject_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callhashobject_typeadaptgethash.
int callhashkey_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callhashkey_typeadaptgethash.
int callgetbinarykey_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callgetbinarykey_typeadaptgetkey.
typeadapt_t * genericcast_typeadapt( void * typeadp, TYPENAME testadapter_t, TYPENAME object_t )
Casts parameter typeadp into pointer to typeadapt_t. The parameter typeadp has to be of type “pointer to type” that embeds the generic public interface with typeadapt_EMBED as first member.
void typeadapt_DECLARE( TYPENAME typeadapter_t, TYPENAME object_t, TYPENAME key_t )
Declares a derived interface from generic typeadapt_t. It is structural compatible with typeadapt_t. See typeadapt_t for a list of embedded services.
typeadapter_t | The name of the structure which is declared as the interface. The first parameter of every function is a also pointer to this type. |
object_t | The object type that <typeadapter_t> supports. |
key_t | The key type that typeadapt_t supports. Must be of size sizeof(void*). |
void typeadapt_EMBED( TYPENAME typeadapter_t, TYPENAME object_t, TYPENAME key_t )
Embeds the public interface part from generic typeadapt_t. It is structural compatible with typeadapt_t. See typeadapt_t for a list of embedded services.
typeadapter_t | The adapter type which implements all interface functions. The first parameter in every function is a pointer to this type. |
object_t | The object type that <typeadapter_t> supports. |
key_t | The key type that typeadapt_t supports. Must be of size sizeof(void*). |
#define genericcast_typeadapt( typeadp, typeadapter_t, object_t, key_t ) ( __extension__ ({ static_assert( offsetof(typeof(*(typeadp)), comparator) == offsetof(typeadapt_t, comparator) && offsetof(typeof(*(typeadp)), gethash) == offsetof(typeadapt_t, gethash) && offsetof(typeof(*(typeadp)), getkey) == offsetof(typeadapt_t, getkey) && offsetof(typeof(*(typeadp)), lifetime) == offsetof(typeadapt_t, lifetime), "ensure same structure") ; if (0) { (void) genericcast_typeadaptcomparator((typeof((typeadp)->comparator)*)0, typeadapter_t, object_t, key_t) ; (void) genericcast_typeadaptgethash((typeof((typeadp)->gethash)*)0, typeadapter_t, object_t, key_t) ; (void) genericcast_typeadaptgetkey((typeof((typeadp)->getkey)*)0, typeadapter_t, object_t) ; (void) genericcast_typeadaptlifetime((typeof((typeadp)->lifetime)*)0, typeadapter_t, object_t) ; } (typeadapt_t*) (typeadp) ; }))
Implements typeadapt_t.genericcast_typeadapt.
#define callcmpkeyobj_typeadapt( typeadp, ... ) callcmpkeyobj_typeadaptcomparator(&(typeadp)->comparator, typeadp, __VA_ARGS__)
Implements typeadapt_t.callcmpkeyobj_typeadapt.
#define callcmpkeyobj_typeadaptmember( nodeadp, ... ) callcmpkeyobj_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callcmpkeyobj_typeadaptmember.
#define callcmpobj_typeadapt( typeadp, ... ) callcmpobj_typeadaptcomparator(&(typeadp)->comparator, typeadp, __VA_ARGS__)
Implements typeadapt_t.callcmpobj_typeadapt.
#define callcmpobj_typeadaptmember( nodeadp, ... ) callcmpobj_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callcmpobj_typeadaptmember.
#define calldelete_typeadapt( typeadp, ... ) calldelete_typeadaptlifetime(&(typeadp)->lifetime, typeadp, __VA_ARGS__)
Implements typeadapt_t.calldelete_typeadapt.
#define calldelete_typeadaptmember( nodeadp, ... ) calldelete_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.calldelete_typeadaptmember.
#define callgetbinarykey_typeadapt( typeadp, ... ) callgetbinarykey_typeadaptgetkey(&(typeadp)->getkey, typeadp, __VA_ARGS__)
Implements typeadapt_t.callgetbinarykey_typeadapt.
#define callgetbinarykey_typeadaptmember( nodeadp, ... ) callgetbinarykey_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callgetbinarykey_typeadaptmember.
#define callhashkey_typeadapt( typeadp, ... ) callhashkey_typeadaptgethash(&(typeadp)->gethash, typeadp, __VA_ARGS__)
Implements typeadapt_t.callhashkey_typeadapt.
#define callhashkey_typeadaptmember( nodeadp, ... ) callhashkey_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callhashkey_typeadaptmember.
#define callhashobject_typeadapt( typeadp, ... ) callhashobject_typeadaptgethash(&(typeadp)->gethash, typeadp, __VA_ARGS__)
Implements typeadapt_t.callhashobject_typeadapt.
#define callhashobject_typeadaptmember( nodeadp, ... ) callhashobject_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callhashobject_typeadaptmember.
#define callnewcopy_typeadapt( typeadp, ... ) callnewcopy_typeadaptlifetime(&(typeadp)->lifetime, typeadp, __VA_ARGS__)
Implements typeadapt_t.callnewcopy_typeadapt.
#define callnewcopy_typeadaptmember( nodeadp, ... ) callnewcopy_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callnewcopy_typeadaptmember.
#define iscalldelete_typeadapt( typeadp ) (0 != (typeadp)->lifetime.delete_object)
Implements typeadapt_t.iscalldelete_typeadapt.
#define memberasobject_typeadaptmember( nodeadp, node ) memberasobject_typeadaptnodeoffset((nodeadp)->nodeoff, node)
Imeplements typeadapt_member_t.memberasobject_typeadaptmember.
#define objectasmember_typeadaptmember( nodeadp, object ) objectasmember_typeadaptnodeoffset((nodeadp)->nodeoff, object)
Imeplements typeadapt_member_t.objectasmember_typeadaptmember.
#define typeadapt_EMBED( typeadapter_t, object_t, key_t ) struct { typeadapt_comparator_EMBED(typeadapter_t, object_t, key_t) ; } comparator ; struct { typeadapt_gethash_EMBED(typeadapter_t, object_t, key_t) ; } gethash ; struct { typeadapt_getkey_EMBED(typeadapter_t, object_t) ; } getkey ; struct { typeadapt_lifetime_EMBED(typeadapter_t, object_t) ; } lifetime
Implements typeadapt_t.typeadapt_EMBED.
#define typeadapt_DECLARE( typeadapter_t, object_t, key_t ) typedef struct typeadapter_t typeadapter_t ; struct typeadapter_t { typeadapt_EMBED(typeadapter_t, object_t, key_t) ; }
Implements typeadapt_t.typeadapt_DECLARE.
Export typeadapt_t into global namespace.
typedef struct typeadapt_t typeadapt_t
Interface to services needed by containers in the data store.
struct typeadapt_t
Export typeadapt_member_t into global namespace.
typedef struct typeadapt_member_t typeadapt_member_t
Declares abstract object type.
typedef struct typeadapt_object_t typeadapt_object_t
Test typeadapt_t functionality.
int unittest_ds_typeadapt( void )
Describes an offset to a struct member.
typedef uint16_t typeadapt_nodeoffset_t
Pointer to typeadapt_t.
typeadapt_t * typeadp
Stores typeadapt_nodeoffset_t.
typeadapt_nodeoffset_t nodeoff
Static initializer.
#define typeadapt_member_INIT( typeadp, nodeoffset ) { typeadp, typeadapt_nodeoffset_INIT(nodeoffset) }
Static initializer.
#define typeadapt_member_FREE typeadapt_member_INIT( 0, )
Returns true if both typeadapt_member_ts are equal.
bool isequal_typeadaptmember( const typeadapt_member_t * ltypeadp, const typeadapt_member_t * rtypeadp )
See callnewcopy_typeadapt.
int callnewcopy_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.callnewcopy_typeadapt.
#define callnewcopy_typeadapt( typeadp, ... ) callnewcopy_typeadaptlifetime(&(typeadp)->lifetime, typeadp, __VA_ARGS__)
See calldelete_typeadapt.
int calldelete_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.calldelete_typeadapt.
#define calldelete_typeadapt( typeadp, ... ) calldelete_typeadaptlifetime(&(typeadp)->lifetime, typeadp, __VA_ARGS__)
See callcmpkeyobj_typeadapt.
int callcmpkeyobj_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.callcmpkeyobj_typeadapt.
#define callcmpkeyobj_typeadapt( typeadp, ... ) callcmpkeyobj_typeadaptcomparator(&(typeadp)->comparator, typeadp, __VA_ARGS__)
See callcmpobj_typeadapt.
int callcmpobj_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.callcmpobj_typeadapt.
#define callcmpobj_typeadapt( typeadp, ... ) callcmpobj_typeadaptcomparator(&(typeadp)->comparator, typeadp, __VA_ARGS__)
See callhashobject_typeadapt.
int callhashobject_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.callhashobject_typeadapt.
#define callhashobject_typeadapt( typeadp, ... ) callhashobject_typeadaptgethash(&(typeadp)->gethash, typeadp, __VA_ARGS__)
See callhashkey_typeadapt.
int callhashkey_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.callhashkey_typeadapt.
#define callhashkey_typeadapt( typeadp, ... ) callhashkey_typeadaptgethash(&(typeadp)->gethash, typeadp, __VA_ARGS__)
See callgetbinarykey_typeadapt.
void callgetbinarykey_typeadaptmember( typeadapt_member_t * nodeadp, ... )
Implements typeadapt_t.callgetbinarykey_typeadapt.
#define callgetbinarykey_typeadapt( typeadp, ... ) callgetbinarykey_typeadaptgetkey(&(typeadp)->getkey, typeadp, __VA_ARGS__)
See memberasobject_typeadaptnodeoffset.
struct typeadapt_object_t * memberasobject_typeadaptmember( typeadapt_member_t * nodeadp, void * node )
Implements typeadapt_nodeoffset_t.memberasobject_typeadaptnodeoffset.
#define memberasobject_typeadaptnodeoffset( nodeoff, node ) ( __extension__ ({ uint32_t _off = (nodeoff); (struct typeadapt_object_t*) ( (uintptr_t)(node) - _off ); }))
See objectasmember_typeadaptnodeoffset.
void * objectasmember_typeadaptmember( typeadapt_member_t * nodeadp, struct typeadapt_object_t * object )
Implements typeadapt_nodeoffset_t.objectasmember_typeadaptnodeoffset.
#define objectasmember_typeadaptnodeoffset( nodeoff, object ) ( __extension__ ({ uint32_t _off = (nodeoff); (void*) ((uintptr_t)(object) + _off); }))
Interface to adapt comparison of key and object.
typeadapt_comparator_it comparator
Interface to adapt reading of a hash value.
typeadapt_gethash_it gethash
Interface to adapt reading of a key as binary data.
typeadapt_getkey_it getkey
Interface to adapt the lifetime of an object type.
typeadapt_lifetime_it lifetime
Static initializer.
#define typeadapt_FREE { typeadapt_comparator_FREE, typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_FREE }
Static initializer.
#define typeadapt_INIT_LIFETIME( newcopyobj_f, deleteobj_f ) { typeadapt_comparator_FREE, typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer.
#define typeadapt_INIT_CMP( cmpkeyobj_f, cmpobj_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_FREE }
Static initializer.
#define typeadapt_INIT_LIFECMP( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_FREE, typeadapt_getkey_FREE, typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer.
#define typeadapt_INIT_LIFEKEY( newcopyobj_f, deleteobj_f, getbinarykey_f ) { typeadapt_comparator_FREE, typeadapt_gethash_FREE, typeadapt_getkey_INIT(getbinarykey_f), typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer.
#define typeadapt_INIT_LIFECMPKEY( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f, getbinarykey_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_FREE, typeadapt_getkey_INIT(getbinarykey_f), typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer.
#define typeadapt_INIT_LIFECMPHASH( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f, hashobject_f, hashkey_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_INIT(hashobject_f, hashkey_f), typeadapt_getkey_FREE, typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Static initializer.
#define typeadapt_INIT_LIFECMPHASHKEY( newcopyobj_f, deleteobj_f, cmpkeyobj_f, cmpobj_f, hashobject_f, hashkey_f, getbinarykey_f ) { typeadapt_comparator_INIT(cmpkeyobj_f, cmpobj_f), typeadapt_gethash_INIT(hashobject_f, hashkey_f), typeadapt_getkey_INIT(getbinarykey_f), typeadapt_lifetime_INIT(newcopyobj_f, deleteobj_f) }
Returns true if both typeadapt_t are equal.
bool isequal_typeadapt( const typeadapt_t * ltypeadp, const typeadapt_t * rtypeadp )
Returns true if typeadapt_lifetime_it.delete_object is not NULL.
bool iscalldelete_typeadapt( const typeadapt_t * typeadp )
Function frees memory and associated resources of object.
int ( * delete_object ) (struct typeadapt_t * typeadp, struct typeadapt_object_t ** object)
Wrapper to call callnewcopy_typeadaptlifetime.
int callnewcopy_typeadapt( typeadapt_t * typeadp, ... )
Implements typeadapt_lifetime_it.callnewcopy_typeadaptlifetime.
#define callnewcopy_typeadaptlifetime( adplife, typeadp, destobject, srcobject ) ((adplife)->newcopy_object((typeadp), (destobject), (srcobject)))
Wrapper to call calldelete_typeadaptlifetime.
int calldelete_typeadapt( typeadapt_t * typeadp, ... )
Implements typeadapt_lifetime_it.calldelete_typeadaptlifetime.
#define calldelete_typeadaptlifetime( adplife, typeadp, object ) ((adplife)->delete_object((typeadp), (object)))
Wrapper to call callcmpkeyobj_typeadaptcomparator.
int callcmpkeyobj_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callcmpobj_typeadaptcomparator.
int callcmpobj_typeadapt( typeadapt_t * typeadp, ... )
Wrapper to call callhashobject_typeadaptgethash.
int callhashobject_typeadapt( typeadapt_t * typeadp, ... )
Implements typeadapt_gethash_it.callhashobject_typeadaptgethash.
#define callhashobject_typeadaptgethash( gethash, typeadp, node ) ((gethash)->hashobject((typeadp), (node)))
Wrapper to call callhashkey_typeadaptgethash.
int callhashkey_typeadapt( typeadapt_t * typeadp, ... )
Implements typeadapt_gethash_it.callhashkey_typeadaptgethash.
#define callhashkey_typeadaptgethash( gethash, typeadp, key ) ((gethash)->hashkey((typeadp), (key)))
Wrapper to call callgetbinarykey_typeadaptgetkey.
int callgetbinarykey_typeadapt( typeadapt_t * typeadp, ... )
Casts parameter typeadp into pointer to typeadapt_t.
typeadapt_t * genericcast_typeadapt( void * typeadp, TYPENAME testadapter_t, TYPENAME object_t )
Declares a derived interface from generic typeadapt_t.
void typeadapt_DECLARE( TYPENAME typeadapter_t, TYPENAME object_t, TYPENAME key_t )
Embeds the public interface part from generic typeadapt_t.
void typeadapt_EMBED( TYPENAME typeadapter_t, TYPENAME object_t, TYPENAME key_t )
Implements typeadapt_t.genericcast_typeadapt.
#define genericcast_typeadapt( typeadp, typeadapter_t, object_t, key_t ) ( __extension__ ({ static_assert( offsetof(typeof(*(typeadp)), comparator) == offsetof(typeadapt_t, comparator) && offsetof(typeof(*(typeadp)), gethash) == offsetof(typeadapt_t, gethash) && offsetof(typeof(*(typeadp)), getkey) == offsetof(typeadapt_t, getkey) && offsetof(typeof(*(typeadp)), lifetime) == offsetof(typeadapt_t, lifetime), "ensure same structure") ; if (0) { (void) genericcast_typeadaptcomparator((typeof((typeadp)->comparator)*)0, typeadapter_t, object_t, key_t) ; (void) genericcast_typeadaptgethash((typeof((typeadp)->gethash)*)0, typeadapter_t, object_t, key_t) ; (void) genericcast_typeadaptgetkey((typeof((typeadp)->getkey)*)0, typeadapter_t, object_t) ; (void) genericcast_typeadaptlifetime((typeof((typeadp)->lifetime)*)0, typeadapter_t, object_t) ; } (typeadapt_t*) (typeadp) ; }))
Implements typeadapt_member_t.callcmpkeyobj_typeadaptmember.
#define callcmpkeyobj_typeadaptmember( nodeadp, ... ) callcmpkeyobj_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callcmpobj_typeadaptmember.
#define callcmpobj_typeadaptmember( nodeadp, ... ) callcmpobj_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.calldelete_typeadaptmember.
#define calldelete_typeadaptmember( nodeadp, ... ) calldelete_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callgetbinarykey_typeadaptmember.
#define callgetbinarykey_typeadaptmember( nodeadp, ... ) callgetbinarykey_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callhashkey_typeadaptmember.
#define callhashkey_typeadaptmember( nodeadp, ... ) callhashkey_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callhashobject_typeadaptmember.
#define callhashobject_typeadaptmember( nodeadp, ... ) callhashobject_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_member_t.callnewcopy_typeadaptmember.
#define callnewcopy_typeadaptmember( nodeadp, ... ) callnewcopy_typeadapt((nodeadp)->typeadp, __VA_ARGS__)
Implements typeadapt_t.iscalldelete_typeadapt.
#define iscalldelete_typeadapt( typeadp ) (0 != (typeadp)->lifetime.delete_object)
Imeplements typeadapt_member_t.memberasobject_typeadaptmember.
#define memberasobject_typeadaptmember( nodeadp, node ) memberasobject_typeadaptnodeoffset((nodeadp)->nodeoff, node)
Imeplements typeadapt_member_t.objectasmember_typeadaptmember.
#define objectasmember_typeadaptmember( nodeadp, object ) objectasmember_typeadaptnodeoffset((nodeadp)->nodeoff, object)
Implements typeadapt_t.typeadapt_EMBED.
#define typeadapt_EMBED( typeadapter_t, object_t, key_t ) struct { typeadapt_comparator_EMBED(typeadapter_t, object_t, key_t) ; } comparator ; struct { typeadapt_gethash_EMBED(typeadapter_t, object_t, key_t) ; } gethash ; struct { typeadapt_getkey_EMBED(typeadapter_t, object_t) ; } getkey ; struct { typeadapt_lifetime_EMBED(typeadapter_t, object_t) ; } lifetime
Implements typeadapt_t.typeadapt_DECLARE.
#define typeadapt_DECLARE( typeadapter_t, object_t, key_t ) typedef struct typeadapter_t typeadapter_t ; struct typeadapter_t { typeadapt_EMBED(typeadapter_t, object_t, key_t) ; }
Declares interface (function table) for managing the lifetime of objects.
struct typeadapt_lifetime_it